From: Manish Dharanenthiran Date: Thu, 8 May 2025 17:27:14 +0000 (+0530) Subject: Add a separate data structure for MBSSID parameters X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8d286a27cee2b6caadb59e8716a65ca68e2eaf5b;p=thirdparty%2Fhostap.git Add a separate data structure for MBSSID parameters 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 --- diff --git a/src/ap/beacon.c b/src/ap/beacon.c index c3f61fbbe..3bff0ae36 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -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; diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 37003ac4f..2471b4ad8 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -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; diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index 2f8ed7428..34167f968 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -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, ¶ms->ubpr) < 0) goto fail; - if (nl80211_mbssid(msg, params) < 0) + if (nl80211_mbssid(msg, ¶ms->mbssid) < 0) goto fail; #endif /* CONFIG_IEEE80211AX */