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;
-}