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/hostapd/Android.bp b/hostapd/Android.bp
index 9bd5d04..8a7dacf 100644
--- a/hostapd/Android.bp
+++ b/hostapd/Android.bp
@@ -239,7 +239,6 @@
         "src/common/ieee802_11_common.c",
         "src/common/wpa_common.c",
         "src/common/hw_features_common.c",
-        "src/common/ptksa_cache.c",
         "src/eapol_auth/eapol_auth_sm.c",
         "src/eapol_auth/eapol_auth_dump.c",
         "src/ap/vlan_init.c",
@@ -331,7 +330,6 @@
         "src/ap/ap_list.c",
         "src/ap/comeback_token.c",
         "src/pasn/pasn_responder.c",
-        "src/pasn/pasn_common.c",
         "src/ap/ieee802_11.c",
         "src/ap/hw_features.c",
         "src/ap/dfs.c",
diff --git a/hostapd/Android.mk b/hostapd/Android.mk
index 227e88c..35ae4fb 100644
--- a/hostapd/Android.mk
+++ b/hostapd/Android.mk
@@ -170,7 +170,6 @@
 OBJS += src/common/ieee802_11_common.c
 OBJS += src/common/wpa_common.c
 OBJS += src/common/hw_features_common.c
-OBJS += src/common/ptksa_cache.c
 
 OBJS += src/eapol_auth/eapol_auth_sm.c
 
@@ -615,6 +614,7 @@
 NEED_HMAC_SHA384_KDF=y
 NEED_SHA256=y
 NEED_SHA384=y
+OBJS += src/common/ptksa_cache.c
 endif
 
 ifdef CONFIG_EAP_IKEV2
@@ -667,11 +667,6 @@
 OBJS += src/eap_common/chap.c
 endif
 
-ifdef CONFIG_RADIUS_TLS
-TLS_FUNCS=y
-L_CFLAGS += -DCONFIG_RADIUS_TLS
-endif
-
 ifdef TLS_FUNCS
 NEED_DES=y
 # Shared TLS functions (needed for EAP_TLS, EAP_PEAP, and EAP_TTLS)
@@ -1071,7 +1066,6 @@
 OBJS += src/ap/ap_list.c
 OBJS += src/ap/comeback_token.c
 OBJS += src/pasn/pasn_responder.c
-OBJS += src/pasn/pasn_common.c
 OBJS += src/ap/ieee802_11.c
 OBJS += src/ap/hw_features.c
 OBJS += src/ap/dfs.c
diff --git a/hostapd/Makefile b/hostapd/Makefile
index 489922c..274a82d 100644
--- a/hostapd/Makefile
+++ b/hostapd/Makefile
@@ -84,7 +84,6 @@
 OBJS += ../src/ap/bss_load.o
 OBJS += ../src/ap/neighbor_db.o
 OBJS += ../src/ap/rrm.o
-OBJS += ../src/common/ptksa_cache.o
 
 OBJS_c = hostapd_cli.o
 OBJS_c += ../src/common/wpa_ctrl.o
@@ -625,6 +624,7 @@
 NEED_HMAC_SHA384_KDF=y
 NEED_SHA256=y
 NEED_SHA384=y
+OBJS += ../src/common/ptksa_cache.o
 endif
 
 ifdef CONFIG_EAP_IKEV2
@@ -686,11 +686,6 @@
 OBJS += ../src/eap_common/chap.o
 endif
 
-ifdef CONFIG_RADIUS_TLS
-TLS_FUNCS=y
-CFLAGS += -DCONFIG_RADIUS_TLS
-endif
-
 ifdef TLS_FUNCS
 NEED_DES=y
 # Shared TLS functions (needed for EAP_TLS, EAP_PEAP, and EAP_TTLS)
@@ -1201,7 +1196,6 @@
 OBJS += ../src/ap/ap_list.o
 OBJS += ../src/ap/comeback_token.o
 OBJS += ../src/pasn/pasn_responder.o
