Thread (10 messages) 10 messages, 5 authors, 2021-11-30
STALE1665d

[PATCH v2] nl80211: reset regdom when reloading regdb

From: Finn Behrens <hidden>
Date: 2020-11-26 10:40:08
Subsystem: 802.11 (including cfg80211/nl80211), networking [general], the rest · Maintainers: Johannes Berg, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds

reset the regdom when NL80211_CMD_RELOAD_REGDB is send

Signed-off-by: Finn Behrens <redacted>
---
resend, as patchwork showed it malformed.

 include/net/regulatory.h |  1 +
 net/wireless/reg.c       | 31 +++++++++++++++++++++++++++++--
 2 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/include/net/regulatory.h b/include/net/regulatory.h
index 47f06f6f5a67..0cf9335431e0 100644
--- a/include/net/regulatory.h
+++ b/include/net/regulatory.h
@@ -83,6 +83,7 @@ struct regulatory_request {
 	enum nl80211_dfs_regions dfs_region;
 	bool intersect;
 	bool processed;
+	bool reload;
 	enum environment_cap country_ie_env;
 	struct list_head list;
 };
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index a04fdfb35f07..50314916b020 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -199,6 +199,7 @@ static struct regulatory_request *get_last_request(void)
 /* Used to queue up regulatory hints */
 static LIST_HEAD(reg_requests_list);
 static spinlock_t reg_requests_lock;
+static void queue_regulatory_request(struct regulatory_request *request);
 
 /* Used to queue up beacon hints for review */
 static LIST_HEAD(reg_pending_beacons);
@@ -1081,10 +1082,13 @@ int reg_reload_regdb(void)
 	int err;
 
 	err = request_firmware(&fw, "regulatory.db", &reg_pdev->dev);
-	if (err)
+	if (err) {
+		pr_info("failed to load regulatory.db\n");
 		return err;
+	}
 
 	if (!valid_regdb(fw->data, fw->size)) {
+		pr_info("loaded regulatory.db is malformed or signature is missing/invalid\n");
 		err = -ENODATA;
 		goto out;
 	}
@@ -1101,6 +1105,28 @@ int reg_reload_regdb(void)
 	regdb = db;
 	rtnl_unlock();
 
+	// reset regulatory
+	const struct ieee80211_regdomain *current_regdomain = NULL;
+
+	current_regdomain = get_cfg80211_regdom();
+
+	struct regulatory_request *request = NULL;
+
+	request = kzalloc(sizeof(*request), GFP_KERNEL);
+	if (!request) {
+		err = -ENOMEM;
+		goto out;
+	}
+
+	request->wiphy_idx = WIPHY_IDX_INVALID;
+	request->alpha2[0] = current_regdomain->alpha2[0];
+	request->alpha2[1] = current_regdomain->alpha2[1];
+	request->initiator = NL80211_USER_REG_HINT_USER;
+	request->user_reg_hint_type = NL80211_USER_REG_HINT_USER;
+	request->reload = true;
+
+	queue_regulatory_request(request);
+
  out:
 	release_firmware(fw);
 	return err;
@@ -2657,7 +2683,8 @@ reg_process_hint_user(struct regulatory_request *user_request)
 
 	treatment = __reg_process_hint_user(user_request);
 	if (treatment == REG_REQ_IGNORE ||
-	    treatment == REG_REQ_ALREADY_SET)
+	    treatment == REG_REQ_ALREADY_SET &&
+			!user_request->reload)
 		return REG_REQ_IGNORE;
 
 	user_request->intersect = treatment == REG_REQ_INTERSECT;
-- 
2.29.2
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help