]> www.infradead.org Git - users/hch/misc.git/commitdiff
wifi: mac80211: fix reporting of all valid links in sta_set_sinfo()
authorSarika Sharma <quic_sarishar@quicinc.com>
Thu, 4 Sep 2025 10:40:54 +0000 (16:10 +0530)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 10 Sep 2025 08:46:34 +0000 (10:46 +0200)
Currently, sta_set_sinfo() fails to populate link-level station info
when sinfo->valid_links is initially 0 and sta->sta.valid_links has
bits set for links other than link 0. This typically occurs when
association happens on a non-zero link or link 0 deleted dynamically.
In such cases, the for_each_valid_link(sinfo, link_id) loop only
executes for link 0 and terminates early, since sinfo->valid_links
remains 0. As a result, only MLD-level information is reported to
userspace.

Hence to fix, initialize sinfo->valid_links with sta->sta.valid_links
before entering the loop to ensure loop executes for each valid link.
During iteration, mask out invalid links from sinfo->valid_links if
any of sta->link[link_id], sdata->link[link_id], or sinfo->links[link_id]
are not present, to report only valid link information.

Fixes: 505991fba9ec ("wifi: mac80211: extend support to fill link level sinfo structure")
Signed-off-by: Sarika Sharma <quic_sarishar@quicinc.com>
Link: https://patch.msgid.link/20250904104054.790321-1-quic_sarishar@quicinc.com
[clarify comment]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/sta_info.c

index 8e275f0a12383e556b8e66703788aad428925f9e..1bd75e0375a0276155829c5602b7503f5ea7c398 100644 (file)
@@ -3207,16 +3207,20 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
                int link_id;
 
                ether_addr_copy(sinfo->mld_addr, sta->addr);
+
+               /* assign valid links first for iteration */
+               sinfo->valid_links = sta->sta.valid_links;
+
                for_each_valid_link(sinfo, link_id) {
                        link_sta = wiphy_dereference(sta->local->hw.wiphy,
                                                     sta->link[link_id]);
                        link = wiphy_dereference(sdata->local->hw.wiphy,
                                                 sdata->link[link_id]);
 
-                       if (!link_sta || !sinfo->links[link_id] || !link)
+                       if (!link_sta || !sinfo->links[link_id] || !link) {
+                               sinfo->valid_links &= ~BIT(link_id);
                                continue;
-
-                       sinfo->valid_links = sta->sta.valid_links;
+                       }
                        sta_set_link_sinfo(sta, sinfo->links[link_id],
                                           link, tidstats);
                }