]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Add a separate data structure for MBSSID parameters
authorManish Dharanenthiran <manish.dharanenthiran@oss.qualcomm.com>
Thu, 8 May 2025 17:27:14 +0000 (22:57 +0530)
committerJouni Malinen <j@w1.fi>
Thu, 22 May 2025 09:04:19 +0000 (12:04 +0300)
The MBSSID related parameters are present under struct
wpa_driver_ap_params, but this is not extensible for certain use cases
like updating the MBSSID and RNR elements post channel switch. Hence,
move this into a separate data structure named mbssid_data to hold all
MBSSID related parameters in a manner that can be used more easily
elsewhere.

Signed-off-by: Manish Dharanenthiran <manish.dharanenthiran@oss.qualcomm.com>
src/ap/beacon.c
src/drivers/driver.h
src/drivers/driver_nl80211.c

index c3f61fbbe88ee1477b1c04ff080e77e5857644e0..3bff0ae368fb6b377807f5c57372e00f36903227 100644 (file)
@@ -621,23 +621,23 @@ ieee802_11_build_ap_params_mbssid(struct hostapd_data *hapd,
                                 elem_count, elem_offset, NULL, 0, rnr_elem,
                                 &rnr_elem_count, rnr_elem_offset, rnr_len);
 
-       params->mbssid_tx_iface = tx_bss->conf->iface;
-       params->mbssid_index = hostapd_mbssid_get_bss_index(hapd);
-       params->mbssid_elem = elem;
-       params->mbssid_elem_len = end - elem;
-       params->mbssid_elem_count = elem_count;
-       params->mbssid_elem_offset = elem_offset;
-       params->rnr_elem = rnr_elem;
-       params->rnr_elem_len = rnr_len;
-       params->rnr_elem_count = rnr_elem_count;
-       params->rnr_elem_offset = rnr_elem_offset;
+       params->mbssid.mbssid_tx_iface = tx_bss->conf->iface;
+       params->mbssid.mbssid_index = hostapd_mbssid_get_bss_index(hapd);
+       params->mbssid.mbssid_elem = elem;
+       params->mbssid.mbssid_elem_len = end - elem;
+       params->mbssid.mbssid_elem_count = elem_count;
+       params->mbssid.mbssid_elem_offset = elem_offset;
+       params->mbssid.rnr_elem = rnr_elem;
+       params->mbssid.rnr_elem_len = rnr_len;
+       params->mbssid.rnr_elem_count = rnr_elem_count;
+       params->mbssid.rnr_elem_offset = rnr_elem_offset;
        if (iface->conf->mbssid == ENHANCED_MBSSID_ENABLED)
-               params->ema = true;
+               params->mbssid.ema = true;
 
-       params->mbssid_tx_iface_linkid = -1;
+       params->mbssid.mbssid_tx_iface_linkid = -1;
 #ifdef CONFIG_IEEE80211BE
        if (tx_bss->conf->mld_ap)
-               params->mbssid_tx_iface_linkid = tx_bss->mld_link_id;
+               params->mbssid.mbssid_tx_iface_linkid = tx_bss->mld_link_id;
 #endif /* CONFIG_IEEE80211BE */
 
        return 0;
@@ -2347,7 +2347,7 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd,
                }
                complete = hapd->iconf->mbssid == MBSSID_ENABLED ||
                        (hapd->iconf->mbssid == ENHANCED_MBSSID_ENABLED &&
-                        params->mbssid_elem_count == 1);
+                        params->mbssid.mbssid_elem_count == 1);
        }
 
        tailpos = hostapd_eid_ext_capab(hapd, tailpos, complete);
