From b19aa9c4223b65ed4a80f3ec02dacaa4b63b7c3f Mon Sep 17 00:00:00 2001 From: Aditya Kumar Singh Date: Wed, 6 Mar 2024 12:07:32 +0530 Subject: [PATCH] AP MLD: Use MLD struct for MLD level information MLD level structure is present to store the MLD level information. Add changes to use the MLD structure instead of link specific struct hostapd_data to get/set the MLD level information. Signed-off-by: Aditya Kumar Singh --- hostapd/ctrl_iface.c | 6 ++-- hostapd/main.c | 22 ++++++------ src/ap/ap_drv_ops.c | 6 ++-- src/ap/authsrv.c | 30 ++++++++++++---- src/ap/ctrl_iface_ap.c | 2 +- src/ap/drv_callbacks.c | 7 ++-- src/ap/hostapd.c | 70 +++++++++++++++++++++++++++++++++----- src/ap/hostapd.h | 7 +--- src/ap/ieee802_11.c | 22 +++++++----- src/ap/ieee802_11_eht.c | 4 +-- src/ap/ieee802_11_shared.c | 4 +-- src/ap/ieee802_1x.c | 15 ++++++-- src/ap/wnm_ap.c | 2 +- 13 files changed, 136 insertions(+), 61 deletions(-) diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c index e1541dd97..085ee6e57 100644 --- a/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c @@ -1944,7 +1944,7 @@ static int hostapd_ctrl_iface_data_test_config(struct hostapd_data *hapd, #ifdef CONFIG_IEEE80211BE if (hapd->conf->mld_ap) - addr = hapd->mld_addr; + addr = hapd->mld->mld_addr; #endif /* CONFIG_IEEE80211BE */ hapd->l2_test = l2_packet_init(ifname, addr, ETHERTYPE_IP, hostapd_data_test_rx, @@ -3519,7 +3519,7 @@ static int hostapd_ctrl_iface_disable_mld(struct hostapd_iface *iface) if (!hostapd_is_ml_partner(h_hapd, iface->bss[0])) continue; - if (!h_hapd->mld_first_bss) { + if (hostapd_mld_is_first_bss(h_hapd)) { first_iface = h_iface; continue; } @@ -3536,7 +3536,7 @@ static int hostapd_ctrl_iface_disable_mld(struct hostapd_iface *iface) struct hostapd_data *h_hapd = h_iface->bss[0]; if (!hostapd_is_ml_partner(h_hapd, iface->bss[0]) || - !h_hapd->mld_first_bss) + hostapd_mld_is_first_bss(h_hapd)) continue; if (hostapd_disable_iface(h_iface)) { diff --git a/hostapd/main.c b/hostapd/main.c index 602c3c082..a0619c76c 100644 --- a/hostapd/main.c +++ b/hostapd/main.c @@ -204,20 +204,16 @@ static int hostapd_driver_init(struct hostapd_iface *iface) * is not configured, and otherwise it would be the * configured BSSID. */ - os_memcpy(hapd->mld_addr, h_hapd->mld_addr, ETH_ALEN); if (is_zero_ether_addr(b)) { - os_memcpy(hapd->own_addr, h_hapd->mld_addr, ETH_ALEN); + os_memcpy(hapd->own_addr, h_hapd->mld->mld_addr, + ETH_ALEN); random_mac_addr_keep_oui(hapd->own_addr); } else { os_memcpy(hapd->own_addr, b, ETH_ALEN); } - /* - * Mark the interface as a secondary interface, as this - * is needed for the de-initialization flow - */ - hapd->mld_first_bss = h_hapd; - hapd->mld_link_id = hapd->mld_first_bss->mld_next_link_id++; + hapd->mld_link_id = hapd->mld->next_link_id++; + hostapd_mld_add_link(hapd); goto setup_mld; } @@ -294,13 +290,15 @@ static int hostapd_driver_init(struct hostapd_iface *iface) * configured, and otherwise it would be the configured BSSID. */ if (hapd->conf->mld_ap) { - os_memcpy(hapd->mld_addr, hapd->own_addr, ETH_ALEN); - hapd->mld_next_link_id = 0; - hapd->mld_link_id = hapd->mld_next_link_id++; + os_memcpy(hapd->mld->mld_addr, hapd->own_addr, ETH_ALEN); + if (!b) random_mac_addr_keep_oui(hapd->own_addr); else os_memcpy(hapd->own_addr, b, ETH_ALEN); + + hapd->mld_link_id = hapd->mld->next_link_id++; + hostapd_mld_add_link(hapd); } setup_mld: @@ -354,7 +352,7 @@ setup_mld: wpa_printf(MSG_DEBUG, "MLD: Set link_id=%u, mld_addr=" MACSTR ", own_addr=" MACSTR, - hapd->mld_link_id, MAC2STR(hapd->mld_addr), + hapd->mld_link_id, MAC2STR(hapd->mld->mld_addr), MAC2STR(hapd->own_addr)); hostapd_drv_link_add(hapd, hapd->mld_link_id, diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c index 6d910aa5a..e73835316 100644 --- a/src/ap/ap_drv_ops.c +++ b/src/ap/ap_drv_ops.c @@ -842,7 +842,7 @@ int hostapd_drv_sta_deauth(struct hostapd_data *hapd, link_id = hapd->mld_link_id; if (ap_sta_is_mld(hapd, sta)) - own_addr = hapd->mld_addr; + own_addr = hapd->mld->mld_addr; } #endif /* CONFIG_IEEE80211BE */ @@ -863,7 +863,7 @@ int hostapd_drv_sta_disassoc(struct hostapd_data *hapd, struct sta_info *sta = ap_get_sta(hapd, addr); if (ap_sta_is_mld(hapd, sta)) - own_addr = hapd->mld_addr; + own_addr = hapd->mld->mld_addr; } #endif /* CONFIG_IEEE80211BE */ @@ -921,7 +921,7 @@ static int hapd_drv_send_action(struct hostapd_data *hapd, unsigned int freq, sta = ap_get_sta(hapd, dst); if (ap_sta_is_mld(hapd, sta)) { - own_addr = hapd->mld_addr; + own_addr = hapd->mld->mld_addr; bssid = own_addr; } #endif /* CONFIG_IEEE80211BE */ diff --git a/src/ap/authsrv.c b/src/ap/authsrv.c index 1488dccc3..6ed4d0633 100644 --- a/src/ap/authsrv.c +++ b/src/ap/authsrv.c @@ -107,13 +107,20 @@ static int hostapd_setup_radius_srv(struct hostapd_data *hapd) struct radius_server_conf srv; struct hostapd_bss_config *conf = hapd->conf; - if (hapd->mld_first_bss) { +#ifdef CONFIG_IEEE80211BE + if (!hostapd_mld_is_first_bss(hapd)) { + struct hostapd_data *first; + wpa_printf(MSG_DEBUG, "MLD: Using RADIUS server of the first BSS"); - hapd->radius_srv = hapd->mld_first_bss->radius_srv; + first = hostapd_mld_get_first_bss(hapd); + if (!first) + return -1; + hapd->radius_srv = first->radius_srv; return 0; } +#endif /* CONFIG_IEEE80211BE */ os_memset(&srv, 0, sizeof(srv)); srv.client_file = conf->radius_server_clients; @@ -249,18 +256,25 @@ static struct eap_config * authsrv_eap_config(struct hostapd_data *hapd) int authsrv_init(struct hostapd_data *hapd) { - if (hapd->mld_first_bss) { +#ifdef CONFIG_IEEE80211BE + if (!hostapd_mld_is_first_bss(hapd)) { + struct hostapd_data *first; + wpa_printf(MSG_DEBUG, "MLD: Using auth_serv of the first BSS"); + first = hostapd_mld_get_first_bss(hapd); + if (!first) + return -1; #ifdef EAP_TLS_FUNCS - hapd->ssl_ctx = hapd->mld_first_bss->ssl_ctx; + hapd->ssl_ctx = first->ssl_ctx; #endif /* EAP_TLS_FUNCS */ - hapd->eap_cfg = hapd->mld_first_bss->eap_cfg; + hapd->eap_cfg = first->eap_cfg; #ifdef EAP_SIM_DB - hapd->eap_sim_db_priv = hapd->mld_first_bss->eap_sim_db_priv; + hapd->eap_sim_db_priv = first->eap_sim_db_priv; #endif /* EAP_SIM_DB */ return 0; } +#endif /* CONFIG_IEEE80211BE */ #ifdef EAP_TLS_FUNCS if (hapd->conf->eap_server && @@ -376,7 +390,8 @@ int authsrv_init(struct hostapd_data *hapd) void authsrv_deinit(struct hostapd_data *hapd) { - if (hapd->mld_first_bss) { +#ifdef CONFIG_IEEE80211BE + if (!hostapd_mld_is_first_bss(hapd)) { wpa_printf(MSG_DEBUG, "MLD: Deinit auth_serv of a non-first BSS"); @@ -390,6 +405,7 @@ void authsrv_deinit(struct hostapd_data *hapd) #endif /* EAP_TLS_FUNCS */ return; } +#endif /* CONFIG_IEEE80211BE */ #ifdef RADIUS_SERVER radius_server_deinit(hapd->radius_srv); diff --git a/src/ap/ctrl_iface_ap.c b/src/ap/ctrl_iface_ap.c index cdd777287..272317774 100644 --- a/src/ap/ctrl_iface_ap.c +++ b/src/ap/ctrl_iface_ap.c @@ -1012,7 +1012,7 @@ int hostapd_ctrl_iface_status(struct hostapd_data *hapd, char *buf, "mld_addr[%d]=" MACSTR "\n" "mld_id[%d]=%d\n" "mld_link_id[%d]=%d\n", - (int) i, MAC2STR(bss->mld_addr), + (int) i, MAC2STR(bss->mld->mld_addr), (int) i, hostapd_get_mld_id(bss), (int) i, bss->mld_link_id); if (os_snprintf_error(buflen - len, ret)) diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c index 8c9d2081a..2d3206909 100644 --- a/src/ap/drv_callbacks.c +++ b/src/ap/drv_callbacks.c @@ -517,7 +517,7 @@ int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr, if (ap_sta_is_mld(hapd, sta)) { wpa_printf(MSG_DEBUG, "MLD: Set ML info in RSN Authenticator"); - wpa_auth_set_ml_info(sta->wpa_sm, hapd->mld_addr, + wpa_auth_set_ml_info(sta->wpa_sm, hapd->mld->mld_addr, sta->mld_assoc_link_id, &sta->mld_info); } @@ -1815,7 +1815,7 @@ static int hostapd_mgmt_rx(struct hostapd_data *hapd, struct rx_mgmt *rx_mgmt) #ifdef CONFIG_IEEE80211BE if (hapd->conf->mld_ap && - ether_addr_equal(hapd->mld_addr, bssid)) + ether_addr_equal(hapd->mld->mld_addr, bssid)) is_mld = true; #endif /* CONFIG_IEEE80211BE */ @@ -1887,7 +1887,8 @@ static void hostapd_mgmt_tx_cb(struct hostapd_data *hapd, const u8 *buf, hapd = tmp_hapd; #ifdef CONFIG_IEEE80211BE } else if (hapd->conf->mld_ap && - ether_addr_equal(hapd->mld_addr, get_hdr_bssid(hdr, len))) { + ether_addr_equal(hapd->mld->mld_addr, + get_hdr_bssid(hdr, len))) { /* AP MLD address match - use hapd pointer as-is */ #endif /* CONFIG_IEEE80211BE */ } else { diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c index bf3335a6a..cd78d1887 100644 --- a/src/ap/hostapd.c +++ b/src/ap/hostapd.c @@ -399,6 +399,7 @@ static int hostapd_broadcast_wep_set(struct hostapd_data *hapd) static void hostapd_clear_drv_priv(struct hostapd_data *hapd) { +#ifdef CONFIG_IEEE80211BE unsigned int i; for (i = 0; i < hapd->iface->interfaces->count; i++) { @@ -408,9 +409,10 @@ static void hostapd_clear_drv_priv(struct hostapd_data *hapd) continue; if (iface->bss && iface->bss[0] && - iface->bss[0]->mld_first_bss == hapd) + hostapd_mld_get_first_bss(iface->bss[0]) == hapd) iface->bss[0]->drv_priv = NULL; } +#endif /* CONFIG_IEEE80211BE */ hapd->drv_priv = NULL; } @@ -498,7 +500,8 @@ void hostapd_free_hapd_data(struct hostapd_data *hapd) vlan_deinit(hapd); hostapd_acl_deinit(hapd); #ifndef CONFIG_NO_RADIUS - if (!hapd->mld_first_bss) { + if (hostapd_mld_is_first_bss(hapd)) { +#ifdef CONFIG_IEEE80211BE struct hapd_interfaces *ifaces = hapd->iface->interfaces; size_t i; @@ -517,6 +520,7 @@ void hostapd_free_hapd_data(struct hostapd_data *hapd) h->radius_das = NULL; } } +#endif /* CONFIG_IEEE80211BE */ radius_client_deinit(hapd->radius); radius_das_deinit(hapd->radius_das); } @@ -616,6 +620,41 @@ void hostapd_free_hapd_data(struct hostapd_data *hapd) } +/* hostapd_bss_link_deinit - Per-BSS ML cleanup (deinitialization) + * @hapd: Pointer to BSS data + * + * This function is used to unlink the BSS from the AP MLD. + * If the BSS being removed is the first link, the next link becomes the first + * link. + */ +static void hostapd_bss_link_deinit(struct hostapd_data *hapd) +{ +#ifdef CONFIG_IEEE80211BE + if (!hapd->conf || !hapd->conf->mld_ap) + return; + + if (!hapd->mld->num_links) + return; + + /* If not started, not yet linked to the MLD. However, the first + * BSS is always linked since it is linked during driver_init(), and + * hence, need to remove it from the AP MLD. + */ + if (!hapd->started && hapd->iface->bss[0] != hapd) + return; + + /* The first BSS can also be only linked when at least driver_init() is + * executed. But if previous interface fails, it is not, and hence, + * safe to skip. + */ + if (hapd->iface->bss[0] == hapd && !hapd->drv_priv) + return; + + hostapd_mld_remove_link(hapd); +#endif /* CONFIG_IEEE80211BE */ +} + + /** * hostapd_cleanup - Per-BSS cleanup (deinitialization) * @hapd: Pointer to BSS data @@ -1305,7 +1344,7 @@ static int hostapd_setup_bss(struct hostapd_data *hapd, int first, u8 if_addr[ETH_ALEN]; int flush_old_stations = 1; - if (hapd->mld_first_bss) + if (!hostapd_mld_is_first_bss(hapd)) wpa_printf(MSG_DEBUG, "MLD: %s: Setting non-first BSS", __func__); @@ -1467,7 +1506,7 @@ static int hostapd_setup_bss(struct hostapd_data *hapd, int first, } #endif /* CONFIG_SQLITE */ - if (!hapd->mld_first_bss) { + if (hostapd_mld_is_first_bss(hapd)) { hapd->radius = radius_client_init(hapd, conf->radius); if (!hapd->radius) { wpa_printf(MSG_ERROR, @@ -1500,10 +1539,17 @@ static int hostapd_setup_bss(struct hostapd_data *hapd, int first, } } } else { +#ifdef CONFIG_IEEE80211BE + struct hostapd_data *f_bss; + wpa_printf(MSG_DEBUG, "MLD: Using RADIUS client of the first BSS"); - hapd->radius = hapd->mld_first_bss->radius; - hapd->radius_das = hapd->mld_first_bss->radius_das; + f_bss = hostapd_mld_get_first_bss(hapd); + if (!f_bss) + return -1; + hapd->radius = f_bss->radius; + hapd->radius_das = f_bss->radius_das; +#endif /* CONFIG_IEEE80211BE */ } #endif /* CONFIG_NO_RADIUS */ @@ -1741,6 +1787,7 @@ static int start_ctrl_iface(struct hostapd_iface *iface) static void hostapd_no_ir_cleanup(struct hostapd_data *bss) { hostapd_bss_deinit_no_free(bss); + hostapd_bss_link_deinit(bss); hostapd_free_hapd_data(bss); hostapd_cleanup_iface_partial(bss->iface); } @@ -2799,6 +2846,8 @@ static void hostapd_bss_deinit(struct hostapd_data *hapd) hapd->rad_attr_db = NULL; } #endif /* CONFIG_SQLITE */ + + hostapd_bss_link_deinit(hapd); hostapd_cleanup(hapd); } @@ -3142,7 +3191,7 @@ void hostapd_interface_deinit_free(struct hostapd_iface *iface) wpa_printf(MSG_DEBUG, "%s: driver=%p drv_priv=%p -> hapd_deinit", __func__, driver, drv_priv); if (driver && driver->hapd_deinit && drv_priv) { - if (!iface->bss[0]->mld_first_bss) + if (hostapd_mld_is_first_bss(iface->bss[0])) driver->hapd_deinit(drv_priv); hostapd_clear_drv_priv(iface->bss[0]); } @@ -3159,7 +3208,7 @@ static void hostapd_deinit_driver(const struct wpa_driver_ops *driver, wpa_printf(MSG_DEBUG, "%s: driver=%p drv_priv=%p -> hapd_deinit", __func__, driver, drv_priv); if (driver && driver->hapd_deinit && drv_priv) { - if (!hapd_iface->bss[0]->mld_first_bss) + if (hostapd_mld_is_first_bss(hapd_iface->bss[0])) driver->hapd_deinit(drv_priv); for (j = 0; j < hapd_iface->num_bss; j++) { wpa_printf(MSG_DEBUG, "%s:bss[%d]->drv_priv=%p", @@ -3273,7 +3322,7 @@ int hostapd_disable_iface(struct hostapd_iface *hapd_iface) #ifdef CONFIG_IEEE80211BE if (hapd_iface->bss[0]->conf->mld_ap && - !hapd_iface->bss[0]->mld_first_bss) { + hostapd_mld_is_first_bss((hapd_iface->bss[0]))) { /* Do not allow mld_first_bss disabling before other BSSs */ for (j = 0; j < hapd_iface->interfaces->count; ++j) { struct hostapd_iface *h_iface = @@ -3311,6 +3360,7 @@ int hostapd_disable_iface(struct hostapd_iface *hapd_iface) for (j = 0; j < hapd_iface->num_bss; j++) { struct hostapd_data *hapd = hapd_iface->bss[j]; hostapd_bss_deinit_no_free(hapd); + hostapd_bss_link_deinit(hapd); hostapd_free_hapd_data(hapd); } @@ -3506,6 +3556,7 @@ int hostapd_add_iface(struct hapd_interfaces *interfaces, char *buf) if (start_ctrl_iface_bss(hapd) < 0 || (hapd_iface->state == HAPD_IFACE_ENABLED && hostapd_setup_bss(hapd, -1, true))) { + hostapd_bss_link_deinit(hapd); hostapd_cleanup(hapd); hapd_iface->bss[hapd_iface->num_bss - 1] = NULL; hapd_iface->conf->num_bss--; @@ -3603,6 +3654,7 @@ fail: wpa_printf(MSG_DEBUG, "%s: free hapd %p (%s)", __func__, hapd_iface->bss[i], hapd->conf->iface); + hostapd_bss_link_deinit(hapd); hostapd_cleanup(hapd); os_free(hapd); hapd_iface->bss[i] = NULL; diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h index a5f1e5df2..b2fdd7928 100644 --- a/src/ap/hostapd.h +++ b/src/ap/hostapd.h @@ -180,12 +180,6 @@ struct hostapd_data { unsigned int reenable_beacon:1; u8 own_addr[ETH_ALEN]; - u8 mld_addr[ETH_ALEN]; - u8 mld_link_id; - /* Used for mld_link_id assignment - valid on the first MLD BSS only */ - u8 mld_next_link_id; - - struct hostapd_data *mld_first_bss; int num_sta; /* number of entries in sta_list */ struct sta_info *sta_list; /* STA info list head */ @@ -479,6 +473,7 @@ struct hostapd_data { u8 eht_mld_bss_param_change; struct hostapd_mld *mld; struct dl_list link; + u8 mld_link_id; #ifdef CONFIG_TESTING_OPTIONS u8 eht_mld_link_removal_count; #endif /* CONFIG_TESTING_OPTIONS */ diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c index bf1d49b71..5a3132de4 100644 --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c @@ -422,7 +422,7 @@ static int send_auth_reply(struct hostapd_data *hapd, struct sta_info *sta, * the addresses. */ if (ap_sta_is_mld(hapd, sta)) { - sa = hapd->mld_addr; + sa = hapd->mld->mld_addr; ml_resp = hostapd_ml_auth_resp(hapd); if (!ml_resp) @@ -623,7 +623,7 @@ static struct wpabuf * auth_build_sae_commit(struct hostapd_data *hapd, #ifdef CONFIG_IEEE80211BE if (ap_sta_is_mld(hapd, sta)) - own_addr = hapd->mld_addr; + own_addr = hapd->mld->mld_addr; #endif /* CONFIG_IEEE80211BE */ if (sta->sae->tmp) { @@ -2819,7 +2819,9 @@ static void handle_auth(struct hostapd_data *hapd, u16 seq_ctrl; struct radius_sta rad_info; const u8 *dst, *sa, *bssid; +#ifdef CONFIG_IEEE80211BE bool mld_sta = false; +#endif /* CONFIG_IEEE80211BE */ if (len < IEEE80211_HDRLEN + sizeof(mgmt->u.auth)) { wpa_printf(MSG_INFO, "handle_auth - too short payload (len=%lu)", @@ -2937,15 +2939,17 @@ static void handle_auth(struct hostapd_data *hapd, goto fail; } +#ifdef CONFIG_IEEE80211BE if (mld_sta && (ether_addr_equal(sa, hapd->own_addr) || - ether_addr_equal(sa, hapd->mld_addr))) { + ether_addr_equal(sa, hapd->mld->mld_addr))) { wpa_printf(MSG_INFO, "Station " MACSTR " not allowed to authenticate", MAC2STR(sa)); resp = WLAN_STATUS_UNSPECIFIED_FAILURE; goto fail; } +#endif /* CONFIG_IEEE80211BE */ if (hapd->conf->no_auth_if_seen_on) { struct hostapd_data *other; @@ -3268,7 +3272,7 @@ static void handle_auth(struct hostapd_data *hapd, */ if (ap_sta_is_mld(hapd, sta)) { dst = sta->addr; - bssid = hapd->mld_addr; + bssid = hapd->mld->mld_addr; } #endif /* CONFIG_IEEE80211BE */ @@ -3779,7 +3783,7 @@ u16 owe_process_rsn_ie(struct hostapd_data *hapd, } #ifdef CONFIG_IEEE80211BE if (ap_sta_is_mld(hapd, sta)) - wpa_auth_set_ml_info(sta->wpa_sm, hapd->mld_addr, + wpa_auth_set_ml_info(sta->wpa_sm, hapd->mld->mld_addr, sta->mld_assoc_link_id, &sta->mld_info); #endif /* CONFIG_IEEE80211BE */ rsn_ie -= 2; @@ -4064,7 +4068,7 @@ static int __check_assoc_ies(struct hostapd_data *hapd, struct sta_info *sta, wpa_printf(MSG_DEBUG, "MLD: Set ML info in RSN Authenticator"); wpa_auth_set_ml_info(sta->wpa_sm, - hapd->mld_addr, + hapd->mld->mld_addr, sta->mld_assoc_link_id, info); } @@ -4825,7 +4829,7 @@ static u16 send_assoc_resp(struct hostapd_data *hapd, struct sta_info *sta, * MLD MAC address. */ if (ap_sta_is_mld(hapd, sta) && allow_mld_addr_trans) - sa = hapd->mld_addr; + sa = hapd->mld->mld_addr; #endif /* CONFIG_IEEE80211BE */ os_memcpy(reply->da, addr, ETH_ALEN); @@ -6243,7 +6247,7 @@ int ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len, #endif /* CONFIG_MESH */ #ifdef CONFIG_IEEE80211BE !(hapd->conf->mld_ap && - ether_addr_equal(hapd->mld_addr, mgmt->bssid)) && + ether_addr_equal(hapd->mld->mld_addr, mgmt->bssid)) && #endif /* CONFIG_IEEE80211BE */ !ether_addr_equal(mgmt->bssid, hapd->own_addr)) { wpa_printf(MSG_INFO, "MGMT: BSSID=" MACSTR " not our address", @@ -6266,7 +6270,7 @@ int ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len, stype != WLAN_FC_STYPE_ACTION) && #ifdef CONFIG_IEEE80211BE !(hapd->conf->mld_ap && - ether_addr_equal(hapd->mld_addr, mgmt->bssid)) && + ether_addr_equal(hapd->mld->mld_addr, mgmt->bssid)) && #endif /* CONFIG_IEEE80211BE */ #ifdef CONFIG_NAN_USD !ether_addr_equal(mgmt->da, nan_network_id) && diff --git a/src/ap/ieee802_11_eht.c b/src/ap/ieee802_11_eht.c index 7a4699c8c..fde8d8c08 100644 --- a/src/ap/ieee802_11_eht.c +++ b/src/ap/ieee802_11_eht.c @@ -487,7 +487,7 @@ static u8 * hostapd_eid_eht_basic_ml_common(struct hostapd_data *hapd, wpabuf_put_u8(buf, common_info_len); /* Own MLD MAC Address */ - wpabuf_put_data(buf, hapd->mld_addr, ETH_ALEN); + wpabuf_put_data(buf, hapd->mld->mld_addr, ETH_ALEN); /* Own Link ID */ wpabuf_put_u8(buf, hapd->mld_link_id); @@ -804,7 +804,7 @@ struct wpabuf * hostapd_ml_auth_resp(struct hostapd_data *hapd) wpabuf_put_u8(buf, WLAN_EID_EXT_MULTI_LINK); wpabuf_put_le16(buf, MULTI_LINK_CONTROL_TYPE_BASIC); wpabuf_put_u8(buf, ETH_ALEN + 1); - wpabuf_put_data(buf, hapd->mld_addr, ETH_ALEN); + wpabuf_put_data(buf, hapd->mld->mld_addr, ETH_ALEN); return buf; } diff --git a/src/ap/ieee802_11_shared.c b/src/ap/ieee802_11_shared.c index 0c38483a9..a5716f037 100644 --- a/src/ap/ieee802_11_shared.c +++ b/src/ap/ieee802_11_shared.c @@ -121,7 +121,7 @@ void ieee802_11_send_sa_query_req(struct hostapd_data *hapd, #ifdef CONFIG_IEEE80211BE if (ap_sta_is_mld(hapd, sta)) - own_addr = hapd->mld_addr; + own_addr = hapd->mld->mld_addr; #endif /* CONFIG_IEEE80211BE */ mgmt->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, @@ -219,7 +219,7 @@ static void ieee802_11_send_sa_query_resp(struct hostapd_data *hapd, #ifdef CONFIG_IEEE80211BE if (ap_sta_is_mld(hapd, sta)) - own_addr = hapd->mld_addr; + own_addr = hapd->mld->mld_addr; #endif /* CONFIG_IEEE80211BE */ resp->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, diff --git a/src/ap/ieee802_1x.c b/src/ap/ieee802_1x.c index 9bce42d58..8e98b6521 100644 --- a/src/ap/ieee802_1x.c +++ b/src/ap/ieee802_1x.c @@ -2539,13 +2539,20 @@ int ieee802_1x_init(struct hostapd_data *hapd) struct eapol_auth_config conf; struct eapol_auth_cb cb; - if (hapd->mld_first_bss) { +#ifdef CONFIG_IEEE80211BE + if (!hostapd_mld_is_first_bss(hapd)) { + struct hostapd_data *first; + wpa_printf(MSG_DEBUG, "MLD: Using IEEE 802.1X state machine of the first BSS"); - hapd->eapol_auth = hapd->mld_first_bss->eapol_auth; + first = hostapd_mld_get_first_bss(hapd); + if (!first) + return -1; + hapd->eapol_auth = first->eapol_auth; return 0; } +#endif /* CONFIG_IEEE80211BE */ dl_list_init(&hapd->erp_keys); @@ -2631,13 +2638,15 @@ void ieee802_1x_erp_flush(struct hostapd_data *hapd) void ieee802_1x_deinit(struct hostapd_data *hapd) { - if (hapd->mld_first_bss) { +#ifdef CONFIG_IEEE80211BE + if (!hostapd_mld_is_first_bss(hapd)) { wpa_printf(MSG_DEBUG, "MLD: Deinit IEEE 802.1X state machine of a non-first BSS"); hapd->eapol_auth = NULL; return; } +#endif /* CONFIG_IEEE80211BE */ #ifdef CONFIG_WEP eloop_cancel_timeout(ieee802_1x_rekey, hapd, NULL); diff --git a/src/ap/wnm_ap.c b/src/ap/wnm_ap.c index b77e21bd1..af8cccaef 100644 --- a/src/ap/wnm_ap.c +++ b/src/ap/wnm_ap.c @@ -51,7 +51,7 @@ static const u8 * wnm_ap_get_own_addr(struct hostapd_data *hapd, #ifdef CONFIG_IEEE80211BE if (hapd->conf->mld_ap && (!sta || ap_sta_is_mld(hapd, sta))) - own_addr = hapd->mld_addr; + own_addr = hapd->mld->mld_addr; #endif /* CONFIG_IEEE80211BE */ return own_addr;