Update MLO connection info such as valid links, AP MLD address and other link information to wpa_sm. Signed-off-by: Veerendranath Jakkam <quic_vjakkam@xxxxxxxxxxx> --- src/rsn_supp/wpa.c | 23 +++++++++++++++++++++++ src/rsn_supp/wpa.h | 11 +++++++++++ src/rsn_supp/wpa_i.h | 7 +++++++ wpa_supplicant/events.c | 18 ++++++++++++++++++ 4 files changed, 59 insertions(+) diff --git a/src/rsn_supp/wpa.c b/src/rsn_supp/wpa.c index cf9b21039..a28d49225 100644 --- a/src/rsn_supp/wpa.c +++ b/src/rsn_supp/wpa.c @@ -3277,6 +3277,29 @@ void wpa_sm_set_config(struct wpa_sm *sm, struct rsn_supp_config *config) } +void wpa_sm_set_ml_params(struct wpa_sm *sm, const u8 *ap_mld_addr, + u16 valid_links, const u8 (*link_addr)[ETH_ALEN], + const u8 (*link_bssid)[ETH_ALEN]) +{ + int i; + + if (!sm) + return; + + sm->valid_links = valid_links; + if (!valid_links) + return; + + os_memcpy(sm->ap_mld_addr, ap_mld_addr, ETH_ALEN); + for (i = 0; i < MAX_NUM_MLD_LINKS; i++) { + if (!(valid_links & BIT(i))) + continue; + + os_memcpy(sm->links[i].addr, link_addr[i], ETH_ALEN); + os_memcpy(sm->links[i].bssid, link_bssid[i], ETH_ALEN); + } +} + /** * wpa_sm_set_own_addr - Set own MAC address * @sm: Pointer to WPA state machine data from wpa_sm_init() diff --git a/src/rsn_supp/wpa.h b/src/rsn_supp/wpa.h index be70f4156..e6eef0c99 100644 --- a/src/rsn_supp/wpa.h +++ b/src/rsn_supp/wpa.h @@ -153,6 +153,9 @@ void wpa_sm_set_fast_reauth(struct wpa_sm *sm, int fast_reauth); void wpa_sm_set_scard_ctx(struct wpa_sm *sm, void *scard_ctx); void wpa_sm_set_config(struct wpa_sm *sm, struct rsn_supp_config *config); void wpa_sm_set_own_addr(struct wpa_sm *sm, const u8 *addr); +void wpa_sm_set_ml_params(struct wpa_sm *sm, const u8 *ap_mld_addr, + u16 valid_links, const u8 (*link_addr)[ETH_ALEN], + const u8 (*link_bssid)[ETH_ALEN]); void wpa_sm_set_ifname(struct wpa_sm *sm, const char *ifname, const char *bridge_ifname); void wpa_sm_set_eapol(struct wpa_sm *sm, struct eapol_sm *eapol); @@ -266,6 +269,14 @@ static inline void wpa_sm_set_own_addr(struct wpa_sm *sm, const u8 *addr) { } +static inline void wpa_sm_set_ml_params(struct wpa_sm *sm, + const u8 *ap_mld_addr, + u16 valid_links, + const u8 (*link_addr)[ETH_ALEN], + const u8 (*link_bssid)[ETH_ALEN]) +{ +} + static inline void wpa_sm_set_ifname(struct wpa_sm *sm, const char *ifname, const char *bridge_ifname) { diff --git a/src/rsn_supp/wpa_i.h b/src/rsn_supp/wpa_i.h index fabd6cb26..62b85cb2e 100644 --- a/src/rsn_supp/wpa_i.h +++ b/src/rsn_supp/wpa_i.h @@ -218,6 +218,13 @@ struct wpa_sm { struct wpabuf *dpp_z; int dpp_pfs; #endif /* CONFIG_DPP2 */ + + u16 valid_links; + u8 ap_mld_addr[ETH_ALEN]; + struct { + u8 addr[ETH_ALEN]; + u8 bssid[ETH_ALEN]; + } links[MAX_NUM_MLD_LINKS]; }; diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index 0db2e8dd8..db4de316f 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -3387,6 +3387,23 @@ static int wpa_drv_get_mlo_info(struct wpa_supplicant *wpa_s) return 0; } +static void wpa_sm_update_ml_params(struct wpa_supplicant *wpa_s) +{ + int i; + u8 link_addr[MAX_NUM_MLD_LINKS][ETH_ALEN]; + u8 link_bssid[MAX_NUM_MLD_LINKS][ETH_ALEN]; + + for (i = 0; i < MAX_NUM_MLD_LINKS && wpa_s->valid_links; i++) { + if (!(wpa_s->valid_links & BIT(i))) + continue; + + os_memcpy(link_addr[i], wpa_s->links[i].addr, ETH_ALEN); + os_memcpy(link_bssid[i], wpa_s->links[i].bssid, ETH_ALEN); + } + + wpa_sm_set_ml_params(wpa_s->wpa, wpa_s->ap_mld_addr, wpa_s->valid_links, + link_addr, link_bssid); +} static void wpa_supplicant_event_assoc(struct wpa_supplicant *wpa_s, union wpa_event_data *data) @@ -3512,6 +3529,7 @@ static void wpa_supplicant_event_assoc(struct wpa_supplicant *wpa_s, wpa_supplicant_scard_init(wpa_s, wpa_s->current_ssid); } wpa_sm_notify_assoc(wpa_s->wpa, bssid); + wpa_sm_update_ml_params(wpa_s); if (wpa_s->l2) l2_packet_notify_auth_start(wpa_s->l2); -- 2.25.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap