[PATCH 10/18] bss: Parse and store MLD address of the AP from ML IE
Veerendranath Jakkam
quic_vjakkam at quicinc.com
Thu Jul 28 06:45:39 PDT 2022
From: Shivani Baranwal <quic_shivbara at quicinc.com>
Parse ML IE received in scan result to get AP MLD address and cache it
in wpa_bss structure.
Signed-off-by: Shivani Baranwal <quic_shivbara at quicinc.com>
---
wpa_supplicant/bss.c | 36 ++++++++++++++++++++++++++++++------
wpa_supplicant/bss.h | 2 ++
2 files changed, 32 insertions(+), 6 deletions(-)
diff --git a/wpa_supplicant/bss.c b/wpa_supplicant/bss.c
index 7dcdb9969..ac31d7893 100644
--- a/wpa_supplicant/bss.c
+++ b/wpa_supplicant/bss.c
@@ -457,7 +457,11 @@ static struct wpa_bss * wpa_bss_add(struct wpa_supplicant *wpa_s,
struct os_reltime *fetch_time)
{
struct wpa_bss *bss;
- char extra[50];
+ char extra[100];
+ const u8 *ml_ie;
+ char *pos;
+ int ret = 0;
+ size_t len;
bss = os_zalloc(sizeof(*bss) + res->ie_len + res->beacon_ie_len);
if (bss == NULL)
@@ -472,6 +476,11 @@ static struct wpa_bss * wpa_bss_add(struct wpa_supplicant *wpa_s,
os_memcpy(bss->ies, res + 1, res->ie_len + res->beacon_ie_len);
wpa_bss_set_hessid(bss);
+ os_memset(bss->mld_addr, 0, ETH_ALEN);
+ ml_ie = wpa_scan_get_ie_ext(res, WLAN_EID_EXT_MULTI_LINK);
+ if (ml_ie && ml_ie[1] > 1)
+ wpa_get_mld_addr(bss->mld_addr, ml_ie + 3, ml_ie[1] - 1);
+
if (wpa_s->num_bss + 1 > wpa_s->conf->bss_max_count &&
wpa_bss_remove_oldest(wpa_s) != 0) {
wpa_printf(MSG_ERROR, "Increasing the MAX BSS count to %d "
@@ -483,11 +492,19 @@ static struct wpa_bss * wpa_bss_add(struct wpa_supplicant *wpa_s,
dl_list_add_tail(&wpa_s->bss, &bss->list);
dl_list_add_tail(&wpa_s->bss_id, &bss->list_id);
wpa_s->num_bss++;
+
+ extra[0] = '\0';
+ pos = extra;
+ len = sizeof(extra);
if (!is_zero_ether_addr(bss->hessid))
- os_snprintf(extra, sizeof(extra), " HESSID " MACSTR,
- MAC2STR(bss->hessid));
- else
- extra[0] = '\0';
+ ret = os_snprintf(pos, extra + len - pos, " HESSID " MACSTR,
+ MAC2STR(bss->hessid));
+
+ if (!is_zero_ether_addr(bss->mld_addr) &&
+ !os_snprintf_error(extra + len - pos, ret))
+ ret = os_snprintf(pos, extra + len - pos, " MLD ADDR " MACSTR,
+ MAC2STR(bss->mld_addr));
+
wpa_dbg(wpa_s, MSG_DEBUG, "BSS: Add new id %u BSSID " MACSTR
" SSID '%s' freq %d%s",
bss->id, MAC2STR(bss->bssid), wpa_ssid_txt(ssid, ssid_len),
@@ -632,6 +649,7 @@ wpa_bss_update(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
struct wpa_scan_res *res, struct os_reltime *fetch_time)
{
u32 changes;
+ const u8 *ml_ie;
if (bss->last_update_idx == wpa_s->bss_update_idx) {
struct os_reltime update_time;
@@ -724,8 +742,14 @@ wpa_bss_update(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
}
dl_list_add(prev, &bss->list_id);
}
- if (changes & WPA_BSS_IES_CHANGED_FLAG)
+ if (changes & WPA_BSS_IES_CHANGED_FLAG) {
wpa_bss_set_hessid(bss);
+ os_memset(bss->mld_addr, 0, ETH_ALEN);
+ ml_ie = wpa_scan_get_ie_ext(res, WLAN_EID_EXT_MULTI_LINK);
+ if (ml_ie && ml_ie[1] > 1)
+ wpa_get_mld_addr(bss->mld_addr, ml_ie + 3,
+ ml_ie[1] - 1);
+ }
dl_list_add_tail(&wpa_s->bss, &bss->list);
notify_bss_changes(wpa_s, changes, bss);
diff --git a/wpa_supplicant/bss.h b/wpa_supplicant/bss.h
index 146aaee7f..b68fc879d 100644
--- a/wpa_supplicant/bss.h
+++ b/wpa_supplicant/bss.h
@@ -122,6 +122,8 @@ struct wpa_bss {
size_t ie_len;
/** Length of the following Beacon IE field in octets */
size_t beacon_ie_len;
+ /** MLD address of the AP */
+ u8 mld_addr[ETH_ALEN];
/* followed by ie_len octets of IEs */
/* followed by beacon_ie_len octets of IEs */
u8 ies[];
--
2.25.1
More information about the Hostap
mailing list