@@ -2395,7 +2395,7 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd,
 
        tailpos = hostapd_get_rsnxe(hapd, tailpos, tailend - tailpos);
        tailpos = hostapd_eid_mbssid_config(hapd, tailpos,
-                                           params->mbssid_elem_count);
+                                           params->mbssid.mbssid_elem_count);
 
 #ifdef CONFIG_IEEE80211AX
        if (hapd->iconf->ieee80211ax && !hapd->conf->disable_11ax) {
@@ -2641,14 +2641,14 @@ void ieee802_11_free_ap_params(struct wpa_driver_ap_params *params)
        params->head = NULL;
        os_free(params->proberesp);
        params->proberesp = NULL;
-       os_free(params->mbssid_elem);
-       params->mbssid_elem = NULL;
-       os_free(params->mbssid_elem_offset);
-       params->mbssid_elem_offset = NULL;
-       os_free(params->rnr_elem);
-       params->rnr_elem = NULL;
-       os_free(params->rnr_elem_offset);
-       params->rnr_elem_offset = NULL;
+       os_free(params->mbssid.mbssid_elem);
+       params->mbssid.mbssid_elem = NULL;
+       os_free(params->mbssid.mbssid_elem_offset);
+       params->mbssid.mbssid_elem_offset = NULL;
+       os_free(params->mbssid.rnr_elem);
+       params->mbssid.rnr_elem = NULL;
+       os_free(params->mbssid.rnr_elem_offset);
+       params->mbssid.rnr_elem_offset = NULL;
 #ifdef CONFIG_FILS
        os_free(params->fd_frame_tmpl);
        params->fd_frame_tmpl = NULL;
index 37003ac4ff577f6cd371a671514dc38605addb1b..2471b4ad8a169edb4fae806f6eb12558076b61fa 100644 (file)
@@ -1462,6 +1462,72 @@ struct unsol_bcast_probe_resp {
        size_t unsol_bcast_probe_resp_tmpl_len;
 };
 
+struct mbssid_data {
+       /**
+        * mbssid_tx_iface - Transmitting interface of the MBSSID set
+        */
+       const char *mbssid_tx_iface;
+
+       /**
+        * mbssid_tx_iface_linkid - Link ID of the transmitting interface if
+        * it is part of an MLD. Otherwise, -1.
+        */
+       int mbssid_tx_iface_linkid;
+
+       /**
+        * mbssid_index - The index of this BSS in the MBSSID set
+        */
+       unsigned int mbssid_index;
+
+       /**
+        * mbssid_elem - Buffer containing all MBSSID elements
+        */
+       u8 *mbssid_elem;
+
+       /**
+        * mbssid_elem_len - Total length of all MBSSID elements
+        */
+       size_t mbssid_elem_len;
+
+       /**
+        * mbssid_elem_count - The number of MBSSID elements
+        */
+       u8 mbssid_elem_count;
+
+       /**
+        * mbssid_elem_offset - Offsets to elements in mbssid_elem.
+        * Kernel will use these offsets to generate multiple BSSID beacons.
+        */
+       u8 **mbssid_elem_offset;
+
+       /**
+        * ema - Enhanced MBSSID advertisements support.
+        */
+       bool ema;
+
+       /**
+        * rnr_elem - This buffer contains all of reduced neighbor report (RNR)
+        * elements
+        */
+       u8 *rnr_elem;
+
+       /**
+        * rnr_elem_len - Length of rnr_elem buffer
+        */
+       size_t rnr_elem_len;
+
+       /**
+        * rnr_elem_count - Number of RNR elements
+        */
+       u8 rnr_elem_count;
+
+       /**
+        * rnr_elem_offset - The offsets to the elements in rnr_elem.
+        * The driver will use these to include RNR elements in EMA beacons.
+        */
+       u8 **rnr_elem_offset;
+};
+
 struct wpa_driver_ap_params {
        /**
         * head - Beacon head from IEEE 802.11 header to IEs before TIM IE
@@ -1800,46 +1866,11 @@ struct wpa_driver_ap_params {
        size_t fd_frame_tmpl_len;
 
        /**
-        * mbssid_tx_iface - Transmitting interface of the MBSSID set
-        */
-       const char *mbssid_tx_iface;
-
-       /**
-        * mbssid_tx_iface_linkid - Link ID of the transmitting interface if
-        * it is part of an MLD. Otherwise, -1.
-        */
-       int mbssid_tx_iface_linkid;
-
-       /**
-        * mbssid_index - The index of this BSS in the MBSSID set
-        */
-       unsigned int mbssid_index;
-
-       /**
-        * mbssid_elem - Buffer containing all MBSSID elements
-        */
-       u8 *mbssid_elem;
-
-       /**
-        * mbssid_elem_len - Total length of all MBSSID elements
-        */
-       size_t mbssid_elem_len;
-
-       /**
-        * mbssid_elem_count - The number of MBSSID elements
-        */
-       u8 mbssid_elem_count;
-
-       /**
-        * mbssid_elem_offset - Offsets to elements in mbssid_elem.
-        * Kernel will use these offsets to generate multiple BSSID beacons.
-        */
-       u8 **mbssid_elem_offset;
-
-       /**
-        * ema - Enhanced MBSSID advertisements support.
+        * mbssid - MBSSID element related params for Beacon frames
+        *
+        * This is used to add MBSSID element in beacon data.
         */
-       bool ema;
+       struct mbssid_data mbssid;
 
        /**
         * punct_bitmap - Preamble puncturing bitmap
@@ -1849,27 +1880,6 @@ struct wpa_driver_ap_params {
         */
        u16 punct_bitmap;
 
-       /**
-        * rnr_elem - This buffer contains all of reduced neighbor report (RNR)
-        * elements
-        */
-       u8 *rnr_elem;
-
-       /**
-        * rnr_elem_len - Length of rnr_elem buffer
-        */
-       size_t rnr_elem_len;
-
-       /**
-        * rnr_elem_count - Number of RNR elements
-        */
-       unsigned int rnr_elem_count;
-
-       /**
-        * rnr_elem_offset - The offsets to the elements in rnr_elem.
-        * The driver will use these to include RNR elements in EMA beacons.
-        */
-       u8 **rnr_elem_offset;
 
        /* Unsolicited broadcast Probe Response data */
        struct unsol_bcast_probe_resp ubpr;
index 2f8ed7428c0609973573712aabf9d02fc0f7978e..34167f96837a3676208cd6cbb0e9ad2e05f9b58d 100644 (file)
@@ -4919,8 +4919,7 @@ static int nl80211_unsol_bcast_probe_resp(struct i802_bss *bss,
 }
 
 
-static int nl80211_mbssid(struct nl_msg *msg,
-                        struct wpa_driver_ap_params *params)
+static int nl80211_mbssid(struct nl_msg *msg, struct mbssid_data *params)
 {
        struct nlattr *config, *elems;
        int ifidx;
@@ -5505,7 +5504,7 @@ static int wpa_driver_nl80211_set_ap(void *priv,
            nl80211_unsol_bcast_probe_resp(bss, msg, &params->ubpr) < 0)
                goto fail;
 
-       if (nl80211_mbssid(msg, params) < 0)
+       if (nl80211_mbssid(msg, &params->mbssid) < 0)
                goto fail;
 #endif /* CONFIG_IEEE80211AX */