]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
AP MLD: Use MLD struct for MLD level information
authorAditya Kumar Singh <quic_adisi@quicinc.com>
Wed, 6 Mar 2024 06:37:32 +0000 (12:07 +0530)
committerJouni Malinen <j@w1.fi>
Wed, 27 Mar 2024 09:15:19 +0000 (11:15 +0200)
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 <quic_adisi@quicinc.com>
13 files changed:
hostapd/ctrl_iface.c
hostapd/main.c
src/ap/ap_drv_ops.c
src/ap/authsrv.c
src/ap/ctrl_iface_ap.c
src/ap/drv_callbacks.c
src/ap/hostapd.c
src/ap/hostapd.h
src/ap/ieee802_11.c
src/ap/ieee802_11_eht.c
src/ap/ieee802_11_shared.c
src/ap/ieee802_1x.c
src/ap/wnm_ap.c

index e1541dd97fede4065a86c0476eb0e3044ed124fc..085ee6e570269e4c3b994345f0d419069cd16ba3 100644 (file)
@@ -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)) {
index 602c3c0826e5bab27d06513c63f6f687a6c6f6d8..a0619c76c28f7746b989e34eb68ba4b3ac210e14 100644 (file)
@@ -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,
index 6d910aa5aafe02dc69e126595318bafc9d60067c..e738353167ab3191cd476bc9b1021033dca6471d 100644 (file)
@@ -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 */
index 1488dccc3d7f6c680f2ff1c1431d1113fa30bad5..6ed4d063349b01845c03658bf08095fca34044c0 100644 (file)
@@ -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);
index cdd777287361ae7118134703bb0ed27a2470163d..2723177740b0b51a5feef04c7ce8d549060bab2e 100644 (file)
@@ -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))
index 8c9d2081af8eb1aba67dff4ab3b251fd7a06f3c9..2d32069091a9442a2dfdf08ed285cae73af838c4 100644 (file)
@@ -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 {
index bf3335a6a6be88169aab4c0a11cc17871f89741d..cd78d1887be4ce73315961a818113cf86f0da697 100644 (file)
@@ -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;
index a5f1e5df2f358e85dca1f91f440dac282aedc379..b2fdd792884d9e22dea4090ae074dba1140d443d 100644 (file)
@@ -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 */
index bf1d49b71febd6bf018eab06aff0bf6a278431e1..5a3132de45ef6c4835147fbb06d90a1b158f2ae7 100644 (file)
@@ -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) &&
index 7a4699c8ca14d55ae859fc1b4332e7911736db85..fde8d8c08a10a010ce90db0669f2eb17dba8484f 100644 (file)
@@ -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;
 }
index 0c38483a98c155e63c2cb3cb66aaf750f7a52de6..a5716f0379b522f7d32f0427713e82da9e6aa97c 100644 (file)
@@ -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,
index 9bce42d58c0545a1d84f8358e3dc5a4ebf423838..8e98b65216952a20c2eae24f3dfc3b7199f751b9 100644 (file)
@@ -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);
index b77e21bd15e34234e040ee166bff2b71b7455d6b..af8cccaefcdeff381c405f5c3b6c9ab2e224c045 100644 (file)
@@ -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;