Commit cbde0b49 authored by Ilan Peer's avatar Ilan Peer Committed by Johannes Berg
Browse files

wifi: mac80211: Extend support for scanning while MLO connected



- If the scan request includes a link ID, validate that it is
  one of the active links. Otherwise, if the scan request doesn't
  include a valid link ID, select one of the active links.

- When reporting the TSF for a BSS entry, use the link ID information
  from the Rx status or the scan request to set the parent BSSID.

Signed-off-by: default avatarIlan Peer <ilan.peer@intel.com>
Signed-off-by: default avatarGregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20231113112844.68564692c404.Iae9605cbb7f9d52e00ce98260b3559a34cf18341@changeid


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 6285ee30
Loading
Loading
Loading
Loading
+43 −5
Original line number Diff line number Diff line
@@ -194,11 +194,32 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
	if (scan_sdata && scan_sdata->vif.type == NL80211_IFTYPE_STATION &&
	    scan_sdata->vif.cfg.assoc &&
	    ieee80211_have_rx_timestamp(rx_status)) {
		struct ieee80211_bss_conf *link_conf = NULL;

		/* for an MLO connection, set the TSF data only in case we have
		 * an indication on which of the links the frame was received
		 */
		if (ieee80211_vif_is_mld(&scan_sdata->vif)) {
			if (rx_status->link_valid) {
				s8 link_id = rx_status->link_id;

				link_conf =
					rcu_dereference(scan_sdata->vif.link_conf[link_id]);
			}
		} else {
			link_conf = &scan_sdata->vif.bss_conf;
		}

		if (link_conf) {
			bss_meta.parent_tsf =
			ieee80211_calculate_rx_timestamp(local, rx_status,
							 len + FCS_LEN, 24);
				ieee80211_calculate_rx_timestamp(local,
								 rx_status,
								 len + FCS_LEN,
								 24);

			ether_addr_copy(bss_meta.parent_bssid,
				scan_sdata->vif.bss_conf.bssid);
					link_conf->bssid);
		}
	}
	rcu_read_unlock();

@@ -666,6 +687,21 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
	if (local->scan_req)
		return -EBUSY;

	/* For an MLO connection, if a link ID was specified, validate that it
	 * is indeed active. If no link ID was specified, select one of the
	 * active links.
	 */
	if (ieee80211_vif_is_mld(&sdata->vif)) {
		if (req->tsf_report_link_id >= 0) {
			if (!(sdata->vif.active_links &
			      BIT(req->tsf_report_link_id)))
				return -EINVAL;
		} else {
			req->tsf_report_link_id =
				__ffs(sdata->vif.active_links);
		}
	}

	if (!__ieee80211_can_leave_ch(sdata))
		return -EBUSY;

@@ -714,6 +750,8 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
		local->hw_scan_req->req.duration = req->duration;
		local->hw_scan_req->req.duration_mandatory =
			req->duration_mandatory;
		local->hw_scan_req->req.tsf_report_link_id =
			req->tsf_report_link_id;

		local->hw_scan_band = 0;
		local->hw_scan_req->req.n_6ghz_params = req->n_6ghz_params;