]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: mac80211: fix Rx packet handling when pubsta information is not available
authorAditya Kumar Singh <aditya.kumar.singh@oss.qualcomm.com>
Wed, 17 Sep 2025 07:12:03 +0000 (12:42 +0530)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 19 Sep 2025 09:59:34 +0000 (11:59 +0200)
In ieee80211_rx_handle_packet(), if the caller does not provide pubsta
information, an attempt is made to find the station using the address 2
(source address) field in the header. Since pubsta is missing, link
information such as link_valid and link_id is also unavailable. Now if such
a situation comes, and if a matching ML station entry is found based on
the source address, currently the packet is dropped due to missing link ID
in the status field which is not correct.

Hence, to fix this issue, if link_valid is not set and the station is an
ML station, make an attempt to find a link station entry using the source
address. If a valid link station is found, derive the link ID and proceed
with packet processing. Otherwise, drop the packet as per the existing
flow.

Fixes: ea9d807b5642 ("wifi: mac80211: add link information in ieee80211_rx_status")
Suggested-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Signed-off-by: Aditya Kumar Singh <aditya.kumar.singh@oss.qualcomm.com>
Link: https://patch.msgid.link/20250917-fix_data_packet_rx_with_mlo_and_no_pubsta-v1-1-8cf971a958ac@oss.qualcomm.com
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/rx.c

index feb81ffa4f8c88f1afafdd0a50cdf53bac841600..6af43dfefdd6aad2cb3f1b47f6d2e70bb5c1a163 100644 (file)
@@ -5238,12 +5238,20 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
                        }
 
                        rx.sdata = prev_sta->sdata;
+                       if (!status->link_valid && prev_sta->sta.mlo) {
+                               struct link_sta_info *link_sta;
+
+                               link_sta = link_sta_info_get_bss(rx.sdata,
+                                                                hdr->addr2);
+                               if (!link_sta)
+                                       continue;
+
+                               link_id = link_sta->link_id;
+                       }
+
                        if (!ieee80211_rx_data_set_sta(&rx, prev_sta, link_id))
                                goto out;
 
-                       if (!status->link_valid && prev_sta->sta.mlo)
-                               continue;
-
                        ieee80211_prepare_and_rx_handle(&rx, skb, false);
 
                        prev_sta = sta;
@@ -5251,10 +5259,18 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
 
                if (prev_sta) {
                        rx.sdata = prev_sta->sdata;
-                       if (!ieee80211_rx_data_set_sta(&rx, prev_sta, link_id))
-                               goto out;
+                       if (!status->link_valid && prev_sta->sta.mlo) {
+                               struct link_sta_info *link_sta;
 
-                       if (!status->link_valid && prev_sta->sta.mlo)
+                               link_sta = link_sta_info_get_bss(rx.sdata,
+                                                                hdr->addr2);
+                               if (!link_sta)
+                                       goto out;
+
+                               link_id = link_sta->link_id;
+                       }
+
+                       if (!ieee80211_rx_data_set_sta(&rx, prev_sta, link_id))
                                goto out;
 
                        if (ieee80211_prepare_and_rx_handle(&rx, skb, true))