-OBJS += ../src/pasn/pasn_common.o
 OBJS += ../src/ap/ieee802_11.o
 OBJS += ../src/ap/hw_features.o
 OBJS += ../src/ap/dfs.o
diff --git a/hostapd/android.config b/hostapd/android.config
index 4040d41..9d20c8d 100644
--- a/hostapd/android.config
+++ b/hostapd/android.config
@@ -126,9 +126,6 @@
 # Build IPv6 support for RADIUS operations
 CONFIG_IPV6=y
 
-# Include support fo RADIUS/TLS into the RADIUS client
-#CONFIG_RADIUS_TLS=y
-
 # IEEE Std 802.11r-2008 (Fast BSS Transition)
 #CONFIG_IEEE80211R=y
 
diff --git a/hostapd/config_file.c b/hostapd/config_file.c
index 76e9249..79cc1c2 100644
--- a/hostapd/config_file.c
+++ b/hostapd/config_file.c
@@ -1678,8 +1678,6 @@
 	return 0;
 }
 
-#endif /* CONFIG_INTERWORKING */
-
 
 static int parse_qos_map_set(struct hostapd_bss_config *bss,
 			     char *buf, int line)
@@ -1721,6 +1719,8 @@
 	return 0;
 }
 
+#endif /* CONFIG_INTERWORKING */
+
 
 #ifdef CONFIG_HS20
 static int hs20_parse_conn_capab(struct hostapd_bss_config *bss, char *buf,
@@ -2869,37 +2869,6 @@
 		os_free(bss->radius->auth_server->shared_secret);
 		bss->radius->auth_server->shared_secret = (u8 *) os_strdup(pos);
 		bss->radius->auth_server->shared_secret_len = len;
-	} else if (bss->radius->auth_server &&
-		   os_strcmp(buf, "auth_server_type") == 0) {
-		if (os_strcmp(pos, "UDP") == 0) {
-			bss->radius->auth_server->tls = false;
-#ifdef CONFIG_RADIUS_TLS
-		} else if (os_strcmp(pos, "TLS") == 0) {
-			bss->radius->auth_server->tls = true;
-#endif /* CONFIG_RADIUS_TLS */
-		} else {
-			wpa_printf(MSG_ERROR, "Line %d: unsupported RADIUS type '%s'",
-				   line, pos);
-			return 1;
-		}
-#ifdef CONFIG_RADIUS_TLS
-	} else if (bss->radius->auth_server &&
-		   os_strcmp(buf, "auth_server_ca_cert") == 0) {
-		os_free(bss->radius->auth_server->ca_cert);
-		bss->radius->auth_server->ca_cert = os_strdup(pos);
-	} else if (bss->radius->auth_server &&
-		   os_strcmp(buf, "auth_server_client_cert") == 0) {
-		os_free(bss->radius->auth_server->client_cert);
-		bss->radius->auth_server->client_cert = os_strdup(pos);
-	} else if (bss->radius->auth_server &&
-		   os_strcmp(buf, "auth_server_private_key") == 0) {
-		os_free(bss->radius->auth_server->private_key);
-		bss->radius->auth_server->private_key = os_strdup(pos);
-	} else if (bss->radius->auth_server &&
-		   os_strcmp(buf, "auth_server_private_key_passwd") == 0) {
-		os_free(bss->radius->auth_server->private_key_passwd);
-		bss->radius->auth_server->private_key_passwd = os_strdup(pos);
-#endif /* CONFIG_RADIUS_TLS */
 	} else if (os_strcmp(buf, "acct_server_addr") == 0) {
 		if (hostapd_config_read_radius_addr(
 			    &bss->radius->acct_servers,
@@ -2934,37 +2903,6 @@
 		os_free(bss->radius->acct_server->shared_secret);
 		bss->radius->acct_server->shared_secret = (u8 *) os_strdup(pos);
 		bss->radius->acct_server->shared_secret_len = len;
-	} else if (bss->radius->acct_server &&
-		   os_strcmp(buf, "acct_server_type") == 0) {
-		if (os_strcmp(pos, "UDP") == 0) {
-			bss->radius->acct_server->tls = false;
-#ifdef CONFIG_RADIUS_TLS
-		} else if (os_strcmp(pos, "TLS") == 0) {
-			bss->radius->acct_server->tls = true;
-#endif /* CONFIG_RADIUS_TLS */
-		} else {
-			wpa_printf(MSG_ERROR, "Line %d: unsupported RADIUS type '%s'",
-				   line, pos);
-			return 1;
-		}
-#ifdef CONFIG_RADIUS_TLS
-	} else if (bss->radius->acct_server &&
-		   os_strcmp(buf, "acct_server_ca_cert") == 0) {
-		os_free(bss->radius->acct_server->ca_cert);
-		bss->radius->acct_server->ca_cert = os_strdup(pos);
-	} else if (bss->radius->acct_server &&
-		   os_strcmp(buf, "acct_server_client_cert") == 0) {
-		os_free(bss->radius->acct_server->client_cert);
-		bss->radius->acct_server->client_cert = os_strdup(pos);
-	} else if (bss->radius->acct_server &&
-		   os_strcmp(buf, "acct_server_private_key") == 0) {
-		os_free(bss->radius->acct_server->private_key);
-		bss->radius->acct_server->private_key = os_strdup(pos);
-	} else if (bss->radius->acct_server &&
-		   os_strcmp(buf, "acct_server_private_key_passwd") == 0) {
-		os_free(bss->radius->acct_server->private_key_passwd);
-		bss->radius->acct_server->private_key_passwd = os_strdup(pos);
-#endif /* CONFIG_RADIUS_TLS */
 	} else if (os_strcmp(buf, "radius_retry_primary_interval") == 0) {
 		bss->radius->retry_primary_interval = atoi(pos);
 	} else if (os_strcmp(buf, "radius_acct_interim_interval") == 0) {
@@ -4258,10 +4196,10 @@
 		bss->gas_frag_limit = val;
 	} else if (os_strcmp(buf, "gas_comeback_delay") == 0) {
 		bss->gas_comeback_delay = atoi(pos);
-#endif /* CONFIG_INTERWORKING */
 	} else if (os_strcmp(buf, "qos_map_set") == 0) {
 		if (parse_qos_map_set(bss, pos, line) < 0)
 			return 1;
+#endif /* CONFIG_INTERWORKING */
 #ifdef CONFIG_RADIUS_TEST
 	} else if (os_strcmp(buf, "dump_msk_file") == 0) {
 		os_free(bss->dump_msk_file);
@@ -4666,10 +4604,6 @@
 				WLAN_RRM_CAPS_BEACON_REPORT_PASSIVE |
 				WLAN_RRM_CAPS_BEACON_REPORT_ACTIVE |
 				WLAN_RRM_CAPS_BEACON_REPORT_TABLE;
-	} else if (os_strcmp(buf, "rrm_link_measurement_report") == 0) {
-		if (atoi(pos))
-			bss->radio_measurements[0] |=
-				WLAN_RRM_CAPS_LINK_MEASUREMENT;
 	} else if (os_strcmp(buf, "gas_address3") == 0) {
 		bss->gas_address3 = atoi(pos);
 	} else if (os_strcmp(buf, "stationary_ap") == 0) {
@@ -4810,36 +4744,6 @@
 		}
 
 		bss->multi_ap = val;
-	} else if (os_strcmp(buf, "multi_ap_profile") == 0) {
-		int val = atoi(pos);
-
-		if (val < MULTI_AP_PROFILE_1 || val > MULTI_AP_PROFILE_MAX) {
-			wpa_printf(MSG_ERROR,
-				   "Line %d: Invalid multi_ap_profile '%s'",
-				   line, buf);
-			return -1;
-		}
-		bss->multi_ap_profile = val;
-	} else if (os_strcmp(buf, "multi_ap_client_disallow") == 0) {
-		int val = atoi(pos);
-
-		if (val < 0 || val > 3) {
-			wpa_printf(MSG_ERROR,
-				   "Line %d: Invalid multi_ap_client_allow '%s'",
-				   line, buf);
-			return -1;
-		}
-		bss->multi_ap_client_disallow = val;
-	} else if (os_strcmp(buf, "multi_ap_vlanid") == 0) {
-		int val = atoi(pos);
-
-		if (val < 0 || val > MAX_VLAN_ID) {
-			wpa_printf(MSG_ERROR,
-				   "Line %d: Invalid multi_ap_vlan_id '%s'",
-				   line, buf);
-			return -1;
-		}
-		bss->multi_ap_vlanid = val;
 	} else if (os_strcmp(buf, "rssi_reject_assoc_rssi") == 0) {
 		conf->rssi_reject_assoc_rssi = atoi(pos);
 	} else if (os_strcmp(buf, "rssi_reject_assoc_timeout") == 0) {
@@ -5052,6 +4956,8 @@
 		conf->punct_acs_threshold = val;
 	} else if (os_strcmp(buf, "mld_ap") == 0) {
 		bss->mld_ap = !!atoi(pos);
+	} else if (os_strcmp(buf, "mld_id") == 0) {
+		bss->mld_id = atoi(pos);
 	} else if (os_strcmp(buf, "mld_addr") == 0) {
 		if (hwaddr_aton(pos, bss->mld_addr)) {
 			wpa_printf(MSG_ERROR, "Line %d: Invalid mld_addr",
diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c
index d07567d..a6b16c2 100644
--- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c
@@ -1309,8 +1309,6 @@
 			hostapd_disassoc_deny_mac(hapd);
 		} else if (os_strcasecmp(cmd, "accept_mac_file") == 0) {
 			hostapd_disassoc_accept_mac(hapd);
-		} else if (os_strcasecmp(cmd, "ssid") == 0) {
-			hostapd_neighbor_sync_own_report(hapd);
 		} else if (os_strncmp(cmd, "wme_ac_", 7) == 0 ||
 			   os_strncmp(cmd, "wmm_ac_", 7) == 0) {
 			hapd->parameter_set_count++;
@@ -1948,7 +1946,7 @@
 
 #ifdef CONFIG_IEEE80211BE
 	if (hapd->conf->mld_ap)
-		addr = hapd->mld->mld_addr;
+		addr = hapd->mld_addr;
 #endif /* CONFIG_IEEE80211BE */
 	hapd->l2_test = l2_packet_init(ifname, addr,
 					ETHERTYPE_IP, hostapd_data_test_rx,
@@ -2644,8 +2642,6 @@
 	unsigned int i;
 	int bandwidth;
 	u8 chan;
-	unsigned int num_err = 0;
-	int err = 0;
 
 	ret = hostapd_parse_csa_settings(pos, &settings);
 	if (ret)
@@ -2719,7 +2715,6 @@
 			   settings.freq_params.center_freq1);
 
 		/* Perform CAC and switch channel */
-		iface->is_ch_switch_dfs = true;
 		hostapd_switch_channel_fallback(iface, &settings.freq_params);
 		return 0;
 	}
@@ -2730,14 +2725,15 @@
 		hostapd_chan_switch_config(iface->bss[i],
 					   &settings.freq_params);
 
-		err = hostapd_switch_channel(iface->bss[i], &settings);
-		if (err) {
-			ret = err;
-			num_err++;
+		ret = hostapd_switch_channel(iface->bss[i], &settings);
+		if (ret) {
+			/* FIX: What do we do if CSA fails in the middle of
+			 * submitting multi-BSS CSA requests? */
+			return ret;
 		}
 	}
 
-	return (iface->num_bss == num_err) ? ret : 0;
+	return 0;
 #else /* NEED_AP_MLME */
 	return -1;
 #endif /* NEED_AP_MLME */
@@ -3211,26 +3207,6 @@
 }
 
 
-static int hostapd_ctrl_iface_req_link_measurement(struct hostapd_data *hapd,
-						   const char *cmd, char *reply,
-						   size_t reply_size)
-{
-	u8 addr[ETH_ALEN];
-	int ret;
-
-	if (hwaddr_aton(cmd, addr)) {
-		wpa_printf(MSG_ERROR,
-			   "CTRL: REQ_LINK_MEASUREMENT: Invalid MAC address");
-		return -1;
-	}
-
-	ret = hostapd_send_link_measurement_req(hapd, addr);
-	if (ret >= 0)
-		ret = os_snprintf(reply, reply_size, "%d", ret);
-	return ret;
-}
-
-
 static int hostapd_ctrl_iface_show_neighbor(struct hostapd_data *hapd,
 					    char *buf, size_t buflen)
 {
@@ -3501,8 +3477,10 @@
 	for (i = 0; i < iface->interfaces->count; ++i) {
 		struct hostapd_iface *h_iface = iface->interfaces->iface[i];
 		struct hostapd_data *h_hapd = h_iface->bss[0];
+		struct hostapd_bss_config *h_conf = h_hapd->conf;
 
-		if (!hostapd_is_ml_partner(h_hapd, iface->bss[0]))
+		if (!h_conf->mld_ap ||
+		    h_conf->mld_id != iface->bss[0]->conf->mld_id)
 			continue;
 
 		if (hostapd_enable_iface(h_iface)) {
@@ -3526,6 +3504,7 @@
 static int hostapd_ctrl_iface_disable_mld(struct hostapd_iface *iface)
 {
 	unsigned int i;
+	struct hostapd_iface *first_iface = NULL;
 
 	if (!iface || !iface->bss[0]->conf->mld_ap) {
 		wpa_printf(MSG_ERROR,
@@ -3539,19 +3518,32 @@
 	for (i = 0; i < iface->interfaces->count; ++i) {
 		struct hostapd_iface *h_iface = iface->interfaces->iface[i];
 		struct hostapd_data *h_hapd = h_iface->bss[0];
+		struct hostapd_bss_config *h_conf = h_hapd->conf;
 
-		if (!hostapd_is_ml_partner(h_hapd, iface->bss[0]))
+		if (!h_conf->mld_ap ||
+		    h_conf->mld_id != iface->bss[0]->conf->mld_id)
 			continue;
 
+		if (!h_hapd->mld_first_bss) {
+			first_iface = h_iface;
+			continue;
+		}
 		hostapd_disable_iface_bss(iface);
 	}
 
+	if (first_iface)
+		hostapd_disable_iface_bss(first_iface);
+
 	/* Then, fully disable interfaces */
+
 	for (i = 0; i < iface->interfaces->count; ++i) {
 		struct hostapd_iface *h_iface = iface->interfaces->iface[i];
 		struct hostapd_data *h_hapd = h_iface->bss[0];
+		struct hostapd_bss_config *h_conf = h_hapd->conf;
 
-		if (!hostapd_is_ml_partner(h_hapd, iface->bss[0]))
+		if (!h_conf->mld_ap ||
+		    h_conf->mld_id != iface->bss[0]->conf->mld_id ||
+		    !h_hapd->mld_first_bss)
 			continue;
 
 		if (hostapd_disable_iface(h_iface)) {
@@ -3560,6 +3552,11 @@
 		}
 	}
 
+	if (first_iface && hostapd_disable_iface(first_iface)) {
+		wpa_printf(MSG_ERROR, "Disabling AP MLD failed");
+		return -1;
+	}
+
 	return 0;
 }
 
@@ -4209,9 +4206,6 @@
 	} else if (os_strncmp(buf, "REQ_BEACON ", 11) == 0) {
 		reply_len = hostapd_ctrl_iface_req_beacon(hapd, buf + 11,
 							  reply, reply_size);
-	} else if (os_strncmp(buf, "REQ_LINK_MEASUREMENT ", 21) == 0) {
-		reply_len = hostapd_ctrl_iface_req_link_measurement(
-			hapd, buf + 21, reply, reply_size);
 	} else if (os_strcmp(buf, "DRIVER_FLAGS") == 0) {
 		reply_len = hostapd_ctrl_driver_flags(hapd->iface, reply,
 						      reply_size);
@@ -5368,7 +5362,7 @@
 			reply_len = -1;
 	} else if (os_strncmp(buf, "INTERFACES", 10) == 0) {
 		reply_len = hostapd_global_ctrl_iface_interfaces(
-			interfaces, buf + 10, reply, reply_size);
+			interfaces, buf + 10, reply, sizeof(buffer));
 	} else if (os_strcmp(buf, "TERMINATE") == 0) {
 		eloop_terminate();
 	} else {
diff --git a/hostapd/defconfig b/hostapd/defconfig
index 43cf99f..5d769e9 100644
--- a/hostapd/defconfig
+++ b/hostapd/defconfig
@@ -141,9 +141,6 @@
 # Build IPv6 support for RADIUS operations
 CONFIG_IPV6=y
 
-# Include support fo RADIUS/TLS into the RADIUS client
-#CONFIG_RADIUS_TLS=y
-
 # IEEE Std 802.11r-2008 (Fast BSS Transition)
 #CONFIG_IEEE80211R=y
 
diff --git a/hostapd/hostapd.conf b/hostapd/hostapd.conf
index e34d75c..1357649 100644
--- a/hostapd/hostapd.conf
+++ b/hostapd/hostapd.conf
@@ -1071,6 +1071,9 @@
 # 1 = yes (MLO)
 #mld_ap=0
 
+# MLD ID - Affiliated MLD ID
+#mld_id=1
+
 # AP MLD MAC address
 # The configured address will be set as the interface hardware address and used
 # as the AP MLD MAC address. If not set, the current interface hardware address
@@ -1578,16 +1581,6 @@
 #acct_server_port=1813
 #acct_server_shared_secret=secret2
 
-# RADIUS/TLS instead of RADIUS/UDP
-#auth_server_addr=127.0.0.1
-#auth_server_port=2083
-#auth_server_type=TLS
-#auth_server_shared_secret=radsec
-#auth_server_ca_cert=<path to trusted CA certificate(s)>
-#auth_server_client_cert=<path to client certificate>
-#auth_server_private_key=<path to private key>
-#auth_server_private_key_passwd=<password for decrypting private key>
-
 # Retry interval for trying to return to the primary RADIUS server (in
 # seconds). RADIUS client code will automatically try to use the next server
 # when the current server is not replying to requests. If this interval is set,
@@ -2562,23 +2555,6 @@
 #multi_ap_backhaul_wpa_psk=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
 #multi_ap_backhaul_wpa_passphrase=secret passphrase
 
-# Multi-AP Profile
-# Indicate the supported Multi-AP profile (default: 2)
-# 1 = Supports Multi-AP profile 1 as defined in Wi-Fi EasyMesh specification
-# 2 = Supports Multi-AP profile 2 as defined in Wi-Fi EasyMesh specification
-#multi_ap_profile=2
-
-# Multi-AP client disallow
-# Used to disallow profile specific backhaul STA association
-# Bitmap of the disallowed Profile-X profiles
-# 1 = Profile-1 Backhaul STA association disallowed
-# 2 = Profile-2 Backhaul STA association disallowed
-#multi_ap_client_disallow=0
-
-# Multi-AP VLAN ID
-# A valid non-zero VLAN ID will be used to update Default IEEE 802.1Q Setting
-#multi_ap_vlanid=0
-
 # WPS UPnP interface
 # If set, support for external Registrars is enabled.
 #upnp_iface=br0
@@ -3112,9 +3088,6 @@
 # Enable neighbor report via radio measurements
 #rrm_neighbor_report=1
 
-# Enable link measurement report via radio measurements
-#rrm_link_measurement_report=1
-
 # Enable beacon report via radio measurements
 #rrm_beacon_report=1
 
diff --git a/hostapd/hostapd_cli.c b/hostapd/hostapd_cli.c
index e1fe286..8fb6119 100644
--- a/hostapd/hostapd_cli.c
+++ b/hostapd/hostapd_cli.c
@@ -1215,14 +1215,14 @@
 
 
 static int hostapd_cli_cmd_enable(struct wpa_ctrl *ctrl, int argc,
-				  char *argv[])
+				      char *argv[])
 {
 	return wpa_ctrl_command(ctrl, "ENABLE");
 }
 
 
 static int hostapd_cli_cmd_reload(struct wpa_ctrl *ctrl, int argc,
-				  char *argv[])
+				      char *argv[])
 {
 	return wpa_ctrl_command(ctrl, "RELOAD");
 }
@@ -1243,7 +1243,7 @@
 
 
 static int hostapd_cli_cmd_disable(struct wpa_ctrl *ctrl, int argc,
-				   char *argv[])
+				      char *argv[])
 {
 	return wpa_ctrl_command(ctrl, "DISABLE");
 }
@@ -1257,26 +1257,19 @@
 
 
 static int hostapd_cli_cmd_disable_mld(struct wpa_ctrl *ctrl, int argc,
-				       char *argv[])
+				      char *argv[])
 {
 	return wpa_ctrl_command(ctrl, "DISABLE_MLD");
 }
 
 
 static int hostapd_cli_cmd_update_beacon(struct wpa_ctrl *ctrl, int argc,
-					 char *argv[])
+				      char *argv[])
 {
 	return wpa_ctrl_command(ctrl, "UPDATE_BEACON");
 }
 
 
-static int hostapd_cli_cmd_stop_ap(struct wpa_ctrl *ctrl, int argc,
-				   char *argv[])
-{
-	return wpa_ctrl_command(ctrl, "STOP_AP");
-}
-
-
 static int hostapd_cli_cmd_vendor(struct wpa_ctrl *ctrl, int argc, char *argv[])
 {
 	char cmd[256];
@@ -1605,13 +1598,6 @@
 }
 
 
-static int hostapd_cli_cmd_req_link_measurement(struct wpa_ctrl *ctrl, int argc,
-						char *argv[])
-{
-	return hostapd_cli_cmd(ctrl, "REQ_LINK_MEASUREMENT", 1, argc, argv);
-}
-
-
 static int hostapd_cli_cmd_reload_wpa_psk(struct wpa_ctrl *ctrl, int argc,
 					  char *argv[])
 {
@@ -1773,8 +1759,6 @@
 	  "= disable AP MLD to which the interface is affiliated" },
 	{ "update_beacon", hostapd_cli_cmd_update_beacon, NULL,
 	  "= update Beacon frame contents\n"},
-	{ "stop_ap", hostapd_cli_cmd_stop_ap, NULL,
-	  "= stop AP\n"},
 	{ "erp_flush", hostapd_cli_cmd_erp_flush, NULL,
 	  "= drop all ERP keys"},
 	{ "log_level", hostapd_cli_cmd_log_level, NULL,
@@ -1854,8 +1838,6 @@
 	  "<addr> = poll a STA to check connectivity with a QoS null frame" },
 	{ "req_beacon", hostapd_cli_cmd_req_beacon, NULL,
 	  "<addr> [req_mode=] <measurement request hexdump>  = send a Beacon report request to a station" },
-	{ "req_link_measurement", hostapd_cli_cmd_req_link_measurement, NULL,
-	  "<addr> = send a link measurement report request to a station"},
 	{ "reload_wpa_psk", hostapd_cli_cmd_reload_wpa_psk, NULL,
 	  "= reload wpa_psk_file only" },
 #ifdef CONFIG_IEEE80211R_AP
diff --git a/hostapd/main.c b/hostapd/main.c
index 3a14381..0fe2d74 100644
--- a/hostapd/main.c
+++ b/hostapd/main.c
@@ -177,15 +177,9 @@
 			continue;
 		}
 
