wifi: mac80211: fix RX MLD address translation
authorJohannes Berg <johannes.berg@intel.com>
Mon, 18 Jul 2022 14:40:36 +0000 (16:40 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 22 Jul 2022 12:27:48 +0000 (14:27 +0200)
We should only translate addr3 here if it's the BSSID.

Fixes: 42fb9148c078 ("wifi: mac80211: do link->MLD address translation on RX")
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/rx.c

index cad4b23782187a9b98f4203e4a9e28d5681910c8..9054a1e0b0d85ca42aadcdb24abd79af59b73dd9 100644 (file)
@@ -4776,10 +4776,14 @@ static bool ieee80211_prepare_and_rx_handle(struct ieee80211_rx_data *rx,
                        ether_addr_copy(hdr->addr1, rx->sdata->vif.addr);
                if (ether_addr_equal(link_sta->addr, hdr->addr2))
                        ether_addr_copy(hdr->addr2, rx->sta->addr);
-               if (ether_addr_equal(link_sta->addr, hdr->addr3))
-                       ether_addr_copy(hdr->addr3, rx->sta->addr);
-               else if (ether_addr_equal(link->conf->addr, hdr->addr3))
-                       ether_addr_copy(hdr->addr3, rx->sdata->vif.addr);
+               /* translate A3 only if it's the BSSID */
+               if (!ieee80211_has_tods(hdr->frame_control) &&
+                   !ieee80211_has_fromds(hdr->frame_control)) {
+                       if (ether_addr_equal(link_sta->addr, hdr->addr3))
+                               ether_addr_copy(hdr->addr3, rx->sta->addr);
+                       else if (ether_addr_equal(link->conf->addr, hdr->addr3))
+                               ether_addr_copy(hdr->addr3, rx->sdata->vif.addr);
+               }
                /* not needed for A4 since it can only carry the SA */
        }