aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuis R. Rodriguez <mcgrof@do-not-panic.com>2013-11-05 12:18:15 -0500
committerJohannes Berg <johannes.berg@intel.com>2013-11-25 14:51:33 -0500
commit84721d44906f9a4ee8b0d41b31fcc9f45295c3a6 (patch)
treeb03ed15acda8678cc149880007a31a658bbdaa81
parent3b9e5aca461ff3c83fb29ff021af19c127efa351 (diff)
cfg80211: set user regulatory updates on its own
This splits out the user regulatory update on its own, this helps simplify reading the case. Signed-off-by: Luis R. Rodriguez <mcgrof@do-not-panic.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--net/wireless/reg.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index 9f4f8439e16a..1f6abba60274 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -2199,6 +2199,39 @@ static int reg_set_rd_core(const struct ieee80211_regdomain *rd)
2199 return 0; 2199 return 0;
2200} 2200}
2201 2201
2202static int reg_set_rd_user(const struct ieee80211_regdomain *rd,
2203 struct regulatory_request *user_request)
2204{
2205 const struct ieee80211_regdomain *intersected_rd = NULL;
2206
2207 if (is_world_regdom(rd->alpha2))
2208 return -EINVAL;
2209
2210 if (!regdom_changes(rd->alpha2))
2211 return -EALREADY;
2212
2213 if (!is_valid_rd(rd)) {
2214 pr_err("Invalid regulatory domain detected:\n");
2215 print_regdomain_info(rd);
2216 return -EINVAL;
2217 }
2218
2219 if (!user_request->intersect) {
2220 reset_regdomains(false, rd);
2221 return 0;
2222 }
2223
2224 intersected_rd = regdom_intersect(rd, get_cfg80211_regdom());
2225 if (!intersected_rd)
2226 return -EINVAL;
2227
2228 kfree(rd);
2229 rd = NULL;
2230 reset_regdomains(false, intersected_rd);
2231
2232 return 0;
2233}
2234
2202/* Takes ownership of rd only if it doesn't fail */ 2235/* Takes ownership of rd only if it doesn't fail */
2203static int __set_regdom(const struct ieee80211_regdomain *rd, 2236static int __set_regdom(const struct ieee80211_regdomain *rd,
2204 struct regulatory_request *lr) 2237 struct regulatory_request *lr)
@@ -2329,6 +2362,8 @@ int set_regdom(const struct ieee80211_regdomain *rd)
2329 r = reg_set_rd_core(rd); 2362 r = reg_set_rd_core(rd);
2330 break; 2363 break;
2331 case NL80211_REGDOM_SET_BY_USER: 2364 case NL80211_REGDOM_SET_BY_USER:
2365 r = reg_set_rd_user(rd, lr);
2366 break;
2332 case NL80211_REGDOM_SET_BY_DRIVER: 2367 case NL80211_REGDOM_SET_BY_DRIVER:
2333 case NL80211_REGDOM_SET_BY_COUNTRY_IE: 2368 case NL80211_REGDOM_SET_BY_COUNTRY_IE:
2334 r = __set_regdom(rd, lr); 2369 r = __set_regdom(rd, lr);