aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2014-05-05 05:48:40 -0400
committerJohannes Berg <johannes.berg@intel.com>2014-05-13 09:50:06 -0400
commit8c48b50a1a888ac5511fe856d63f72fb688c6bb4 (patch)
tree34e897f3799273001f9e546f5bf356c43b6fbdca /net
parentf6837ba8c98afcf28ec25f6863a8597274aeefd6 (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.c6
-rw-r--r--net/wireless/util.c14
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