mac80211: add spectrum capabilities
authorTomas Winkler <tomas.winkler@intel.com>
Wed, 18 Jun 2008 14:53:44 +0000 (17:53 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 30 Jun 2008 21:37:34 +0000 (17:37 -0400)
This patch add spectrum capability and required information
elements to association request providing AP has requested it and
it is supported by the driver

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Assaf Krauss <assaf.krauss@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/net/mac80211.h
net/mac80211/mlme.c

index 02c79e6b309e69e007ce57859cde1a51432e1830..a7044958c75f8d95478258cd6297f28bde657ddb 100644 (file)
@@ -710,6 +710,10 @@ enum ieee80211_tkip_key_type {
  * @IEEE80211_HW_NOISE_DBM:
  *     Hardware can provide noise (radio interference) values in units dBm,
  *      decibel difference from one milliwatt.
+ *
+ * @IEEE80211_HW_SPECTRUM_MGMT:
+ *     Hardware supports spectrum management defined in 802.11h
+ *     Measurement, Channel Switch, Quieting, TPC
  */
 enum ieee80211_hw_flags {
        IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE           = 1<<0,
@@ -721,6 +725,7 @@ enum ieee80211_hw_flags {
        IEEE80211_HW_SIGNAL_DB                          = 1<<6,
        IEEE80211_HW_SIGNAL_DBM                         = 1<<7,
        IEEE80211_HW_NOISE_DBM                          = 1<<8,
+       IEEE80211_HW_SPECTRUM_MGMT                      = 1<<9,
 };
 
 /**
index 7b4d4d46843b4eebaa9bd98af6a8f363d88620bf..c9f7c13d2e7ec2286aa5898a20ff57b4a89a4068 100644 (file)
@@ -747,6 +747,10 @@ static void ieee80211_send_assoc(struct net_device *dev,
                 * b-only mode) */
                rates_len = ieee80211_compatible_rates(bss, sband, &rates);
 
+               if ((bss->capability & WLAN_CAPABILITY_SPECTRUM_MGMT) &&
+                   (local->hw.flags & IEEE80211_HW_SPECTRUM_MGMT))
+                       capab |= WLAN_CAPABILITY_SPECTRUM_MGMT;
+
                ieee80211_rx_bss_put(dev, bss);
        } else {
                rates = ~0;
@@ -814,6 +818,26 @@ static void ieee80211_send_assoc(struct net_device *dev,
                }
        }
 
+       if (capab & WLAN_CAPABILITY_SPECTRUM_MGMT) {
+               /* 1. power capabilities */
+               pos = skb_put(skb, 4);
+               *pos++ = WLAN_EID_PWR_CAPABILITY;
+               *pos++ = 2;
+               *pos++ = 0; /* min tx power */
+               *pos++ = local->hw.conf.channel->max_power; /* max tx power */
+
+               /* 2. supported channels */
+               /* TODO: get this in reg domain format */
+               pos = skb_put(skb, 2 * sband->n_channels + 2);
+               *pos++ = WLAN_EID_SUPPORTED_CHANNELS;
+               *pos++ = 2 * sband->n_channels;
+               for (i = 0; i < sband->n_channels; i++) {
+                       *pos++ = ieee80211_frequency_to_channel(
+                                       sband->channels[i].center_freq);
+                       *pos++ = 1; /* one channel in the subband*/
+               }
+       }
+
        if (ifsta->extra_ie) {
                pos = skb_put(skb, ifsta->extra_ie_len);
                memcpy(pos, ifsta->extra_ie, ifsta->extra_ie_len);