-		if (!hconf->mld_ap) {
+		if (!hconf->mld_ap || hconf->mld_id != conf->mld_id) {
 			wpa_printf(MSG_DEBUG,
-				   "MLD: Skip non-MLD");
-			continue;
-		}
-
-		if (!hostapd_is_ml_partner(hapd, h_hapd)) {
-			wpa_printf(MSG_DEBUG,
-				   "MLD: Skip non matching MLD vif name");
+				   "MLD: Skip non matching mld_id");
 			continue;
 		}
 
@@ -197,7 +191,6 @@
 		}
 
 		hapd->drv_priv = h_hapd->drv_priv;
-		hapd->interface_added = h_hapd->interface_added;
 
 		/*
 		 * All interfaces participating in the AP MLD would have
@@ -207,15 +200,20 @@
 		 * 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->mld_addr,
-				  ETH_ALEN);
+			os_memcpy(hapd->own_addr, h_hapd->mld_addr, ETH_ALEN);
 			random_mac_addr_keep_oui(hapd->own_addr);
 		} else {
 			os_memcpy(hapd->own_addr, b, ETH_ALEN);
 		}
 
-		hostapd_mld_add_link(hapd);
+		/*
+		 * 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++;
 
 		goto setup_mld;
 	}
@@ -292,14 +290,13 @@
 	 * configured, and otherwise it would be the configured BSSID.
 	 */
 	if (hapd->conf->mld_ap) {
-		os_memcpy(hapd->mld->mld_addr, hapd->own_addr, ETH_ALEN);
-
+		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++;
 		if (!b)
 			random_mac_addr_keep_oui(hapd->own_addr);
 		else
 			os_memcpy(hapd->own_addr, b, ETH_ALEN);
-
-		hostapd_mld_add_link(hapd);
 	}
 
 setup_mld:
