提交 95908535 编写于 作者: K Kalle Valo 提交者: Johannes Berg

cfg80211: fix set_regdom() to cancel requests with same alpha2

While adding regulatory support to ath6kl I noticed that I easily
got the regulatory code confused. The way to reproduce the bug was:

1. iw reg set FI (in userspace)
2. cfg80211 calls ath6kl_reg_notify(FI)
3. ath6kl sets regdomain in firmware
4. firmware sends regdomain event to notify about the new regdomain (FI)
5. ath6kl calls regulatory_hint(FI)

And this (from FI to FI transition) confuses cfg80211 and after that I
only get "Pending regulatory request, waiting for it to be
processed...." messages and regdomain changes won't work anymore.

The reason why ath6kl calls regulatory_hint() is that firmware can change
the regulatory domain by it's own, for example due to 11d IEs. I could
of course workaround this in ath6kl but I think it's better to handle
the case in cfg80211.

The fix is pretty simple, use a different error code if the regdomain is
same and then just set the request processed so that it doesn't block new
requests.
Signed-off-by: NKalle Valo <kvalo@qca.qualcomm.com>
Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
上级 84f10708
...@@ -2128,7 +2128,7 @@ static int __set_regdom(const struct ieee80211_regdomain *rd) ...@@ -2128,7 +2128,7 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
* checking if the alpha2 changes if CRDA was already called * checking if the alpha2 changes if CRDA was already called
*/ */
if (!regdom_changes(rd->alpha2)) if (!regdom_changes(rd->alpha2))
return -EINVAL; return -EALREADY;
} }
/* /*
...@@ -2248,6 +2248,9 @@ int set_regdom(const struct ieee80211_regdomain *rd) ...@@ -2248,6 +2248,9 @@ int set_regdom(const struct ieee80211_regdomain *rd)
/* Note that this doesn't update the wiphys, this is done below */ /* Note that this doesn't update the wiphys, this is done below */
r = __set_regdom(rd); r = __set_regdom(rd);
if (r) { if (r) {
if (r == -EALREADY)
reg_set_request_processed();
kfree(rd); kfree(rd);
mutex_unlock(&reg_mutex); mutex_unlock(&reg_mutex);
return r; return r;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册