aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless/reg.c
diff options
context:
space:
mode:
authorLuis R. Rodriguez <mcgrof@do-not-panic.com>2013-11-05 09:18:03 -0800
committerJohannes Berg <johannes.berg@intel.com>2013-11-25 20:51:05 +0100
commitb3eb7f3f592c0a5ae96c0cf53037f1a1d7eb4a85 (patch)
treeb04f0299e1ecb202545e10862f637d653d18b942 /net/wireless/reg.c
parentcfg80211: check regulatory request alpha2 early (diff)
downloadlinux-dev-b3eb7f3f592c0a5ae96c0cf53037f1a1d7eb4a85.tar.xz
linux-dev-b3eb7f3f592c0a5ae96c0cf53037f1a1d7eb4a85.zip
cfg80211: processing core regulatory hints on its own
This makes the code path easier to read for the core case. Signed-off-by: Luis R. Rodriguez <mcgrof@do-not-panic.com> [add warning to default case in switch to avoid compile warning] Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/wireless/reg.c')
-rw-r--r--net/wireless/reg.c46
1 files changed, 44 insertions, 2 deletions
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index d8f047aadd49..2b7ab01b2616 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -1337,7 +1337,7 @@ get_reg_request_treatment(struct wiphy *wiphy,
switch (pending_request->initiator) {
case NL80211_REGDOM_SET_BY_CORE:
- return REG_REQ_OK;
+ return REG_REQ_IGNORE;
case NL80211_REGDOM_SET_BY_COUNTRY_IE:
if (reg_request_cell_base(lr)) {
/* Trust a Cell base station over the AP's country IE */
@@ -1443,6 +1443,33 @@ static void reg_set_request_processed(void)
}
/**
+ * reg_process_hint_core - process core regulatory requests
+ * @pending_request: a pending core regulatory request
+ *
+ * The wireless subsystem can use this function to process
+ * a regulatory request issued by the regulatory core.
+ *
+ * Returns one of the different reg request treatment values.
+ */
+static enum reg_request_treatment
+reg_process_hint_core(struct regulatory_request *core_request)
+{
+ struct regulatory_request *lr;
+
+ lr = get_last_request();
+ if (lr != &core_request_world && lr)
+ kfree_rcu(lr, rcu_head);
+
+ core_request->intersect = false;
+ core_request->processed = false;
+ rcu_assign_pointer(last_request, core_request);
+
+ if (call_crda(core_request->alpha2))
+ return REG_REQ_IGNORE;
+ return REG_REQ_OK;
+}
+
+/**
* __regulatory_hint - hint to the wireless core a regulatory domain
* @wiphy: if the hint comes from country information from an AP, this
* is required to be set to the wiphy that received the information
@@ -1540,6 +1567,7 @@ new_request:
static void reg_process_hint(struct regulatory_request *reg_request)
{
struct wiphy *wiphy = NULL;
+ enum reg_request_treatment treatment;
if (WARN_ON(!reg_request->alpha2))
return;
@@ -1552,7 +1580,21 @@ static void reg_process_hint(struct regulatory_request *reg_request)
return;
}
- switch (__regulatory_hint(wiphy, reg_request)) {
+ switch (reg_request->initiator) {
+ case NL80211_REGDOM_SET_BY_CORE:
+ reg_process_hint_core(reg_request);
+ return;
+ case NL80211_REGDOM_SET_BY_USER:
+ case NL80211_REGDOM_SET_BY_DRIVER:
+ case NL80211_REGDOM_SET_BY_COUNTRY_IE:
+ treatment = __regulatory_hint(wiphy, reg_request);
+ break;
+ default:
+ WARN(1, "invalid initiator %d\n", reg_request->initiator);
+ return;
+ }
+
+ switch (treatment) {
case REG_REQ_ALREADY_SET:
/* This is required so that the orig_* parameters are saved */
if (wiphy && wiphy->flags & WIPHY_FLAG_STRICT_REGULATORY)