@@ -311,7 +308,6 @@
 
 		iface->drv_flags = capa.flags;
 		iface->drv_flags2 = capa.flags2;
-		iface->drv_rrm_flags = capa.rrm_flags;
 		iface->probe_resp_offloads = capa.probe_resp_offloads;
 		/*
 		 * Use default extended capa values from per-radio information
@@ -354,7 +350,7 @@
 		wpa_printf(MSG_DEBUG,
 			   "MLD: Set link_id=%u, mld_addr=" MACSTR
 			   ", own_addr=" MACSTR,
-			   hapd->mld_link_id, MAC2STR(hapd->mld->mld_addr),
+			   hapd->mld_link_id, MAC2STR(hapd->mld_addr),
 			   MAC2STR(hapd->own_addr));
 
 		hostapd_drv_link_add(hapd, hapd->mld_link_id,
@@ -762,29 +758,6 @@
 }
 
 
-static void hostapd_global_cleanup_mld(struct hapd_interfaces *interfaces)
-{
-#ifdef CONFIG_IEEE80211BE
-	size_t i;
-
-	if (!interfaces || !interfaces->mld)
-		return;
-
-	for (i = 0; i < interfaces->mld_count; i++) {
-		if (!interfaces->mld[i])
-			continue;
-
-		os_free(interfaces->mld[i]);
-		interfaces->mld[i] = NULL;
-	}
-
-	os_free(interfaces->mld);
-	interfaces->mld = NULL;
-	interfaces->mld_count = 0;
-#endif /* CONFIG_IEEE80211BE */
-}
-
-
 int main(int argc, char *argv[])
 {
 	struct hapd_interfaces interfaces;
@@ -1070,8 +1043,6 @@
 	interfaces.iface = NULL;
 	interfaces.count = 0;
 
-	hostapd_global_cleanup_mld(&interfaces);
-
 #ifdef CONFIG_DPP
 	dpp_global_deinit(interfaces.dpp);
 #endif /* CONFIG_DPP */