]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
MLD STA: Use MLD addresses for sending non-Public Action frames
authorVeerendranath Jakkam <quic_vjakkam@quicinc.com>
Wed, 19 Oct 2022 14:14:09 +0000 (19:44 +0530)
committerJouni Malinen <j@w1.fi>
Mon, 31 Oct 2022 15:24:29 +0000 (17:24 +0200)
The Linux kernel expects to use the AP MLD address as destination and
BSSID addresses for non-Public Action frames when the current
association is MLO capable. Use the MLD addresses to support this.

Signed-off-by: Veerendranath Jakkam <quic_vjakkam@quicinc.com>
wpa_supplicant/driver_i.h
wpa_supplicant/wpa_supplicant.c

index 6be117c1dfe248a128d337396a67643075b5a716..32379ae9c04b991fd215b81d77550b3e740cc65e 100644 (file)
@@ -406,20 +406,10 @@ static inline int wpa_drv_set_supp_port(struct wpa_supplicant *wpa_s,
        return 0;
 }
 
-static inline int wpa_drv_send_action(struct wpa_supplicant *wpa_s,
-                                     unsigned int freq,
-                                     unsigned int wait,
-                                     const u8 *dst, const u8 *src,
-                                     const u8 *bssid,
-                                     const u8 *data, size_t data_len,
-                                     int no_cck)
-{
-       if (wpa_s->driver->send_action)
-               return wpa_s->driver->send_action(wpa_s->drv_priv, freq,
-                                                 wait, dst, src, bssid,
-                                                 data, data_len, no_cck);
-       return -1;
-}
+int wpa_drv_send_action(struct wpa_supplicant *wpa_s, unsigned int freq,
+                       unsigned int wait, const u8 *dst, const u8 *src,
+                       const u8 *bssid, const u8 *data, size_t data_len,
+                       int no_cck);
 
 static inline void wpa_drv_send_action_cancel_wait(struct wpa_supplicant *wpa_s)
 {
index 2532c8382c3b7bea8fd402f95a470551f5f9da5a..6b3451fd4575a31a7eab018d3ea8ddf1ea0a69c3 100644 (file)
@@ -8869,3 +8869,43 @@ wpa_drv_get_scan_results2(struct wpa_supplicant *wpa_s)
 
        return scan_res;
 }
+
+
+static bool wpas_ap_link_address(struct wpa_supplicant *wpa_s, const u8 *addr)
+{
+       int i;
+
+       if (!wpa_s->valid_links)
+               return false;
+
+       for (i = 0; i < MAX_NUM_MLD_LINKS; i++) {
+               if (!(wpa_s->valid_links & BIT(i)))
+                       continue;
+
+               if (os_memcmp(wpa_s->links[i].bssid, addr, ETH_ALEN) == 0)
+                       return true;
+       }
+
+       return false;
+}
+
+
+int wpa_drv_send_action(struct wpa_supplicant *wpa_s, unsigned int freq,
+                       unsigned int wait, const u8 *dst, const u8 *src,
+                       const u8 *bssid, const u8 *data, size_t data_len,
+                       int no_cck)
+{
+       if (!wpa_s->driver->send_action)
+               return -1;
+
+       if (data_len > 0 && data[0] != WLAN_ACTION_PUBLIC) {
+               if (wpas_ap_link_address(wpa_s, dst))
+                       dst = wpa_s->ap_mld_addr;
+
+               if (wpas_ap_link_address(wpa_s, bssid))
+                       bssid = wpa_s->ap_mld_addr;
+       }
+
+       return wpa_s->driver->send_action(wpa_s->drv_priv, freq, wait, dst, src,
+                                         bssid, data, data_len, no_cck);
+}