diff options
author | Felix Fietkau <nbd@openwrt.org> | 2014-05-05 05:48:40 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2014-05-13 09:50:06 -0400 |
commit | 8c48b50a1a888ac5511fe856d63f72fb688c6bb4 (patch) | |
tree | 34e897f3799273001f9e546f5bf356c43b6fbdca /net | |
parent | f6837ba8c98afcf28ec25f6863a8597274aeefd6 (diff) |
cfg80211: allow restricting supported dfs regions
At the moment, the ath9k/ath10k DFS module only supports detecting ETSI
radar patterns.
Add a bitmap in the interface combinations, indicating which DFS regions
are supported by the detector. If unset, support for all regions is
assumed.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/wireless/nl80211.c | 6 | ||||
-rw-r--r-- | net/wireless/util.c | 14 |
2 files changed, 18 insertions, 2 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 0f1b18f209d6..c0833830cfe7 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -970,8 +970,10 @@ static int nl80211_put_iface_combinations(struct wiphy *wiphy, | |||
970 | c->max_interfaces)) | 970 | c->max_interfaces)) |
971 | goto nla_put_failure; | 971 | goto nla_put_failure; |
972 | if (large && | 972 | if (large && |
973 | nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS, | 973 | (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS, |
974 | c->radar_detect_widths)) | 974 | c->radar_detect_widths) || |
975 | nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS, | ||
976 | c->radar_detect_regions))) | ||
975 | goto nla_put_failure; | 977 | goto nla_put_failure; |
976 | 978 | ||
977 | nla_nest_end(msg, nl_combi); | 979 | nla_nest_end(msg, nl_combi); |
diff --git a/net/wireless/util.c b/net/wireless/util.c index a756429b3a0a..8c61d5c6fad3 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c | |||
@@ -1274,10 +1274,20 @@ int cfg80211_iter_combinations(struct wiphy *wiphy, | |||
1274 | void *data), | 1274 | void *data), |
1275 | void *data) | 1275 | void *data) |
1276 | { | 1276 | { |
1277 | const struct ieee80211_regdomain *regdom; | ||
1278 | enum nl80211_dfs_regions region = 0; | ||
1277 | int i, j, iftype; | 1279 | int i, j, iftype; |
1278 | int num_interfaces = 0; | 1280 | int num_interfaces = 0; |
1279 | u32 used_iftypes = 0; | 1281 | u32 used_iftypes = 0; |
1280 | 1282 | ||
1283 | if (radar_detect) { | ||
1284 | rcu_read_lock(); | ||
1285 | regdom = rcu_dereference(cfg80211_regdomain); | ||
1286 | if (regdom) | ||
1287 | region = regdom->dfs_region; | ||
1288 | rcu_read_unlock(); | ||
1289 | } | ||
1290 | |||
1281 | for (iftype = 0; iftype < NUM_NL80211_IFTYPES; iftype++) { | 1291 | for (iftype = 0; iftype < NUM_NL80211_IFTYPES; iftype++) { |
1282 | num_interfaces += iftype_num[iftype]; | 1292 | num_interfaces += iftype_num[iftype]; |
1283 | if (iftype_num[iftype] > 0 && | 1293 | if (iftype_num[iftype] > 0 && |
@@ -1318,6 +1328,10 @@ int cfg80211_iter_combinations(struct wiphy *wiphy, | |||
1318 | if (radar_detect != (c->radar_detect_widths & radar_detect)) | 1328 | if (radar_detect != (c->radar_detect_widths & radar_detect)) |
1319 | goto cont; | 1329 | goto cont; |
1320 | 1330 | ||
1331 | if (radar_detect && c->radar_detect_regions && | ||
1332 | !(c->radar_detect_regions & BIT(region))) | ||
1333 | goto cont; | ||
1334 | |||
1321 | /* Finally check that all iftypes that we're currently | 1335 | /* Finally check that all iftypes that we're currently |
1322 | * using are actually part of this combination. If they | 1336 | * using are actually part of this combination. If they |
1323 | * aren't then we can't use this combination and have | 1337 | * aren't then we can't use this combination and have |