Revert "[wpa_supplicant] cumilative patch from commit 4b755c967"
Revert submission 26533062-Supplicant_merge_June24
Reason for revert: https://b.corp.google.com/issues/349780869
Reverted changes: /q/submissionid:26533062-Supplicant_merge_June24
Change-Id: I6c9b7a4323fa7edde47617da6c1e0d8f6e6d5101
diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c
index 56bac45..ddbcabc 100644
--- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c
@@ -184,8 +184,6 @@
hostapd_set_generic_elem(hapd, (u8 *) "", 0);
}
- hostapd_neighbor_sync_own_report(hapd);
-
ieee802_11_set_beacon(hapd);
hostapd_update_wps(hapd);
@@ -397,6 +395,25 @@
#endif /* CONFIG_WEP */
+static void hostapd_clear_drv_priv(struct hostapd_data *hapd)
+{
+ unsigned int i;
+
+ for (i = 0; i < hapd->iface->interfaces->count; i++) {
+ struct hostapd_iface *iface = hapd->iface->interfaces->iface[i];
+
+ if (hapd->iface == iface || !iface)
+ continue;
+
+ if (iface->bss && iface->bss[0] &&
+ iface->bss[0]->mld_first_bss == hapd)
+ iface->bss[0]->drv_priv = NULL;
+ }
+
+ hapd->drv_priv = NULL;
+}
+
+
#ifdef CONFIG_IEEE80211BE
#ifdef CONFIG_TESTING_OPTIONS
@@ -418,7 +435,6 @@
ieee802_11_set_beacon(hapd);
if (!hapd->eht_mld_link_removal_count) {
- hostapd_free_link_stas(hapd);
hostapd_disable_iface(hapd->iface);
return;
}
@@ -480,8 +496,7 @@
vlan_deinit(hapd);
hostapd_acl_deinit(hapd);
#ifndef CONFIG_NO_RADIUS
- if (hostapd_mld_is_first_bss(hapd)) {
-#ifdef CONFIG_IEEE80211BE
+ if (!hapd->mld_first_bss) {
struct hapd_interfaces *ifaces = hapd->iface->interfaces;
size_t i;
@@ -500,7 +515,6 @@
h->radius_das = NULL;
}
}
-#endif /* CONFIG_IEEE80211BE */
radius_client_deinit(hapd->radius);
radius_das_deinit(hapd->radius_das);
}
@@ -534,20 +548,10 @@
* driver wrapper may have removed its internal instance
* and hapd->drv_priv is not valid anymore.
*/
- hapd->drv_priv = NULL;
+ hostapd_clear_drv_priv(hapd);
}
}
-#ifdef CONFIG_IEEE80211BE
- /* If the interface was not added as well as it is not the first BSS,
- * at least the link should be removed here since deinit will take care
- * of only the first BSS. */
- if (hapd->conf->mld_ap && !hapd->interface_added &&
- hapd->iface->bss[0] != hapd)
- hostapd_if_link_remove(hapd, WPA_IF_AP_BSS, hapd->conf->iface,
- hapd->mld_link_id);
-#endif /* CONFIG_IEEE80211BE */
-
wpabuf_free(hapd->time_adv);
hapd->time_adv = NULL;
@@ -610,41 +614,6 @@
}
-/* 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
@@ -685,7 +654,6 @@
void hostapd_cleanup_iface_partial(struct hostapd_iface *iface)
{
wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface);
- eloop_cancel_timeout(channel_list_update_timeout, iface, NULL);
#ifdef NEED_AP_MLME
hostapd_stop_setup_timers(iface);
#endif /* NEED_AP_MLME */
@@ -715,6 +683,7 @@
static void hostapd_cleanup_iface(struct hostapd_iface *iface)
{
wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface);
+ eloop_cancel_timeout(channel_list_update_timeout, iface, NULL);
eloop_cancel_timeout(hostapd_interface_setup_failure_handler, iface,
NULL);
@@ -1334,7 +1303,7 @@
u8 if_addr[ETH_ALEN];
int flush_old_stations = 1;
- if (!hostapd_mld_is_first_bss(hapd))
+ if (hapd->mld_first_bss)
wpa_printf(MSG_DEBUG,
"MLD: %s: Setting non-first BSS", __func__);
@@ -1496,7 +1465,7 @@
}
#endif /* CONFIG_SQLITE */
- if (hostapd_mld_is_first_bss(hapd)) {
+ if (!hapd->mld_first_bss) {
hapd->radius = radius_client_init(hapd, conf->radius);
if (!hapd->radius) {
wpa_printf(MSG_ERROR,
@@ -1529,17 +1498,10 @@
}
}
} else {
-#ifdef CONFIG_IEEE80211BE
- struct hostapd_data *f_bss;
-
wpa_printf(MSG_DEBUG,
"MLD: Using RADIUS client of the first BSS");
- 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 */
+ hapd->radius = hapd->mld_first_bss->radius;
+ hapd->radius_das = hapd->mld_first_bss->radius_das;
}
#endif /* CONFIG_NO_RADIUS */
@@ -1584,7 +1546,6 @@
wpa_printf(MSG_ERROR, "GAS server initialization failed");
return -1;
}
-#endif /* CONFIG_INTERWORKING */
if (conf->qos_map_set_len &&
hostapd_drv_set_qos_map(hapd, conf->qos_map_set,
@@ -1592,6 +1553,7 @@
wpa_printf(MSG_ERROR, "Failed to initialize QoS Map");
return -1;
}
+#endif /* CONFIG_INTERWORKING */
if (conf->bss_load_update_period && bss_load_update_init(hapd)) {
wpa_printf(MSG_ERROR, "BSS Load initialization failed");
@@ -1777,7 +1739,6 @@
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);
}
@@ -2074,11 +2035,10 @@
} else {
int ret;
- if (iface->conf->acs && !iface->is_ch_switch_dfs) {
+ if (iface->conf->acs) {
iface->freq = 0;
iface->conf->channel = 0;
}
- iface->is_ch_switch_dfs = false;
ret = configured_fixed_chan_to_freq(iface);
if (ret < 0)
@@ -2837,8 +2797,6 @@
hapd->rad_attr_db = NULL;
}
#endif /* CONFIG_SQLITE */
-
- hostapd_bss_link_deinit(hapd);
hostapd_cleanup(hapd);
}
@@ -2877,40 +2835,6 @@
}
-#ifdef CONFIG_IEEE80211BE
-
-static void hostapd_mld_ref_inc(struct hostapd_mld *mld)
-{
- if (!mld)
- return;
-
- if (mld->refcount == HOSTAPD_MLD_MAX_REF_COUNT) {
- wpa_printf(MSG_ERROR, "AP MLD %s: Ref count overflow",
- mld->name);
- return;
- }
-
- mld->refcount++;
-}
-
-
-static void hostapd_mld_ref_dec(struct hostapd_mld *mld)
-{
- if (!mld)
- return;
-
- if (!mld->refcount) {
- wpa_printf(MSG_ERROR, "AP MLD %s: Ref count underflow",
- mld->name);
- return;
- }
-
- mld->refcount--;
-}
-
-#endif /* CONFIG_IEEE80211BE */
-
-
void hostapd_interface_free(struct hostapd_iface *iface)
{
size_t j;
@@ -2918,10 +2842,6 @@
for (j = 0; j < iface->num_bss; j++) {
if (!iface->bss)
break;
-#ifdef CONFIG_IEEE80211BE
- if (iface->bss[j])
- hostapd_mld_ref_dec(iface->bss[j]->mld);
-#endif /* CONFIG_IEEE80211BE */
wpa_printf(MSG_DEBUG, "%s: free hapd %p",
__func__, iface->bss[j]);
os_free(iface->bss[j]);
@@ -2944,157 +2864,6 @@
}
-#ifdef CONFIG_IEEE80211BE
-static void hostapd_bss_alloc_link_id(struct hostapd_data *hapd)
-{
- hapd->mld_link_id = hapd->mld->next_link_id++;
- wpa_printf(MSG_DEBUG, "AP MLD: %s: Link ID %d assigned.",
- hapd->mld->name, hapd->mld_link_id);
-}
-#endif /* CONFIG_IEEE80211BE */
-
-
-static void hostapd_bss_setup_multi_link(struct hostapd_data *hapd,
- struct hapd_interfaces *interfaces)
-{
-#ifdef CONFIG_IEEE80211BE
- struct hostapd_mld *mld, **all_mld;
- struct hostapd_bss_config *conf;
- size_t i;
-
- conf = hapd->conf;
-
- if (!hapd->iconf || !hapd->iconf->ieee80211be || !conf->mld_ap ||
- conf->disable_11be)
- return;
-
- for (i = 0; i < interfaces->mld_count; i++) {
- mld = interfaces->mld[i];
-
- if (!mld || os_strcmp(conf->iface, mld->name) != 0)
- continue;
-
- hapd->mld = mld;
- hostapd_mld_ref_inc(mld);
- hostapd_bss_alloc_link_id(hapd);
- break;
- }
-
- if (hapd->mld)
- return;
-
- mld = os_zalloc(sizeof(struct hostapd_mld));
- if (!mld)
- goto fail;
-
- os_strlcpy(mld->name, conf->iface, sizeof(conf->iface));
- dl_list_init(&mld->links);
-
- wpa_printf(MSG_DEBUG, "AP MLD %s created", mld->name);
-
- hapd->mld = mld;
- hostapd_mld_ref_inc(mld);
- hostapd_bss_alloc_link_id(hapd);
-
- all_mld = os_realloc_array(interfaces->mld, interfaces->mld_count + 1,
- sizeof(struct hostapd_mld *));
- if (!all_mld)
- goto fail;
-
- interfaces->mld = all_mld;
- interfaces->mld[interfaces->mld_count] = mld;
- interfaces->mld_count++;
-
- return;
-fail:
- if (!mld)
- return;
-
- wpa_printf(MSG_DEBUG, "AP MLD %s: free mld %p", mld->name, mld);
- os_free(mld);
- hapd->mld = NULL;
-#endif /* CONFIG_IEEE80211BE */
-}
-
-
-static void hostapd_cleanup_unused_mlds(struct hapd_interfaces *interfaces)
-{
-#ifdef CONFIG_IEEE80211BE
- struct hostapd_mld *mld, **all_mld;
- size_t i, j, num_mlds;
- bool forced_remove, remove;
-
- if (!interfaces->mld)
- return;
-
- num_mlds = interfaces->mld_count;
-
- for (i = 0; i < interfaces->mld_count; i++) {
- mld = interfaces->mld[i];
- if (!mld)
- continue;
-
- remove = false;
- forced_remove = false;
-
- if (!mld->refcount)
- remove = true;
-
- /* If MLD is still being referenced but the number of interfaces
- * is zero, it is safe to force its deletion. Normally, this
- * should not happen but even if it does, let us free the
- * memory.
- */
- if (!remove && !interfaces->count)
- forced_remove = true;
-
- if (!remove && !forced_remove)
- continue;
-
- wpa_printf(MSG_DEBUG, "AP MLD %s: Freed%s", mld->name,
- forced_remove ? " (forced)" : "");
- os_free(mld);
- interfaces->mld[i] = NULL;
- num_mlds--;
- }
-
- if (!num_mlds) {
- interfaces->mld_count = 0;
- os_free(interfaces->mld);
- interfaces->mld = NULL;
- return;
- }
-
- all_mld = os_zalloc(num_mlds * sizeof(struct hostapd_mld *));
- if (!all_mld) {
- wpa_printf(MSG_ERROR,
- "AP MLD: Failed to re-allocate the MLDs. Expect issues");
- return;
- }
-
- for (i = 0, j = 0; i < interfaces->mld_count; i++) {
- mld = interfaces->mld[i];
- if (!mld)
- continue;
-
- all_mld[j++] = mld;
- }
-
- /* This should not happen */
- if (j != num_mlds) {
- wpa_printf(MSG_DEBUG,
- "AP MLD: Some error occurred while reallocating MLDs. Expect issues.");
- os_free(all_mld);
- return;
- }
-
- os_free(interfaces->mld);
- interfaces->mld = all_mld;
- interfaces->mld_count = num_mlds;
-#endif /* CONFIG_IEEE80211BE */
-}
-
-
/**
* hostapd_init - Allocate and initialize per-interface data
* @config_file: Path to the configuration file
@@ -3138,10 +2907,8 @@
if (hapd == NULL)
goto fail;
hapd->msg_ctx = hapd;
- hostapd_bss_setup_multi_link(hapd, interfaces);
}
- hapd_iface->is_ch_switch_dfs = false;
return hapd_iface;
fail:
@@ -3261,8 +3028,6 @@
iface->conf->last_bss = bss;
iface->bss[iface->num_bss] = hapd;
hapd->msg_ctx = hapd;
- hostapd_bss_setup_multi_link(hapd, interfaces);
-
bss_idx = iface->num_bss++;
conf->num_bss--;
@@ -3296,37 +3061,6 @@
}
-static void hostapd_cleanup_driver(const struct wpa_driver_ops *driver,
- void *drv_priv, struct hostapd_iface *iface)
-{
-#ifdef CONFIG_IEEE80211BE
- if (!driver || !driver->hapd_deinit || !drv_priv)
- return;
-
- /* In case of non-ML operation, de-init. But if ML operation exist,
- * even if that's the last BSS in the interface, the driver (drv) could
- * be in use for a different AP MLD. Hence, need to check if drv is
- * still being used by some other BSS before de-initiallizing. */
- if (!iface->bss[0]->conf->mld_ap) {
- driver->hapd_deinit(drv_priv);
- } else if (hostapd_mld_is_first_bss(iface->bss[0]) &&
- driver->is_drv_shared &&
- !driver->is_drv_shared(drv_priv, iface->bss[0])) {
- driver->hapd_deinit(drv_priv);
- } else if (hostapd_if_link_remove(iface->bss[0],
- WPA_IF_AP_BSS,
- iface->bss[0]->conf->iface,
- iface->bss[0]->mld_link_id)) {
- wpa_printf(MSG_WARNING, "Failed to remove BSS interface %s",
- iface->bss[0]->conf->iface);
- }
-#else /* CONFIG_IEEE80211BE */
- driver->hapd_deinit(drv_priv);
-#endif /* CONFIG_IEEE80211BE */
- iface->bss[0]->drv_priv = NULL;
-}
-
-
void hostapd_interface_deinit_free(struct hostapd_iface *iface)
{
const struct wpa_driver_ops *driver;
@@ -3343,7 +3077,11 @@
hostapd_interface_deinit(iface);
wpa_printf(MSG_DEBUG, "%s: driver=%p drv_priv=%p -> hapd_deinit",
__func__, driver, drv_priv);
- hostapd_cleanup_driver(driver, drv_priv, iface);
+ if (driver && driver->hapd_deinit && drv_priv) {
+ if (!iface->bss[0]->mld_first_bss)
+ driver->hapd_deinit(drv_priv);
+ hostapd_clear_drv_priv(iface->bss[0]);
+ }
hostapd_interface_free(iface);
}
@@ -3356,16 +3094,15 @@
wpa_printf(MSG_DEBUG, "%s: driver=%p drv_priv=%p -> hapd_deinit",
__func__, driver, drv_priv);
-
- hostapd_cleanup_driver(driver, drv_priv, hapd_iface);
-
if (driver && driver->hapd_deinit && drv_priv) {
+ if (!hapd_iface->bss[0]->mld_first_bss)
+ driver->hapd_deinit(drv_priv);
for (j = 0; j < hapd_iface->num_bss; j++) {
wpa_printf(MSG_DEBUG, "%s:bss[%d]->drv_priv=%p",
__func__, (int) j,
hapd_iface->bss[j]->drv_priv);
if (hapd_iface->bss[j]->drv_priv == drv_priv) {
- hapd_iface->bss[j]->drv_priv = NULL;
+ hostapd_clear_drv_priv(hapd_iface->bss[j]);
hapd_iface->extended_capa = NULL;
hapd_iface->extended_capa_mask = NULL;
hapd_iface->extended_capa_len = 0;
@@ -3375,22 +3112,6 @@
}
-static void hostapd_refresh_all_iface_beacons(struct hostapd_iface *hapd_iface)
-{
- size_t j;
-
- if (!hapd_iface->interfaces || hapd_iface->interfaces->count <= 1)
- return;
-
- for (j = 0; j < hapd_iface->interfaces->count; j++) {
- if (hapd_iface->interfaces->iface[j] == hapd_iface)
- continue;
-
- ieee802_11_update_beacons(hapd_iface->interfaces->iface[j]);
- }
-}
-
-
int hostapd_enable_iface(struct hostapd_iface *hapd_iface)
{
size_t j;
@@ -3429,8 +3150,6 @@
return -1;
}
- hostapd_refresh_all_iface_beacons(hapd_iface);
-
return 0;
}
@@ -3488,6 +3207,31 @@
return -1;
}
+#ifdef CONFIG_IEEE80211BE
+ if (hapd_iface->bss[0]->conf->mld_ap &&
+ !hapd_iface->bss[0]->mld_first_bss) {
+ /* Do not allow mld_first_bss disabling before other BSSs */
+ for (j = 0; j < hapd_iface->interfaces->count; ++j) {
+ struct hostapd_iface *h_iface =
+ hapd_iface->interfaces->iface[j];
+ struct hostapd_data *h_hapd = h_iface->bss[0];
+ struct hostapd_bss_config *h_conf = h_hapd->conf;
+
+ if (!h_conf->mld_ap ||
+ h_conf->mld_id !=
+ hapd_iface->bss[0]->conf->mld_id ||
+ h_iface == hapd_iface)
+ continue;
+
+ if (h_iface->state != HAPD_IFACE_DISABLED) {
+ wpa_printf(MSG_INFO,
+ "Do not allow disable mld_first_bss first");
+ return -1;
+ }
+ }
+ }
+#endif /* CONFIG_IEEE80211BE */
+
wpa_msg(hapd_iface->bss[0]->msg_ctx, MSG_INFO, AP_EVENT_DISABLED);
driver = hapd_iface->bss[0]->driver;
drv_priv = hapd_iface->bss[0]->drv_priv;
@@ -3505,7 +3249,6 @@
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);
}
@@ -3519,7 +3262,6 @@
wpa_printf(MSG_DEBUG, "Interface %s disabled",
hapd_iface->bss[0]->conf->iface);
hostapd_set_state(hapd_iface, HAPD_IFACE_DISABLED);
- hostapd_refresh_all_iface_beacons(hapd_iface);
return 0;
}
@@ -3628,7 +3370,6 @@
return -1;
}
hapd->msg_ctx = hapd;
- hostapd_bss_setup_multi_link(hapd, hapd_iface->interfaces);
}
hapd_iface->conf = conf;
@@ -3702,7 +3443,6 @@
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--;
@@ -3711,9 +3451,6 @@
__func__, hapd, hapd->conf->iface);
hostapd_config_free_bss(hapd->conf);
hapd->conf = NULL;
-#ifdef CONFIG_IEEE80211BE
- hostapd_mld_ref_dec(hapd->mld);
-#endif /* CONFIG_IEEE80211BE */
os_free(hapd);
return -1;
}
@@ -3803,11 +3540,7 @@
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);
-#ifdef CONFIG_IEEE80211BE
- hostapd_mld_ref_dec(hapd->mld);
-#endif /* CONFIG_IEEE80211BE */
os_free(hapd);
hapd_iface->bss[i] = NULL;
}
@@ -3817,7 +3550,6 @@
if (new_iface) {
interfaces->count--;
interfaces->iface[interfaces->count] = NULL;
- hostapd_cleanup_unused_mlds(interfaces);
}
hostapd_cleanup_iface(hapd_iface);
}
@@ -3840,9 +3572,6 @@
__func__, hapd, hapd->conf->iface);
hostapd_config_free_bss(hapd->conf);
hapd->conf = NULL;
-#ifdef CONFIG_IEEE80211BE
- hostapd_mld_ref_dec(hapd->mld);
-#endif /* CONFIG_IEEE80211BE */
os_free(hapd);
iface->num_bss--;
@@ -3885,8 +3614,6 @@
k++;
}
interfaces->count--;
- hostapd_cleanup_unused_mlds(interfaces);
-
return 0;
}
@@ -4186,8 +3913,7 @@
mode ? &mode->he_capab[IEEE80211_MODE_AP] :
NULL,
mode ? &mode->eht_capab[IEEE80211_MODE_AP] :
- NULL,
- hostapd_get_punct_bitmap(hapd)))
+ NULL))
return -1;
switch (params->bandwidth) {
@@ -4677,7 +4403,6 @@
#ifdef CONFIG_IEEE80211BE
-
struct hostapd_data * hostapd_mld_get_link_bss(struct hostapd_data *hapd,
u8 link_id)
{
@@ -4686,8 +4411,9 @@
for (i = 0; i < hapd->iface->interfaces->count; i++) {
struct hostapd_iface *h = hapd->iface->interfaces->iface[i];
struct hostapd_data *h_hapd = h->bss[0];
+ struct hostapd_bss_config *hconf = h_hapd->conf;
- if (!hostapd_is_ml_partner(hapd, h_hapd))
+ if (!hconf->mld_ap || hconf->mld_id != hapd->conf->mld_id)
continue;
if (h_hapd->mld_link_id == link_id)
@@ -4696,141 +4422,4 @@
return NULL;
}
-
-
-bool hostapd_is_ml_partner(struct hostapd_data *hapd1,
- struct hostapd_data *hapd2)
-{
- if (!hapd1->conf->mld_ap || !hapd2->conf->mld_ap)
- return false;
-
- return !os_strcmp(hapd1->conf->iface, hapd2->conf->iface);
-}
-
-
-u8 hostapd_get_mld_id(struct hostapd_data *hapd)
-{
- if (!hapd->conf->mld_ap)
- return 255;
-
- /* MLD ID 0 represents self */
- return 0;
-
- /* TODO: MLD ID for Multiple BSS cases */
-}
-
-
-int hostapd_mld_add_link(struct hostapd_data *hapd)
-{
- struct hostapd_mld *mld = hapd->mld;
-
- if (!hapd->conf->mld_ap)
- return 0;
-
- /* Should not happen */
- if (!mld)
- return -1;
-
- dl_list_add_tail(&mld->links, &hapd->link);
- mld->num_links++;
-
- wpa_printf(MSG_DEBUG, "AP MLD %s: Link ID %d added. num_links: %d",
- mld->name, hapd->mld_link_id, mld->num_links);
-
- if (mld->fbss)
- return 0;
-
- mld->fbss = hapd;
- wpa_printf(MSG_DEBUG, "AP MLD %s: First link BSS set to %p",
- mld->name, mld->fbss);
- return 0;
-}
-
-
-int hostapd_mld_remove_link(struct hostapd_data *hapd)
-{
- struct hostapd_mld *mld = hapd->mld;
- struct hostapd_data *next_fbss;
-
- if (!hapd->conf->mld_ap)
- return 0;
-
- /* Should not happen */
- if (!mld)
- return -1;
-
- dl_list_del(&hapd->link);
- mld->num_links--;
-
- wpa_printf(MSG_DEBUG, "AP MLD %s: Link ID %d removed. num_links: %d",
- mld->name, hapd->mld_link_id, mld->num_links);
-
- if (mld->fbss != hapd)
- return 0;
-
- /* If the list is empty, all links are removed */
- if (dl_list_empty(&mld->links)) {
- mld->fbss = NULL;
- } else {
- next_fbss = dl_list_entry(mld->links.next, struct hostapd_data,
- link);
- mld->fbss = next_fbss;
- }
-
- wpa_printf(MSG_DEBUG, "AP MLD %s: First link BSS set to %p",
- mld->name, mld->fbss);
- return 0;
-}
-
-
-bool hostapd_mld_is_first_bss(struct hostapd_data *hapd)
-{
- struct hostapd_mld *mld = hapd->mld;
-
- if (!hapd->conf->mld_ap)
- return true;
-
- /* Should not happen */
- if (!mld)
- return false;
-
- /* If fbss is not set, it is safe to assume the caller is the first BSS.
- */
- if (!mld->fbss)
- return true;
-
- return hapd == mld->fbss;
-}
-
-
-struct hostapd_data * hostapd_mld_get_first_bss(struct hostapd_data *hapd)
-{
- struct hostapd_mld *mld = hapd->mld;
-
- if (!hapd->conf->mld_ap)
- return NULL;
-
- /* Should not happen */
- if (!mld)
- return NULL;
-
- return mld->fbss;
-}
-
#endif /* CONFIG_IEEE80211BE */
-
-
-u16 hostapd_get_punct_bitmap(struct hostapd_data *hapd)
-{
- u16 punct_bitmap = 0;
-
-#ifdef CONFIG_IEEE80211BE
- punct_bitmap = hapd->iconf->punct_bitmap;
-#ifdef CONFIG_TESTING_OPTIONS
- if (!punct_bitmap)
- punct_bitmap = hapd->conf->eht_oper_puncturing_override;
-#endif /* CONFIG_TESTING_OPTIONS */
-#endif /* CONFIG_IEEE80211BE */
-
- return punct_bitmap;
-}