]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
wifi: mac80211: Extend support for scanning while MLO connected
authorIlan Peer <ilan.peer@intel.com>
Mon, 13 Nov 2023 09:35:01 +0000 (11:35 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 24 Nov 2023 19:06:31 +0000 (20:06 +0100)
- 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: Ilan Peer <ilan.peer@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20231113112844.68564692c404.Iae9605cbb7f9d52e00ce98260b3559a34cf18341@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/scan.c

index 24fa06105378dae38661ebcf51b75ef247358278..1d98877647d85c71fa4666f552afe0b421380411 100644 (file)
@@ -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)) {
-               bss_meta.parent_tsf =
-                       ieee80211_calculate_rx_timestamp(local, rx_status,
-                                                        len + FCS_LEN, 24);
-               ether_addr_copy(bss_meta.parent_bssid,
-                               scan_sdata->vif.bss_conf.bssid);
+               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);
+
+                       ether_addr_copy(bss_meta.parent_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;