nl80211: advertise HT/VHT channel limitations
authorJohannes Berg <johannes.berg@intel.com>
Wed, 12 Dec 2012 16:59:39 +0000 (17:59 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 15 Feb 2013 08:41:38 +0000 (09:41 +0100)
When drivers or regulatory have limitations on
40, 80 or 160 MHz channels, advertise these to
userspace via nl80211. Also add a new feature
flag to let userspace know this is supported.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/uapi/linux/nl80211.h
net/wireless/core.c
net/wireless/nl80211.c

index 90b7af86f392f8838739a6787d611111d620d71e..3880f6ad7ed1044b004c43e1733ccd3242261d4f 100644 (file)
@@ -2041,6 +2041,16 @@ enum nl80211_band_attr {
  *     (enum nl80211_dfs_state)
  * @NL80211_FREQUENCY_ATTR_DFS_TIME: time in miliseconds for how long
  *     this channel is in this DFS state.
+ * @NL80211_FREQUENCY_ATTR_NO_HT40_MINUS: HT40- isn't possible with this
+ *     channel as the control channel
+ * @NL80211_FREQUENCY_ATTR_NO_HT40_PLUS: HT40+ isn't possible with this
+ *     channel as the control channel
+ * @NL80211_FREQUENCY_ATTR_NO_80MHZ: any 80 MHz channel using this channel
+ *     as the primary or any of the secondary channels isn't possible,
+ *     this includes 80+80 channels
+ * @NL80211_FREQUENCY_ATTR_NO_160MHZ: any 160 MHz (but not 80+80) channel
+ *     using this channel as the primary or any of the secondary channels
+ *     isn't possible
  * @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number
  *     currently defined
  * @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use
@@ -2055,6 +2065,10 @@ enum nl80211_frequency_attr {
        NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
        NL80211_FREQUENCY_ATTR_DFS_STATE,
        NL80211_FREQUENCY_ATTR_DFS_TIME,
+       NL80211_FREQUENCY_ATTR_NO_HT40_MINUS,
+       NL80211_FREQUENCY_ATTR_NO_HT40_PLUS,
+       NL80211_FREQUENCY_ATTR_NO_80MHZ,
+       NL80211_FREQUENCY_ATTR_NO_160MHZ,
 
        /* keep last */
        __NL80211_FREQUENCY_ATTR_AFTER_LAST,
@@ -3421,6 +3435,8 @@ enum nl80211_ap_sme_features {
  *     Note that even for drivers that support this, the default is to add
  *     stations in authenticated/associated state, so to add unauthenticated
  *     stations the authenticated/associated bits have to be set in the mask.
+ * @NL80211_FEATURE_ADVERTISE_CHAN_LIMITS: cfg80211 advertises channel limits
+ *     (HT40, VHT 80/160 MHz) if this flag is set
  */
 enum nl80211_feature_flags {
        NL80211_FEATURE_SK_TX_STATUS                    = 1 << 0,
@@ -3437,6 +3453,7 @@ enum nl80211_feature_flags {
        NL80211_FEATURE_P2P_GO_CTWIN                    = 1 << 11,
        NL80211_FEATURE_P2P_GO_OPPPS                    = 1 << 12,
        NL80211_FEATURE_FULL_AP_CLIENT_STATE            = 1 << 13,
+       NL80211_FEATURE_ADVERTISE_CHAN_LIMITS           = 1 << 14,
 };
 
 /**
index 9220021050624d681f0fa9b842b73d07ccebcff9..33b75b9b8efa5c635d5927c571f56a157bc36782 100644 (file)
@@ -367,7 +367,8 @@ struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv)
        rdev->wiphy.rts_threshold = (u32) -1;
        rdev->wiphy.coverage_class = 0;
 
-       rdev->wiphy.features = NL80211_FEATURE_SCAN_FLUSH;
+       rdev->wiphy.features = NL80211_FEATURE_SCAN_FLUSH |
+                              NL80211_FEATURE_ADVERTISE_CHAN_LIMITS;
 
        return &rdev->wiphy;
 }
index c1e18ccf404961cef0a38be40b2da24c0a0db3f5..7e40b9e82b45b0b2470a3398b29e1c10b9b8881f 100644 (file)
@@ -562,6 +562,18 @@ static int nl80211_msg_put_channel(struct sk_buff *msg,
                if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME, time))
                        goto nla_put_failure;
        }
+       if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) &&
+           nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS))
+               goto nla_put_failure;
+       if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) &&
+           nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS))
+               goto nla_put_failure;
+       if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) &&
+           nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ))
+               goto nla_put_failure;
+       if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) &&
+           nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ))
+               goto nla_put_failure;
 
        if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
                        DBM_TO_MBM(chan->max_power)))