[802.11] Add status-printing callback
authorJoshua Oreman <oremanj@xenon.get-linux.org>
Tue, 16 Jun 2009 07:21:03 +0000 (00:21 -0700)
committerJoshua Oreman <oremanj@xenon.get-linux.org>
Tue, 16 Jun 2009 07:21:03 +0000 (00:21 -0700)
src/include/gpxe/net80211.h
src/net/net80211.c

index 78a9386..5afcf14 100644 (file)
@@ -743,6 +743,9 @@ struct net80211_device
         */
        int phy_flags;
 
+       /** Signal strength of last received packet */
+       int last_signal;
+
        /** Fragment reassembly state */
        struct net80211_frag_cache frags[NET80211_NR_CONCURRENT_FRAGS];
 
index d9d1dd3..7736063 100644 (file)
@@ -128,6 +128,7 @@ static int net80211_process_ie ( struct net80211_device *dev,
 static struct ieee80211_ie *
 net80211_marshal_request_info ( struct net80211_device *dev,
                                struct ieee80211_ie *ie );
+static void net80211_print_status ( struct net_device *netdev );
 
 static void net80211_step_associate ( struct process *proc );
 static void net80211_set_rtscts_rate ( struct net80211_device *dev );
@@ -658,6 +659,7 @@ struct net80211_device * net80211_alloc ( size_t priv_size )
 
        netdev->ll_protocol = &net80211_ll_protocol;
        netdev->max_pkt_len = IEEE80211_MAX_DATA_LEN;
+       netdev->print_status = net80211_print_status;
        netdev_init ( netdev, &net80211_netdev_ops );
 
        dev = netdev->priv;
@@ -1048,6 +1050,40 @@ net80211_marshal_request_info ( struct net80211_device *dev,
        return ie;
 }
 
+/** Format strings for signal strength types */
+static const char *net80211_signal_strings[] = {
+       [NET80211_SIGNAL_NONE] = "unk",
+       [NET80211_SIGNAL_ARBITRARY] = "%d/%d",
+       [NET80211_SIGNAL_DB] = "%d/%d dB",
+       [NET80211_SIGNAL_DBM] = "%d dBm",
+};
+
+/**
+ * Print status of 802.11 device
+ *
+ * @v dev      Wrapping network device
+ *
+ * Prints a line like
+ *   [802.11 SSID gPXEtest, Ch:1 Sig:14/50, Rate:11 MBps]
+ */
+void net80211_print_status ( struct net_device *netdev )
+{
+       struct net80211_device *dev = netdev->priv;
+
+       printf ( "  [802.11 SSID %s, ", dev->state & NET80211_ASSOCIATED ?
+                dev->essid : "<not associated>" );
+       if ( dev->channel < dev->nr_channels && dev->rate < dev->nr_rates ) {
+               printf ( "Ch:%d Sig:",
+                        dev->channels[dev->channel].channel_nr );
+               printf ( net80211_signal_strings[dev->hw->signal_type],
+                        dev->last_signal, dev->hw->signal_max );
+               printf ( ", Rate:%d Mbps]\n",
+                        NET80211_RATE_VALUE ( dev->rates[dev->rate] ) / 10 );
+       } else {
+               printf ( "antenna off]\n" );
+       }
+}
+
 /** Seconds to always take when probing, to gather better signal strengths */
 #define NET80211_PROBE_GATHER    2