Commit 32ee616a authored by Felix Fietkau's avatar Felix Fietkau Committed by Johannes Berg
Browse files

wifi: mac80211: use vif radio mask to limit ibss scan frequencies



Reject frequencies not supported by any radio that the vif is allowed to
use.

Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
Link: https://patch.msgid.link/9d5c0b6b00a7ecef6a0ac6de765c0af00c8bb0e1.1728462320.git-series.nbd@nbd.name


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 3607798a
Loading
Loading
Loading
Loading
+12 −10
Original line number Diff line number Diff line
@@ -1176,14 +1176,14 @@ int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
				unsigned int n_channels)
{
	struct ieee80211_local *local = sdata->local;
	int ret = -EBUSY, i, n_ch = 0;
	int i, n_ch = 0;
	enum nl80211_band band;

	lockdep_assert_wiphy(local->hw.wiphy);

	/* busy scanning */
	if (local->scan_req)
		goto unlock;
		return -EBUSY;

	/* fill internal scan request */
	if (!channels) {
@@ -1200,7 +1200,9 @@ int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
				    &local->hw.wiphy->bands[band]->channels[i];

				if (tmp_ch->flags & (IEEE80211_CHAN_NO_IR |
						     IEEE80211_CHAN_DISABLED))
						     IEEE80211_CHAN_DISABLED) ||
				    !cfg80211_wdev_channel_allowed(&sdata->wdev,
								   tmp_ch))
					continue;

				local->int_scan_req->channels[n_ch] = tmp_ch;
@@ -1209,21 +1211,23 @@ int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
		}

		if (WARN_ON_ONCE(n_ch == 0))
			goto unlock;
			return -EINVAL;

		local->int_scan_req->n_channels = n_ch;
	} else {
		for (i = 0; i < n_channels; i++) {
			if (channels[i]->flags & (IEEE80211_CHAN_NO_IR |
						  IEEE80211_CHAN_DISABLED))
						  IEEE80211_CHAN_DISABLED) ||
			    !cfg80211_wdev_channel_allowed(&sdata->wdev,
							   channels[i]))
				continue;

			local->int_scan_req->channels[n_ch] = channels[i];
			n_ch++;
		}

		if (WARN_ON_ONCE(n_ch == 0))
			goto unlock;
		if (n_ch == 0)
			return -EINVAL;

		local->int_scan_req->n_channels = n_ch;
	}
@@ -1233,9 +1237,7 @@ int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
	memcpy(local->int_scan_req->ssids[0].ssid, ssid, IEEE80211_MAX_SSID_LEN);
	local->int_scan_req->ssids[0].ssid_len = ssid_len;

	ret = __ieee80211_start_scan(sdata, sdata->local->int_scan_req);
 unlock:
	return ret;
	return __ieee80211_start_scan(sdata, sdata->local->int_scan_req);
}

void ieee80211_scan_cancel(struct ieee80211_local *local)