mac80211: (selectively) add HT details in radiotap
authorJohannes Berg <johannes.berg@intel.com>
Thu, 10 May 2012 07:09:10 +0000 (09:09 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 16 May 2012 16:46:38 +0000 (12:46 -0400)
Add a flag for the HT format (mixed vs. greenfield)
to allow drivers to report that on receive. Not all
drivers will do that though, so allow drivers to set
which radiotap MCS details they report.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/net/mac80211.h
net/mac80211/main.c
net/mac80211/rx.c

index 60e3766d37396b2cfd265e3bfb1013037ccf17de..1937c7d98304fc0ecfd6d7315c9e3cbb9e93a557 100644 (file)
@@ -667,6 +667,9 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info)
  * @RX_FLAG_SHORT_GI: Short guard interval was used
  * @RX_FLAG_NO_SIGNAL_VAL: The signal strength value is not present.
  *     Valid only for data frames (mainly A-MPDU)
+ * @RX_FLAG_HT_GF: This frame was received in a HT-greenfield transmission, if
+ *     the driver fills this value it should add %IEEE80211_RADIOTAP_MCS_HAVE_FMT
+ *     to hw.radiotap_mcs_details to advertise that fact
  */
 enum mac80211_rx_flags {
        RX_FLAG_MMIC_ERROR      = 1<<0,
@@ -681,6 +684,7 @@ enum mac80211_rx_flags {
        RX_FLAG_40MHZ           = 1<<10,
        RX_FLAG_SHORT_GI        = 1<<11,
        RX_FLAG_NO_SIGNAL_VAL   = 1<<12,
+       RX_FLAG_HT_GF           = 1<<13,
 };
 
 /**
@@ -1288,6 +1292,11 @@ enum ieee80211_hw_flags {
  *
  * @offchannel_tx_hw_queue: HW queue ID to use for offchannel TX
  *     (if %IEEE80211_HW_QUEUE_CONTROL is set)
+ *
+ * @radiotap_mcs_details: lists which MCS information can the HW
+ *     reports, by default it is set to _MCS, _GI and _BW but doesn't
+ *     include _FMT. Use %IEEE80211_RADIOTAP_MCS_HAVE_* values, only
+ *     adding _BW is supported today.
  */
 struct ieee80211_hw {
        struct ieee80211_conf conf;
@@ -1309,6 +1318,7 @@ struct ieee80211_hw {
        u8 max_rx_aggregation_subframes;
        u8 max_tx_aggregation_subframes;
        u8 offchannel_tx_hw_queue;
+       u8 radiotap_mcs_details;
 };
 
 /**
index b70f7f09da6128c7594604bba4b9cc9c089119d5..f5548e953259e6f517ed19a77286e8d7e0e1e531 100644 (file)
@@ -596,6 +596,9 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
        local->hw.offchannel_tx_hw_queue = IEEE80211_INVAL_HW_QUEUE;
        local->hw.conf.long_frame_max_tx_count = wiphy->retry_long;
        local->hw.conf.short_frame_max_tx_count = wiphy->retry_short;
+       local->hw.radiotap_mcs_details = IEEE80211_RADIOTAP_MCS_HAVE_MCS |
+                                        IEEE80211_RADIOTAP_MCS_HAVE_GI |
+                                        IEEE80211_RADIOTAP_MCS_HAVE_BW;
        local->user_power_level = -1;
        wiphy->ht_capa_mod_mask = &mac80211_ht_capa_mod_mask;
 
index d5ac02fe37fff0e21be02996a0d7a9a2c7ee0660..489093b08a4aab010764152e666286f2254ee1bf 100644 (file)
@@ -204,14 +204,14 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local,
 
        if (status->flag & RX_FLAG_HT) {
                rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_MCS);
-               *pos++ = IEEE80211_RADIOTAP_MCS_HAVE_MCS |
-                        IEEE80211_RADIOTAP_MCS_HAVE_GI |
-                        IEEE80211_RADIOTAP_MCS_HAVE_BW;
+               *pos++ = local->hw.radiotap_mcs_details;
                *pos = 0;
                if (status->flag & RX_FLAG_SHORT_GI)
                        *pos |= IEEE80211_RADIOTAP_MCS_SGI;
                if (status->flag & RX_FLAG_40MHZ)
                        *pos |= IEEE80211_RADIOTAP_MCS_BW_40;
+               if (status->flag & RX_FLAG_HT_GF)
+                       *pos |= IEEE80211_RADIOTAP_MCS_FMT_GF;
                pos++;
                *pos++ = status->rate_idx;
        }