Loading net/wireless/reg.c +13 −3 Original line number Diff line number Diff line Loading @@ -419,6 +419,11 @@ static bool is_user_regdom_saved(void) return true; } static bool is_cfg80211_regdom_intersected(void) { return is_intersected_alpha2(get_cfg80211_regdom()->alpha2); } static const struct ieee80211_regdomain * reg_copy_regd(const struct ieee80211_regdomain *src_regd) { Loading Loading @@ -1875,9 +1880,14 @@ __reg_process_hint_user(struct regulatory_request *user_request) */ if ((lr->initiator == NL80211_REGDOM_SET_BY_CORE || lr->initiator == NL80211_REGDOM_SET_BY_DRIVER || lr->initiator == NL80211_REGDOM_SET_BY_USER) && regdom_changes(lr->alpha2)) lr->initiator == NL80211_REGDOM_SET_BY_USER)) { if (lr->intersect) { if (!is_cfg80211_regdom_intersected()) return REG_REQ_IGNORE; } else if (regdom_changes(lr->alpha2)) { return REG_REQ_IGNORE; } } if (!regdom_changes(user_request->alpha2)) return REG_REQ_ALREADY_SET; Loading net/wireless/sme.c +25 −1 Original line number Diff line number Diff line Loading @@ -51,6 +51,29 @@ struct cfg80211_conn { bool auto_auth, prev_bssid_valid; }; static bool cfg80211_is_all_countryie_ignore(void) { struct cfg80211_registered_device *rdev; struct wireless_dev *wdev; bool is_all_countryie_ignore = true; list_for_each_entry(rdev, &cfg80211_rdev_list, list) { list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { wdev_lock(wdev); if (!(wdev->wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_IGNORE)) { is_all_countryie_ignore = false; wdev_unlock(wdev); goto out; } wdev_unlock(wdev); } } out: return is_all_countryie_ignore; } static void cfg80211_sme_free(struct wireless_dev *wdev) { if (!wdev->conn) Loading Loading @@ -658,7 +681,8 @@ static bool cfg80211_is_all_idle(void) static void disconnect_work(struct work_struct *work) { rtnl_lock(); if (cfg80211_is_all_idle()) if (cfg80211_is_all_idle() && !cfg80211_is_all_countryie_ignore()) regulatory_hint_disconnect(); rtnl_unlock(); } Loading Loading
net/wireless/reg.c +13 −3 Original line number Diff line number Diff line Loading @@ -419,6 +419,11 @@ static bool is_user_regdom_saved(void) return true; } static bool is_cfg80211_regdom_intersected(void) { return is_intersected_alpha2(get_cfg80211_regdom()->alpha2); } static const struct ieee80211_regdomain * reg_copy_regd(const struct ieee80211_regdomain *src_regd) { Loading Loading @@ -1875,9 +1880,14 @@ __reg_process_hint_user(struct regulatory_request *user_request) */ if ((lr->initiator == NL80211_REGDOM_SET_BY_CORE || lr->initiator == NL80211_REGDOM_SET_BY_DRIVER || lr->initiator == NL80211_REGDOM_SET_BY_USER) && regdom_changes(lr->alpha2)) lr->initiator == NL80211_REGDOM_SET_BY_USER)) { if (lr->intersect) { if (!is_cfg80211_regdom_intersected()) return REG_REQ_IGNORE; } else if (regdom_changes(lr->alpha2)) { return REG_REQ_IGNORE; } } if (!regdom_changes(user_request->alpha2)) return REG_REQ_ALREADY_SET; Loading
net/wireless/sme.c +25 −1 Original line number Diff line number Diff line Loading @@ -51,6 +51,29 @@ struct cfg80211_conn { bool auto_auth, prev_bssid_valid; }; static bool cfg80211_is_all_countryie_ignore(void) { struct cfg80211_registered_device *rdev; struct wireless_dev *wdev; bool is_all_countryie_ignore = true; list_for_each_entry(rdev, &cfg80211_rdev_list, list) { list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { wdev_lock(wdev); if (!(wdev->wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_IGNORE)) { is_all_countryie_ignore = false; wdev_unlock(wdev); goto out; } wdev_unlock(wdev); } } out: return is_all_countryie_ignore; } static void cfg80211_sme_free(struct wireless_dev *wdev) { if (!wdev->conn) Loading Loading @@ -658,7 +681,8 @@ static bool cfg80211_is_all_idle(void) static void disconnect_work(struct work_struct *work) { rtnl_lock(); if (cfg80211_is_all_idle()) if (cfg80211_is_all_idle() && !cfg80211_is_all_countryie_ignore()) regulatory_hint_disconnect(); rtnl_unlock(); } Loading