diff --git a/wpa_supplicant/bss.c b/wpa_supplicant/bss.c index a9998682c..af2033f9b 100644 --- a/wpa_supplicant/bss.c +++ b/wpa_supplicant/bss.c @@ -35,6 +35,22 @@ #define WPA_BSS_IES_CHANGED_FLAG BIT(8) +static void wpa_bss_set_hessid(struct wpa_bss *bss) +{ +#ifdef CONFIG_INTERWORKING + const u8 *ie = wpa_bss_get_ie(bss, WLAN_EID_INTERWORKING); + if (ie == NULL || (ie[1] != 7 && ie[1] != 9)) { + os_memset(bss->hessid, 0, ETH_ALEN); + return; + } + if (ie[1] == 7) + os_memcpy(bss->hessid, ie + 3, ETH_ALEN); + else + os_memcpy(bss->hessid, ie + 5, ETH_ALEN); +#endif /* CONFIG_INTERWORKING */ +} + + struct wpa_bss_anqp * wpa_bss_anqp_alloc(void) { struct wpa_bss_anqp *anqp; @@ -227,6 +243,7 @@ static struct wpa_bss * wpa_bss_add(struct wpa_supplicant *wpa_s, bss->ie_len = res->ie_len; bss->beacon_ie_len = res->beacon_ie_len; os_memcpy(bss + 1, res + 1, res->ie_len + res->beacon_ie_len); + wpa_bss_set_hessid(bss); dl_list_add_tail(&wpa_s->bss, &bss->list); dl_list_add_tail(&wpa_s->bss_id, &bss->list_id); @@ -407,6 +424,8 @@ static void 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) + wpa_bss_set_hessid(bss); 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 31ae3da20..4a386b63b 100644 --- a/wpa_supplicant/bss.h +++ b/wpa_supplicant/bss.h @@ -47,6 +47,7 @@ struct wpa_bss_anqp { * @flags: information flags about the BSS/IBSS (WPA_BSS_*) * @last_update_idx: Index of the last scan update * @bssid: BSSID + * @hessid: HESSID * @freq: frequency of the channel in MHz (e.g., 2412 = channel 1) * @beacon_int: beacon interval in TUs (host byte order) * @caps: capability information field in host byte order @@ -69,6 +70,7 @@ struct wpa_bss { unsigned int last_update_idx; unsigned int flags; u8 bssid[ETH_ALEN]; + u8 hessid[ETH_ALEN]; u8 ssid[32]; size_t ssid_len; int freq;