Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b365d04c authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "cfg80211: avoid restoring the regulatory during disconnect"

parents df326ed8 53aaccb4
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -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)
{
@@ -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;
+25 −1
Original line number Diff line number Diff line
@@ -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)
@@ -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();
}