diff options
-rw-r--r-- | include/net/cfg80211.h | 6 | ||||
-rw-r--r-- | include/uapi/linux/nl80211.h | 6 | ||||
-rw-r--r-- | net/wireless/chan.c | 2 | ||||
-rw-r--r-- | net/wireless/nl80211.c | 13 |
4 files changed, 27 insertions, 0 deletions
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 3dd2cb465540..c98cf08538b9 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
@@ -111,6 +111,10 @@ enum ieee80211_band { | |||
111 | * restrictions. | 111 | * restrictions. |
112 | * @IEEE80211_CHAN_INDOOR_ONLY: see %NL80211_FREQUENCY_ATTR_INDOOR_ONLY | 112 | * @IEEE80211_CHAN_INDOOR_ONLY: see %NL80211_FREQUENCY_ATTR_INDOOR_ONLY |
113 | * @IEEE80211_CHAN_GO_CONCURRENT: see %NL80211_FREQUENCY_ATTR_GO_CONCURRENT | 113 | * @IEEE80211_CHAN_GO_CONCURRENT: see %NL80211_FREQUENCY_ATTR_GO_CONCURRENT |
114 | * @IEEE80211_CHAN_NO_20MHZ: 20 MHz bandwidth is not permitted | ||
115 | * on this channel. | ||
116 | * @IEEE80211_CHAN_NO_10MHZ: 10 MHz bandwidth is not permitted | ||
117 | * on this channel. | ||
114 | * | 118 | * |
115 | */ | 119 | */ |
116 | enum ieee80211_channel_flags { | 120 | enum ieee80211_channel_flags { |
@@ -125,6 +129,8 @@ enum ieee80211_channel_flags { | |||
125 | IEEE80211_CHAN_NO_160MHZ = 1<<8, | 129 | IEEE80211_CHAN_NO_160MHZ = 1<<8, |
126 | IEEE80211_CHAN_INDOOR_ONLY = 1<<9, | 130 | IEEE80211_CHAN_INDOOR_ONLY = 1<<9, |
127 | IEEE80211_CHAN_GO_CONCURRENT = 1<<10, | 131 | IEEE80211_CHAN_GO_CONCURRENT = 1<<10, |
132 | IEEE80211_CHAN_NO_20MHZ = 1<<11, | ||
133 | IEEE80211_CHAN_NO_10MHZ = 1<<12, | ||
128 | }; | 134 | }; |
129 | 135 | ||
130 | #define IEEE80211_CHAN_NO_HT40 \ | 136 | #define IEEE80211_CHAN_NO_HT40 \ |
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index 513bfd7b2e5f..0592032ff160 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h | |||
@@ -2358,6 +2358,10 @@ enum nl80211_band_attr { | |||
2358 | * connected to an AP with DFS and radar detection on the UNII band (it is | 2358 | * connected to an AP with DFS and radar detection on the UNII band (it is |
2359 | * up to user-space, i.e., wpa_supplicant to perform the required | 2359 | * up to user-space, i.e., wpa_supplicant to perform the required |
2360 | * verifications) | 2360 | * verifications) |
2361 | * @NL80211_FREQUENCY_ATTR_NO_20MHZ: 20 MHz operation is not allowed | ||
2362 | * on this channel in current regulatory domain. | ||
2363 | * @NL80211_FREQUENCY_ATTR_NO_10MHZ: 10 MHz operation is not allowed | ||
2364 | * on this channel in current regulatory domain. | ||
2361 | * @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number | 2365 | * @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number |
2362 | * currently defined | 2366 | * currently defined |
2363 | * @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use | 2367 | * @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use |
@@ -2384,6 +2388,8 @@ enum nl80211_frequency_attr { | |||
2384 | NL80211_FREQUENCY_ATTR_DFS_CAC_TIME, | 2388 | NL80211_FREQUENCY_ATTR_DFS_CAC_TIME, |
2385 | NL80211_FREQUENCY_ATTR_INDOOR_ONLY, | 2389 | NL80211_FREQUENCY_ATTR_INDOOR_ONLY, |
2386 | NL80211_FREQUENCY_ATTR_GO_CONCURRENT, | 2390 | NL80211_FREQUENCY_ATTR_GO_CONCURRENT, |
2391 | NL80211_FREQUENCY_ATTR_NO_20MHZ, | ||
2392 | NL80211_FREQUENCY_ATTR_NO_10MHZ, | ||
2387 | 2393 | ||
2388 | /* keep last */ | 2394 | /* keep last */ |
2389 | __NL80211_FREQUENCY_ATTR_AFTER_LAST, | 2395 | __NL80211_FREQUENCY_ATTR_AFTER_LAST, |
diff --git a/net/wireless/chan.c b/net/wireless/chan.c index 2adf7b2eccbc..84d686e2dbd0 100644 --- a/net/wireless/chan.c +++ b/net/wireless/chan.c | |||
@@ -616,12 +616,14 @@ bool cfg80211_chandef_usable(struct wiphy *wiphy, | |||
616 | width = 5; | 616 | width = 5; |
617 | break; | 617 | break; |
618 | case NL80211_CHAN_WIDTH_10: | 618 | case NL80211_CHAN_WIDTH_10: |
619 | prohibited_flags |= IEEE80211_CHAN_NO_10MHZ; | ||
619 | width = 10; | 620 | width = 10; |
620 | break; | 621 | break; |
621 | case NL80211_CHAN_WIDTH_20: | 622 | case NL80211_CHAN_WIDTH_20: |
622 | if (!ht_cap->ht_supported) | 623 | if (!ht_cap->ht_supported) |
623 | return false; | 624 | return false; |
624 | case NL80211_CHAN_WIDTH_20_NOHT: | 625 | case NL80211_CHAN_WIDTH_20_NOHT: |
626 | prohibited_flags |= IEEE80211_CHAN_NO_20MHZ; | ||
625 | width = 20; | 627 | width = 20; |
626 | break; | 628 | break; |
627 | case NL80211_CHAN_WIDTH_40: | 629 | case NL80211_CHAN_WIDTH_40: |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index fce423a4e96a..ca75f60041d2 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -567,6 +567,13 @@ static int nl80211_msg_put_channel(struct sk_buff *msg, | |||
567 | struct ieee80211_channel *chan, | 567 | struct ieee80211_channel *chan, |
568 | bool large) | 568 | bool large) |
569 | { | 569 | { |
570 | /* Some channels must be completely excluded from the | ||
571 | * list to protect old user-space tools from breaking | ||
572 | */ | ||
573 | if (!large && chan->flags & | ||
574 | (IEEE80211_CHAN_NO_10MHZ | IEEE80211_CHAN_NO_20MHZ)) | ||
575 | return 0; | ||
576 | |||
570 | if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ, | 577 | if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ, |
571 | chan->center_freq)) | 578 | chan->center_freq)) |
572 | goto nla_put_failure; | 579 | goto nla_put_failure; |
@@ -620,6 +627,12 @@ static int nl80211_msg_put_channel(struct sk_buff *msg, | |||
620 | if ((chan->flags & IEEE80211_CHAN_GO_CONCURRENT) && | 627 | if ((chan->flags & IEEE80211_CHAN_GO_CONCURRENT) && |
621 | nla_put_flag(msg, NL80211_FREQUENCY_ATTR_GO_CONCURRENT)) | 628 | nla_put_flag(msg, NL80211_FREQUENCY_ATTR_GO_CONCURRENT)) |
622 | goto nla_put_failure; | 629 | goto nla_put_failure; |
630 | if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) && | ||
631 | nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_20MHZ)) | ||
632 | goto nla_put_failure; | ||
633 | if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) && | ||
634 | nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_10MHZ)) | ||
635 | goto nla_put_failure; | ||
623 | } | 636 | } |
624 | 637 | ||
625 | if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER, | 638 | if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER, |