diff options
author | Luis R. Rodriguez <mcgrof@do-not-panic.com> | 2013-11-05 12:18:15 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-11-25 14:51:33 -0500 |
commit | 84721d44906f9a4ee8b0d41b31fcc9f45295c3a6 (patch) | |
tree | b03ed15acda8678cc149880007a31a658bbdaa81 | |
parent | 3b9e5aca461ff3c83fb29ff021af19c127efa351 (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.c | 35 |
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 | ||
2202 | static 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 */ |
2203 | static int __set_regdom(const struct ieee80211_regdomain *rd, | 2236 | static 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); |