mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-14 06:35:12 +00:00
nl80211: advertise HT/VHT channel limitations
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>
This commit is contained in:
parent
c7a6ee27ab
commit
50640f1693
3 changed files with 31 additions and 1 deletions
|
@ -2041,6 +2041,16 @@ enum nl80211_band_attr {
|
||||||
* (enum nl80211_dfs_state)
|
* (enum nl80211_dfs_state)
|
||||||
* @NL80211_FREQUENCY_ATTR_DFS_TIME: time in miliseconds for how long
|
* @NL80211_FREQUENCY_ATTR_DFS_TIME: time in miliseconds for how long
|
||||||
* this channel is in this DFS state.
|
* 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
|
* @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number
|
||||||
* currently defined
|
* currently defined
|
||||||
* @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use
|
* @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use
|
||||||
|
@ -2055,6 +2065,10 @@ enum nl80211_frequency_attr {
|
||||||
NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
|
NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
|
||||||
NL80211_FREQUENCY_ATTR_DFS_STATE,
|
NL80211_FREQUENCY_ATTR_DFS_STATE,
|
||||||
NL80211_FREQUENCY_ATTR_DFS_TIME,
|
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 */
|
/* keep last */
|
||||||
__NL80211_FREQUENCY_ATTR_AFTER_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
|
* Note that even for drivers that support this, the default is to add
|
||||||
* stations in authenticated/associated state, so to add unauthenticated
|
* stations in authenticated/associated state, so to add unauthenticated
|
||||||
* stations the authenticated/associated bits have to be set in the mask.
|
* 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 {
|
enum nl80211_feature_flags {
|
||||||
NL80211_FEATURE_SK_TX_STATUS = 1 << 0,
|
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_CTWIN = 1 << 11,
|
||||||
NL80211_FEATURE_P2P_GO_OPPPS = 1 << 12,
|
NL80211_FEATURE_P2P_GO_OPPPS = 1 << 12,
|
||||||
NL80211_FEATURE_FULL_AP_CLIENT_STATE = 1 << 13,
|
NL80211_FEATURE_FULL_AP_CLIENT_STATE = 1 << 13,
|
||||||
|
NL80211_FEATURE_ADVERTISE_CHAN_LIMITS = 1 << 14,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -367,7 +367,8 @@ struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv)
|
||||||
rdev->wiphy.rts_threshold = (u32) -1;
|
rdev->wiphy.rts_threshold = (u32) -1;
|
||||||
rdev->wiphy.coverage_class = 0;
|
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;
|
return &rdev->wiphy;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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))
|
if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME, time))
|
||||||
goto nla_put_failure;
|
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,
|
if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
|
||||||
DBM_TO_MBM(chan->max_power)))
|
DBM_TO_MBM(chan->max_power)))
|
||||||
|
|
Loading…
Reference in a new issue