diff --git a/config/TR181-WiFi-USGv2.XML b/config/TR181-WiFi-USGv2.XML
index dd56a34de..a85e6732b 100644
--- a/config/TR181-WiFi-USGv2.XML
+++ b/config/TR181-WiFi-USGv2.XML
@@ -1966,6 +1966,12 @@ INSTMSMT_PH2 -->
int
true
+
+ X_RDK_MLDLinkID
+ unsignedInt[0:255]
+ uint32
+ true
+
Enable
boolean
@@ -2263,19 +2269,19 @@ INSTMSMT_PH2 -->
MLD_Enable
boolean
bool
- true
+ false
MLD_ID
unsignedInt[0:255]
uint32
- true
+ false
MLD_Link_ID
unsignedInt[0:255]
uint32
- true
+ false
MLD_Addr
@@ -2283,12 +2289,6 @@ INSTMSMT_PH2 -->
string
false
-
- MLD_Apply
- boolean
- bool
- true
-
RetryLimit
unsignedInt[0:255]
diff --git a/config/rdkb-wifi.ovsschema b/config/rdkb-wifi.ovsschema
index 77612ca08..ae163b9a4 100644
--- a/config/rdkb-wifi.ovsschema
+++ b/config/rdkb-wifi.ovsschema
@@ -1184,24 +1184,6 @@
"max": 1
}
},
- "mld_addr": {
- "type": {
- "key": {
- "type": "string"
- },
- "min": 0,
- "max": 1
- }
- },
- "mld_apply": {
- "type": {
- "key": {
- "type": "boolean"
- },
- "min": 0,
- "max": 1
- }
- },
"mdu_enabled": {
"type": {
"key" : {
diff --git a/include/wifi_base.h b/include/wifi_base.h
index 6a755d216..9e019ff71 100644
--- a/include/wifi_base.h
+++ b/include/wifi_base.h
@@ -98,6 +98,7 @@ extern "C" {
#define UNDEFINED_MLD_ID 255
#define MLD_UNIT_COUNT 8
+#define MIN_MLO_GROUP_SIZE 2
#define PLAN_ID_LENGTH 38
#define MAX_STEP_COUNT 32 /*Active Measurement Step Count */
diff --git a/lib/inc/schema_gen.h b/lib/inc/schema_gen.h
index 7efeeb04c..8c3c2b7a6 100644
--- a/lib/inc/schema_gen.h
+++ b/lib/inc/schema_gen.h
@@ -150,8 +150,6 @@
PJS_OVS_BOOL(mld_enable) \
PJS_OVS_INT(mld_id) \
PJS_OVS_INT(mld_link_id) \
- PJS_OVS_STRING(mld_addr, 32 + 1) \
- PJS_OVS_BOOL(mld_apply) \
PJS_OVS_BOOL(mdu_enabled)\
PJS_OVS_INT(speed_tier)\
PJS_OVS_STRING(repurposed_bridge_name, 8 + 1)\
@@ -2114,8 +2112,6 @@
COLUMN(mld_enable)\
COLUMN(mld_id)\
COLUMN(mld_link_id)\
- COLUMN(mld_addr)\
- COLUMN(mld_apply)\
COLUMN(interop_ctrl)\
COLUMN(mdu_enabled)\
COLUMN(speed_tier)\
@@ -3501,8 +3497,6 @@
#define SCHEMA__Wifi_VAP_Config__mld_enable "mld_enable"
#define SCHEMA__Wifi_VAP_Config__mld_id "mld_id"
#define SCHEMA__Wifi_VAP_Config__mld_link_id "mld_link_id"
-#define SCHEMA__Wifi_VAP_Config__mld_addr "mld_addr"
-#define SCHEMA__Wifi_VAP_Config__mld_apply "mld_apply"
#define SCHEMA__Wifi_VAP_Config__mdu_enabled "mdu_enabled"
#define SCHEMA__Wifi_VAP_Config__speed_tier "speed_tier"
#define SCHEMA__Wifi_VAP_Config__repurposed_bridge_name "repurposed_bridge_name"
diff --git a/source/core/wifi_ctrl.c b/source/core/wifi_ctrl.c
index b8a15ea1a..cf8c31775 100644
--- a/source/core/wifi_ctrl.c
+++ b/source/core/wifi_ctrl.c
@@ -1759,7 +1759,6 @@ int init_wireless_interface_mac()
memcpy(wifi_vap_info->u.bss_info.mld_info.common_info.mld_addr, hal_vap_info_map->vap_array[j].u.bss_info.mld_info.common_info.mld_addr, sizeof(wifi_vap_info->u.bss_info.mld_info.common_info.mld_addr));
wifi_vap_info->u.bss_info.mld_info.common_info.mld_link_id = hal_vap_info_map->vap_array[j].u.bss_info.mld_info.common_info.mld_link_id;
wifi_vap_info->u.bss_info.mld_info.common_info.mld_id = hal_vap_info_map->vap_array[j].u.bss_info.mld_info.common_info.mld_id;
- wifi_vap_info->u.bss_info.mld_info.common_info.mld_apply = hal_vap_info_map->vap_array[j].u.bss_info.mld_info.common_info.mld_apply;
#endif
}
}
@@ -1768,6 +1767,36 @@ int init_wireless_interface_mac()
hal_vap_info_map = NULL;
return RETURN_OK;
}
+
+#if defined(CONFIG_IEEE80211BE) && !defined(CONFIG_GENERIC_MLO)
+/**
+ * Called after init_wireless_interface_mac() so mgr cache BSSIDs are populated.
+ * Updates mld_enable/mld_addr in the mgr cache and writes changed radios to DB.
+ */
+void init_wifi_mld_groups(void)
+{
+ unsigned int r_idx;
+ unsigned int radio_bitmap = 0;
+ wifi_vap_info_map_t *mgr_vap_info_map;
+
+ radio_bitmap = update_mld_groups(NULL, NULL, 0, WIFI_CTRL);
+
+ for (r_idx = 0; r_idx < getNumberRadios(); r_idx++) {
+ if (!(radio_bitmap & (1u << r_idx))) {
+ continue;
+ }
+ mgr_vap_info_map = get_wifidb_vap_map(r_idx);
+ if (mgr_vap_info_map != NULL) {
+ rdk_wifi_vap_info_t *rdk_vaps = get_wifidb_rdk_vaps(r_idx);
+ if (rdk_vaps != NULL) {
+ wifidb_update_wifi_vap_config(r_idx, mgr_vap_info_map, rdk_vaps);
+ wifi_util_dbg_print(WIFI_CTRL, "%s:%d: Updated MLD group info for radio index %d\n", __func__, __LINE__, r_idx);
+ }
+ }
+ }
+}
+#endif /* CONFIG_IEEE80211BE && !CONFIG_GENERIC_MLO */
+
int validate_and_sync_private_vap_credentials()
{
uint8_t num_of_radios = getNumberRadios();
@@ -1852,10 +1881,13 @@ int start_wifi_ctrl(wifi_ctrl_t *ctrl)
monitor_ret = init_wifi_monitor();
- start_wifi_services();
-
init_wireless_interface_mac();
+#if defined(CONFIG_IEEE80211BE) && !defined(CONFIG_GENERIC_MLO)
+ init_wifi_mld_groups();
+#endif
+
+ start_wifi_services();
ctrl->webconfig_state = ctrl_webconfig_state_vap_all_cfg_rsp_pending;
telemetry_bootup_time_wifibroadcast(); //Telemetry Marker for btime_wifibcast_split
@@ -3242,6 +3274,243 @@ BOOL isRadioBeEnabled(UINT radio_index)
return FALSE;
}
+#if defined(CONFIG_IEEE80211BE) && !defined(CONFIG_GENERIC_MLO)
+static bool is_mlo_wpa3_personal(wifi_security_modes_t mode)
+{
+ return (mode == wifi_security_mode_wpa3_personal ||
+ mode == wifi_security_mode_wpa3_transition ||
+ mode == wifi_security_mode_wpa3_compatibility);
+}
+
+static bool is_mlo_security_mode_compatible(wifi_security_modes_t mode_a,
+ wifi_security_modes_t mode_b)
+{
+ if (mode_a == mode_b) {
+ return true;
+ }
+
+ if (is_mlo_wpa3_personal(mode_a) && is_mlo_wpa3_personal(mode_b)) {
+ return true;
+ }
+
+ return false;
+}
+
+/* Check if VAP's SSID, password, and security mode match the main link. */
+bool is_mlo_config_matching(wifi_vap_info_t *main_vap, wifi_vap_info_t *vap)
+{
+ /* Compare SSID */
+ if (strncmp(main_vap->u.bss_info.ssid, vap->u.bss_info.ssid, sizeof(ssid_t)) != 0) {
+ return false;
+ }
+
+ /* Compare Password/Key */
+ if (strncmp(main_vap->u.bss_info.security.u.key.key,
+ vap->u.bss_info.security.u.key.key,
+ sizeof(main_vap->u.bss_info.security.u.key.key)) != 0) {
+ return false;
+ }
+
+ /* Compare Security Mode — WPA3 variants are MLO-compatible across bands */
+ if (!is_mlo_security_mode_compatible(main_vap->u.bss_info.security.mode,
+ vap->u.bss_info.security.mode)) {
+ return false;
+ }
+
+ return true;
+}
+
+static wifi_vap_info_t *webconfig_find_vap_by_name(webconfig_subdoc_decoded_data_t *data, char *vap_name)
+{
+ unsigned int j, k;
+
+ for (j = 0; j < getNumberRadios(); j++) {
+ for (k = 0; k < getNumberVAPsPerRadio(j); k++) {
+ if (strcmp(data->radios[j].vaps.vap_map.vap_array[k].vap_name, vap_name) == 0) {
+ return &data->radios[j].vaps.vap_map.vap_array[k];
+ }
+ }
+ }
+ return NULL;
+}
+
+typedef struct {
+ wifi_mld_common_info_t *mld_conf;
+ wifi_vap_info_t *vap_info;
+ bool is_compatible;
+} mld_group_entry_t;
+
+/**
+ * update_mld_groups - Common MLO group validation and propagation.
+ *
+ * Iterates all MLD units (0..MLD_UNIT_COUNT-1). For each unit, walks all
+ * radios/VAPs in the mgr cache:
+ * - If data != NULL (webconfig path): only processes VAPs in vap_names[],
+ * modifies the vap_info from webconfig decoded data.
+ * - If data == NULL (DB/init path): processes all VAPs, modifies mgr cache directly.
+ * - Seeds mld_addr from mgr cache BSSID (first pass only)
+ * - Disables MLD, validates bounds, collects candidates
+ * - Tags compatible entries via is_mlo_config_matching()
+ * - Validates group (>= MIN_MLO_GROUP_SIZE, main link, non-zero MAC)
+ * - Propagates shared MLD address to compatible entries
+ *
+ * @param data Webconfig decoded data (NULL for DB/init path)
+ * @param vap_names Array of VAP names to filter (ignored if data == NULL)
+ * @param vap_names_size Number of entries in vap_names (ignored if data == NULL)
+ * @param log_type Log module (WIFI_MGR, WIFI_DB, etc.)
+ * @return Bitmask of radio indices where mld_enable was changed
+ */
+unsigned int update_mld_groups(webconfig_subdoc_decoded_data_t *data,
+ char **vap_names, unsigned int vap_names_size, wifi_dbg_type_t log_type)
+{
+ const mac_address_t zero_mac = { 0 };
+ mac_address_t mlo_mac = { 0 };
+ mac_addr_str_t mac_str = { 0 };
+ unsigned int radio_bitmap = 0;
+ unsigned int i;
+
+ for (i = 0; i < MLD_UNIT_COUNT; i++) {
+ unsigned int total_candidates = 0;
+ unsigned int compatible_count = 0;
+ unsigned int r_idx, k;
+ wifi_vap_info_t *main_link_vap = NULL;
+ mld_group_entry_t entries[MAX_NUM_RADIOS];
+
+ memset(entries, 0, sizeof(entries));
+ memset(mlo_mac, 0, sizeof(mac_address_t));
+
+ /* --- STEP 1: Seed MLD Address and Collect Candidates for this unit --- */
+ for (r_idx = 0; r_idx < getNumberRadios(); r_idx++) {
+ wifi_vap_info_map_t *mgr_vap_map = get_wifidb_vap_map(r_idx);
+ if (mgr_vap_map == NULL) {
+ continue;
+ }
+
+ for (k = 0; k < mgr_vap_map->num_vaps; k++) {
+ wifi_vap_info_t *mgr_vap = &mgr_vap_map->vap_array[k];
+ wifi_vap_info_t *target_vap = NULL;
+ wifi_mld_common_info_t *mld_conf = NULL;
+
+ if (isVapSTAMesh(mgr_vap->vap_index)) {
+ continue;
+ }
+
+ /* Determine target vap_info to modify */
+ if (data != NULL) {
+ /* Webconfig path: only process VAPs in vap_names list */
+ unsigned int n;
+ for (n = 0; n < vap_names_size; n++) {
+ if (strcmp(vap_names[n], mgr_vap->vap_name) == 0) {
+ target_vap = webconfig_find_vap_by_name(data, mgr_vap->vap_name);
+ break;
+ }
+ }
+ } else {
+ /* DB/init path: modify mgr cache directly */
+ target_vap = mgr_vap;
+ }
+
+ if (target_vap == NULL) {
+ continue;
+ }
+
+ mld_conf = &target_vap->u.bss_info.mld_info.common_info;
+
+ /* Seed mld_addr and disable MLD on first pass only.
+ * Subsequent group iterations must not overwrite values
+ * already propagated by an earlier group. */
+ if (i == 0) {
+ memcpy(mld_conf->mld_addr, mgr_vap->u.bss_info.bssid, sizeof(mac_address_t));
+ if (mld_conf->mld_enable) {
+ radio_bitmap |= (1u << mgr_vap->radio_index);
+ }
+ mld_conf->mld_enable = false;
+ }
+
+ /* Validate MLD configuration bounds */
+ if (mld_conf->mld_id >= MLD_UNIT_COUNT || mld_conf->mld_link_id >= MAX_NUM_MLD_LINKS) {
+ continue;
+ }
+
+ /* Only collect VAPs belonging to the current MLD unit */
+ if (mld_conf->mld_id != i) {
+ continue;
+ }
+
+ /* Main link (link_id == 0) provides the shared MLD MAC address */
+ if (mld_conf->mld_link_id == 0 && target_vap->u.bss_info.enabled == true) {
+ main_link_vap = target_vap;
+ memcpy(mlo_mac, mgr_vap->u.bss_info.bssid, sizeof(mac_address_t));
+ }
+
+ /* Store candidate */
+ if (total_candidates < MAX_NUM_RADIOS) {
+ entries[total_candidates].mld_conf = mld_conf;
+ entries[total_candidates].vap_info = target_vap;
+ entries[total_candidates].is_compatible = false;
+ total_candidates++;
+ }
+ }
+ }
+
+ /* --- STEP 2: Tag Entries as Compatible with the Main Link --- */
+ if (main_link_vap != NULL) {
+ unsigned int j;
+ for (j = 0; j < total_candidates; j++) {
+ mld_group_entry_t *entry = &entries[j];
+
+ if (entry->vap_info == main_link_vap ||
+ is_mlo_config_matching(main_link_vap, entry->vap_info)) {
+ entry->is_compatible = true;
+ compatible_count++;
+ } else {
+ wifi_util_info_print(log_type,
+ "%s:%d: vap_index=%d excluded from MLO group %d "
+ "(SSID/security mismatch with main link)\n",
+ __func__, __LINE__, entry->vap_info->vap_index, i);
+ }
+ }
+ }
+
+ /* --- STEP 3: Validate Group and Propagate Shared MLD Address --- */
+ if (compatible_count < MIN_MLO_GROUP_SIZE || main_link_vap == NULL ||
+ memcmp(mlo_mac, zero_mac, sizeof(mac_address_t)) == 0) {
+ if (total_candidates > 0) {
+ wifi_util_info_print(log_type,
+ "%s:%d: MLO group %d disabled (compatible_count=%u, main_link=%s)\n",
+ __func__, __LINE__, i, compatible_count,
+ main_link_vap ? "Found" : "Missing");
+ }
+ continue;
+ }
+
+ to_mac_str(mlo_mac, mac_str);
+ {
+ unsigned int j;
+ for (j = 0; j < total_candidates; j++) {
+ mld_group_entry_t *entry = &entries[j];
+
+ if (!entry->is_compatible) {
+ continue;
+ }
+
+ entry->mld_conf->mld_enable = true;
+ memcpy(entry->mld_conf->mld_addr, mlo_mac, sizeof(mac_address_t));
+ radio_bitmap |= (1u << entry->vap_info->radio_index);
+
+ wifi_util_info_print(log_type,
+ "%s:%d: MLO Enabled! mld_addr=%s for vap_index=%d (link_id=%d, mld_id=%d)\n",
+ __func__, __LINE__, mac_str, entry->vap_info->vap_index,
+ entry->mld_conf->mld_link_id, entry->mld_conf->mld_id);
+ }
+ }
+ }
+
+ return radio_bitmap;
+}
+
+#endif /* CONFIG_IEEE80211BE && !CONFIG_GENERIC_MLO */
+
void get_subdoc_name_from_vap_index(uint8_t vap_index, int* subdoc)
{
if (isVapPrivate(vap_index)) {
diff --git a/source/core/wifi_ctrl.h b/source/core/wifi_ctrl.h
index 4bb6d2d3d..a388d6af9 100644
--- a/source/core/wifi_ctrl.h
+++ b/source/core/wifi_ctrl.h
@@ -420,6 +420,11 @@ bus_error_t publish_endpoint_status(wifi_ctrl_t *ctrl, int connection_status);
int publish_endpoint_enable(void);
int get_mld_mac_from_link_mac(mac_address_t in_addr, mac_address_t mld_addr);
+#if defined(CONFIG_IEEE80211BE) && !defined(CONFIG_GENERIC_MLO)
+unsigned int update_mld_groups(webconfig_subdoc_decoded_data_t *data,
+ char **vap_names, unsigned int vap_names_size, wifi_dbg_type_t log_type);
+#endif /* CONFIG_IEEE80211BE && !CONFIG_GENERIC_MLO */
+
#ifdef __cplusplus
}
#endif
diff --git a/source/core/wifi_ctrl_webconfig.c b/source/core/wifi_ctrl_webconfig.c
index a2d3ed845..ce8b49836 100644
--- a/source/core/wifi_ctrl_webconfig.c
+++ b/source/core/wifi_ctrl_webconfig.c
@@ -851,165 +851,6 @@ bool is_force_apply_true(rdk_wifi_vap_info_t *rdk_vap_info) {
return false;
}
-
-#if defined(CONFIG_IEEE80211BE) && !defined(CONFIG_GENERIC_MLO)
-wifi_vap_info_t *get_vap_info_from_webconfig(webconfig_subdoc_decoded_data_t *data, char *vap_name)
-{
- unsigned int j, k;
-
- for (j = 0; j < getNumberRadios(); j++) {
- for (k = 0; k < getNumberVAPsPerRadio(j); k++) {
- if (strcmp(data->radios[j].vaps.vap_map.vap_array[k].vap_name, vap_name) == 0) {
- return &data->radios[j].vaps.vap_map.vap_array[k];
- }
- }
- }
- return NULL;
-}
-
-wifi_vap_info_t *get_vap_info_from_radio(char *vap_name)
-{
- unsigned int j;
- int tgt_radio_idx, tgt_vap_index;
- rdk_wifi_radio_t *radio;
- wifi_vap_info_t *mgr_vap_info = NULL;
- wifi_vap_info_map_t *mgr_vap_map = NULL;
- wifi_mgr_t *mgr = get_wifimgr_obj();
-
- if ((tgt_radio_idx = convert_vap_name_to_radio_array_index(&mgr->hal_cap.wifi_prop, vap_name)) == -1) {
- wifi_util_error_print(WIFI_MGR, "%s:%d: Could not find radio index for vap name:%s\n",
- __func__, __LINE__, vap_name);
- return NULL;
- }
-
- tgt_vap_index = convert_vap_name_to_index(&mgr->hal_cap.wifi_prop, vap_name);
- if (tgt_vap_index == -1) {
- wifi_util_error_print(WIFI_MGR, "%s:%d: Could not find vap index for vap name:%s\n",
- __func__, __LINE__, vap_name);
- return NULL;
- }
-
- for (j = 0; j < getNumberRadios(); j++) {
- radio = &mgr->radio_config[j];
- if (radio->vaps.radio_index == (unsigned int)tgt_radio_idx) {
- mgr_vap_map = &radio->vaps.vap_map;
- break;
- }
- }
-
- if (mgr_vap_map == NULL) {
- wifi_util_error_print(WIFI_MGR,
- "%s:%d: Could not find tgt_radio_idx:%d for vap name:%s\n", __func__, __LINE__,
- tgt_radio_idx, vap_name);
- return NULL;
- }
-
- for (j = 0; j < mgr_vap_map->num_vaps; j++) {
- if (mgr_vap_map->vap_array[j].vap_index == (unsigned int)tgt_vap_index) {
- mgr_vap_info = &mgr_vap_map->vap_array[j];
- break;
- }
- }
-
- return mgr_vap_info;
-}
-
-static void update_mld_group(webconfig_subdoc_decoded_data_t *data, char **vap_names, unsigned int size)
-{
- unsigned int i;
- wifi_vap_info_t *mgr_vap_info, *vap_info;
- wifi_mld_common_info_t *mld_conf;
- mac_address_t zero_mac = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
- mac_address_t mlo_mac = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
- mac_addr_str_t mac_str = { 0 };
- unsigned char *mld_addr_map[MAX_NUM_RADIOS] = { 0 };
- unsigned char mld_id = UNDEFINED_MLD_ID;
- wifi_mld_common_info_t *mld_map[MAX_NUM_RADIOS] = { 0 };
- unsigned int mld_vap_count = 0;
- bool disable_mld = false;
-
- if (size > MAX_NUM_RADIOS) {
- wifi_util_error_print(WIFI_MGR, "%s:%d: size %d exceeds MAX_NUM_RADIOS %d\n",
- __func__, __LINE__, size, MAX_NUM_RADIOS);
- return;
- }
- for (i = 0; i < size; i++) {
-
- vap_info = get_vap_info_from_webconfig(data, vap_names[i]);
- if (vap_info == NULL) {
- wifi_util_error_print(WIFI_MGR, "%s:%d: Could not find vap_info vap name:%s\n",
- __func__, __LINE__, vap_names[i]);
- return;
- }
-
- if (isVapSTAMesh(vap_info->vap_index))
- continue;
-
- mgr_vap_info = get_vap_info_from_radio(vap_names[i]);
- if (mgr_vap_info == NULL) {
- wifi_util_error_print(WIFI_MGR, "%s:%d: Could not find mgr_vap_info vap name:%s\n",
- __func__, __LINE__, vap_names[i]);
- return;
- }
-
- mld_conf = &vap_info->u.bss_info.mld_info.common_info;
-
- /* Initialize mld_mac with VAP's BSSID */
- memcpy(mld_conf->mld_addr, mgr_vap_info->u.bss_info.bssid, sizeof(mac_address_t));
-
- if (mld_conf->mld_id < MLD_UNIT_COUNT && mld_conf->mld_link_id < MAX_NUM_MLD_LINKS) {
- if (mld_id == UNDEFINED_MLD_ID)
- mld_id = mld_conf->mld_id;
- if (mld_id != mld_conf->mld_id) {
- wifi_util_error_print(WIFI_MGR, "%s:%d: vap name:%s is not part of mld unit %d. VAP's mld_id %d\n",
- __func__, __LINE__, vap_names[i], mld_id, mld_conf->mld_id);
- continue;
- }
- if (mld_conf->mld_enable) {
- mld_vap_count++;
- mld_addr_map[i] = mld_conf->mld_addr;
- mld_map[i] = mld_conf;
- if (mld_conf->mld_link_id == 0) {
- memcpy(mlo_mac, mgr_vap_info->u.bss_info.bssid, sizeof(mac_address_t));
- }
- } else {
- if (mld_conf->mld_link_id == 0) {
- wifi_util_info_print(WIFI_MGR, "%s:%d: Main link is disabled -> Disable whole MLO group\n",__func__, __LINE__);
- disable_mld = true;
- }
- }
- }
- }
- if (mld_vap_count > 0) {
- if (disable_mld || mld_vap_count < 2) {
- /* Disable MLD when main link is disabled or less than 2 VAPs are mld enabled */
- for (i = 0; i < size; i++) {
- if (mld_map[i] != NULL) {
- mld_map[i]->mld_enable = false;
- wifi_util_info_print(WIFI_MGR,
- "%s:%d: Disabling mld for vap name:%s - disable_mld %d mld_vap_count %d\n",
- __func__, __LINE__, vap_names[i], disable_mld, mld_vap_count);
- }
- }
- return;
- }
- }
-
- if (memcmp(mlo_mac, zero_mac, sizeof(mac_address_t)) == 0) {
- return; /* VAPs group does not contain MLO enabled VAPs */
- }
-
- to_mac_str(mlo_mac, mac_str);
- for (i = 0; i < size; i++) {
- if (mld_addr_map[i] != NULL) {
- memcpy(mld_addr_map[i], mlo_mac, sizeof(mac_address_t));
- wifi_util_info_print(WIFI_MGR, "%s:%d: Updating mld_addr %s for vap name:%s\n",
- __func__, __LINE__, mac_str, vap_names[i]);
- }
- }
-}
-#endif // CONFIG_IEEE80211BE && !CONFIG_GENERIC_MLO
-
int webconfig_hal_vap_apply_by_name(wifi_ctrl_t *ctrl, webconfig_subdoc_decoded_data_t *data, char **vap_names, unsigned int size)
{
unsigned int i, j, k;
@@ -1027,7 +868,7 @@ int webconfig_hal_vap_apply_by_name(wifi_ctrl_t *ctrl, webconfig_subdoc_decoded_
int ret = 0;
#if defined(CONFIG_IEEE80211BE) && !defined(CONFIG_GENERIC_MLO)
- update_mld_group(data, vap_names, size);
+ update_mld_groups(data, vap_names, size, WIFI_MGR);
#endif // CONFIG_IEEE80211BE && !CONFIG_GENERIC_MLO
for (i = 0; i < size; i++) {
diff --git a/source/db/wifi_db.c b/source/db/wifi_db.c
index 1293c9a2c..6c44fad65 100644
--- a/source/db/wifi_db.c
+++ b/source/db/wifi_db.c
@@ -564,8 +564,6 @@ static int init_vap_config_default(int vap_index, wifi_vap_info_t *config,
cfg.u.bss_info.mld_info.common_info.mld_id = 255;
#endif
cfg.u.bss_info.mld_info.common_info.mld_link_id = 255;
- cfg.u.bss_info.mld_info.common_info.mld_apply = 1;
-// strcpy(cfg.u.bss_info.mld_info.common_info.mld_addr, "11:11:11:11:11:11");
if (isVapPrivate(vap_index)) {
cfg.u.bss_info.showSsid = true;
cfg.u.bss_info.wps.methods = WIFI_ONBOARDINGMETHODS_PUSHBUTTON;
diff --git a/source/db/wifi_db_apis.c b/source/db/wifi_db_apis.c
index daedab38c..61fc7b250 100644
--- a/source/db/wifi_db_apis.c
+++ b/source/db/wifi_db_apis.c
@@ -1095,7 +1095,6 @@ void callback_Wifi_VAP_Config(ovsdb_update_monitor_t *mon,
l_bss_param_cfg->mld_info.common_info.mld_enable = new_rec->mld_enable;
l_bss_param_cfg->mld_info.common_info.mld_id = new_rec->mld_id;
l_bss_param_cfg->mld_info.common_info.mld_link_id = new_rec->mld_link_id;
- l_bss_param_cfg->mld_info.common_info.mld_apply = new_rec->mld_apply;
if (strlen(new_rec->anqp_parameters) != 0) {
strncpy((char *)l_bss_param_cfg->interworking.anqp.anqpParameters,new_rec->anqp_parameters,(sizeof(l_bss_param_cfg->interworking.anqp.anqpParameters)-1));
}
@@ -2893,7 +2892,6 @@ int wifidb_update_wifi_vap_info(char *vap_name, wifi_vap_info_t *config,
cfg.mld_enable = config->u.bss_info.mld_info.common_info.mld_enable;
cfg.mld_id = config->u.bss_info.mld_info.common_info.mld_id;
cfg.mld_link_id = config->u.bss_info.mld_info.common_info.mld_link_id;
- cfg.mld_apply = config->u.bss_info.mld_info.common_info.mld_apply;
cfg.interop_ctrl = config->u.bss_info.interop_ctrl;
cfg.inum_sta = config->u.bss_info.inum_sta;
wifi_util_dbg_print(WIFI_DB,
@@ -2907,7 +2905,7 @@ int wifidb_update_wifi_vap_info(char *vap_name, wifi_vap_info_t *config,
"cfg.bss_hotspot=%d cfg.wps_push_button=%d cfg.wps_config_methods=%d "
"cfg.wps_enabled=%d cfg.beacon_rate_ctl=%s cfg.mfp_config=%s "
"network_initiated_greylist=%d exists=%d hostap_mgt_frame_ctrl=%d mbo_enabled=%d "
- "mld_enable=%d mld_id=%d mld_link_id=%d mld_apply=%d interop_ctrl:%d inum_sta:%d\n",
+ "mld_enable=%d mld_id=%d mld_link_id=%d interop_ctrl:%d inum_sta:%d\n",
__func__, __LINE__, cfg.radio_name, cfg.vap_name, cfg.ssid, cfg.enabled,
cfg.ssid_advertisement_enabled, cfg.isolation_enabled, cfg.mgmt_power_control,
cfg.bss_max_sta, cfg.bss_transition_activated, cfg.nbr_report_activated,
@@ -2917,7 +2915,7 @@ int wifidb_update_wifi_vap_info(char *vap_name, wifi_vap_info_t *config,
cfg.wep_key_length, cfg.bss_hotspot, cfg.wps_push_button, cfg.wps_config_methods,
cfg.wps_enabled, cfg.beacon_rate_ctl, cfg.mfp_config, cfg.network_initiated_greylist,
cfg.exists, cfg.hostap_mgt_frame_ctrl, cfg.mbo_enabled,
- cfg.mld_enable, cfg.mld_id, cfg.mld_link_id, cfg.mld_apply, cfg.interop_ctrl, cfg.inum_sta);
+ cfg.mld_enable, cfg.mld_id, cfg.mld_link_id, cfg.interop_ctrl, cfg.inum_sta);
}
if(onewifi_ovsdb_table_upsert_with_parent(g_wifidb->wifidb_sock_path,&table_Wifi_VAP_Config,&cfg,false,filter_vap,SCHEMA_TABLE(Wifi_Radio_Config),(onewifi_ovsdb_where_simple(SCHEMA_COLUMN(Wifi_Radio_Config,radio_name),radio_name)),SCHEMA_COLUMN(Wifi_Radio_Config,vap_configs)) == false)
{
@@ -5175,7 +5173,6 @@ static void wifidb_vap_config_upgrade(wifi_vap_info_map_t *config, rdk_wifi_vap_
#endif
config->vap_array[i].u.bss_info.mld_info.common_info.mld_link_id = 255;
- config->vap_array[i].u.bss_info.mld_info.common_info.mld_apply = 1;
is_vap_info_upgrade_needed = true;
}
}
@@ -6589,7 +6586,6 @@ int wifidb_get_wifi_vap_info(char *vap_name, wifi_vap_info_t *config,
config->u.bss_info.mld_info.common_info.mld_enable = pcfg->mld_enable;
config->u.bss_info.mld_info.common_info.mld_id = pcfg->mld_id;
config->u.bss_info.mld_info.common_info.mld_link_id = pcfg->mld_link_id;
- config->u.bss_info.mld_info.common_info.mld_apply = pcfg->mld_apply;
}
}
free(pcfg);
@@ -7748,7 +7744,6 @@ int wifidb_init_vap_config_default(int vap_index, wifi_vap_info_t *config,
cfg->u.bss_info.mld_info.common_info.mld_id = 255;
#endif
cfg->u.bss_info.mld_info.common_info.mld_link_id = 255;
- cfg->u.bss_info.mld_info.common_info.mld_apply = 1;
memset(&cfg->u.bss_info.mld_info.common_info.mld_addr, 0, sizeof(cfg->u.bss_info.mld_info.common_info.mld_addr));
if (isVapPrivate(vap_index)) {
@@ -8153,101 +8148,6 @@ void wifidb_init_default_value()
wifi_util_info_print(WIFI_DB,"%s:%d Wifi db update completed\n",__func__, __LINE__);
}
-#if defined(CONFIG_IEEE80211BE) && !defined(CONFIG_GENERIC_MLO)
-static int get_ap_mac_by_vap_index(wifi_vap_info_map_t *hal_vap_info_map, int vap_index, mac_address_t mac)
-{
- unsigned int j = 0;
-
- for (j = 0; j < hal_vap_info_map->num_vaps; j++) {
- if ((int)hal_vap_info_map->vap_array[j].vap_index == vap_index) {
- memcpy(mac, hal_vap_info_map->vap_array[j].u.bss_info.bssid, sizeof(mac_address_t));
- return RETURN_OK;
- }
- }
- wifi_util_error_print(WIFI_DB, "%s:%d vap_info not found for vap_index value: %d\n"
- ,__FUNCTION__, __LINE__, vap_index);
- return RETURN_ERR;
-}
-
-static int wifidb_vap_config_update_mld_mac()
-{
- wifi_vap_info_map_t *hal_vap_info_map = NULL;
- wifi_vap_info_map_t *mgr_vap_info_map = NULL;
- mac_address_t mlo_mac = {0};
- mac_address_t zero_mac = {0};
- unsigned char *mld_addr_map[MAX_NUM_RADIOS] = {0};
- unsigned int r_idx=0;
- unsigned int i = 0;
- unsigned int k = 0;
- int ret = RETURN_OK;
-
- hal_vap_info_map = (wifi_vap_info_map_t *)malloc(sizeof(wifi_vap_info_map_t));
- if (hal_vap_info_map == NULL) {
- wifi_util_error_print(WIFI_DB, "%s:%d Failed to allocate memory for hal_vap_info_map\n",__FUNCTION__, __LINE__);
- return RETURN_ERR;
- }
-
- for (i = 0; i < MLD_UNIT_COUNT; i++) {
- memset(mld_addr_map, 0, sizeof(mld_addr_map));
- memset(mlo_mac, 0, sizeof(mac_address_t));
-
- wifi_util_info_print(WIFI_DB, "%s:%d: Updating MLO MAC for mld_unit %d\r\n", __func__, __LINE__, i);
-
- for (r_idx=0; r_idx < getNumberRadios(); r_idx++) {
- memset(hal_vap_info_map, 0, sizeof(wifi_vap_info_map_t));
- /* wifi_hal_getRadioVapInfoMap is used to get the macaddress of wireless interfaces */
- ret = wifi_hal_getRadioVapInfoMap(r_idx, hal_vap_info_map);
- if (ret != RETURN_OK) {
- wifi_util_error_print(WIFI_DB, "%s:%d wifi_hal_getRadioVapInfoMap failed for radio: %d\n",__FUNCTION__, __LINE__, r_idx);
- free(hal_vap_info_map);
- hal_vap_info_map = NULL;
- return ret;
- }
- /* vap map with loaded DB - find the main mlo vap */
- mgr_vap_info_map = get_wifidb_vap_map(r_idx);
- if (mgr_vap_info_map == NULL) {
- wifi_util_error_print(WIFI_DB, "%s:%d get_wifidb_vap_map failed for radio: %d\n",__FUNCTION__, __LINE__, r_idx);
- free(hal_vap_info_map);
- hal_vap_info_map = NULL;
- return RETURN_ERR;
- }
- for (k = 0; k < mgr_vap_info_map->num_vaps; k++) {
- wifi_vap_info_t *vap_config = &mgr_vap_info_map->vap_array[k];
- wifi_mld_common_info_t *mld_info = NULL;
-
- if (isVapSTAMesh(vap_config->vap_index)) {
- continue;
- }
-
- mld_info = &vap_config->u.bss_info.mld_info.common_info;
- if (i == 0) { /* Initialise all vap's mld_mac with interface mac */
- get_ap_mac_by_vap_index(hal_vap_info_map, vap_config->vap_index, mld_info->mld_addr);
- }
-
- if (mld_info->mld_enable && mld_info->mld_id == i) {
- mld_addr_map[r_idx] = mld_info->mld_addr; /* store mld_addr ptr to be updated later */
- if(mld_info->mld_link_id == 0) { /* check if the link is main MLO link */
- get_ap_mac_by_vap_index(hal_vap_info_map, vap_config->vap_index, mlo_mac);
- }
- }
- }
- }
-
- if (memcmp(mlo_mac, zero_mac, sizeof(mac_address_t)) == 0) {
- continue;
- }
-
- for (r_idx = 0; r_idx < getNumberRadios(); r_idx++) {
- if (mld_addr_map[r_idx] != NULL) {
- memcpy(mld_addr_map[r_idx], mlo_mac, sizeof(mac_address_t));
- }
- }
- }
- free(hal_vap_info_map);
- hal_vap_info_map = NULL;
- return RETURN_OK;
-}
-#endif // CONFIG_IEEE80211BE && !CONFIG_GENERIC_MLO
/************************************************************************************
************************************************************************************
@@ -8478,9 +8378,6 @@ void init_wifidb_data()
pthread_mutex_unlock(&g_wifidb->data_cache_lock);
return;
}
-#if defined(CONFIG_IEEE80211BE) && !defined(CONFIG_GENERIC_MLO)
- wifidb_vap_config_update_mld_mac();
-#endif // CONFIG_IEEE80211BE && !CONFIG_GENERIC_MLO
pthread_mutex_unlock(&g_wifidb->data_cache_lock);
}
diff --git a/source/dml/tr_181/ml/cosa_wifi_dml.c b/source/dml/tr_181/ml/cosa_wifi_dml.c
index 45a0bc033..0cd4b92ee 100755
--- a/source/dml/tr_181/ml/cosa_wifi_dml.c
+++ b/source/dml/tr_181/ml/cosa_wifi_dml.c
@@ -5559,6 +5559,18 @@ SSID_GetParamUlongValue
return TRUE;
}
+ if( AnscEqualString(ParamName, "X_RDK_MLDLinkID", TRUE))
+ {
+ wifi_mld_common_info_t *mld_common_info = NULL;
+
+ if (isVapSTAMesh(pcfg->vap_index)) {
+ mld_common_info = &pcfg->u.sta_info.mld_info.common_info;
+ } else {
+ mld_common_info = &pcfg->u.bss_info.mld_info.common_info;
+ }
+ *puLong = (uint32_t)mld_common_info->mld_link_id;
+ return TRUE;
+ }
/* CcspTraceWarning(("Unsupported parameter '%s'\n", ParamName)); */
return FALSE;
@@ -6057,6 +6069,60 @@ SSID_SetParamUlongValue
ULONG uValue
)
{
+ wifi_vap_info_t *pcfg = (wifi_vap_info_t *)hInsContext;
+
+ if (pcfg == NULL)
+ {
+ wifi_util_dbg_print(WIFI_DMCLI,"%s:%d Null pointer get fail\n", __FUNCTION__,__LINE__);
+ return FALSE;
+ }
+
+ uint8_t instance_number = (uint8_t)convert_vap_name_to_index(&((webconfig_dml_t *)get_webconfig_dml())->hal_cap.wifi_prop, pcfg->vap_name) +1;
+ wifi_vap_info_t *vapInfo = (wifi_vap_info_t *) get_dml_cache_vap_info(instance_number-1);
+
+ if (vapInfo == NULL)
+ {
+ wifi_util_dbg_print(WIFI_DMCLI,"%s:%d Unable to get VAP info for instance_number:%d\n", __FUNCTION__,__LINE__,instance_number);
+ return FALSE;
+ }
+
+ if( AnscEqualString(ParamName, "X_RDK_MLDLinkID", TRUE))
+ {
+ if (isVapSTAMesh(pcfg->vap_index)) {
+ wifi_util_dbg_print(WIFI_DMCLI,"%s:%d %s does not support configuration\n", __FUNCTION__,__LINE__,pcfg->vap_name);
+ return TRUE;
+ }
+
+ /* MLD_Link_ID is per radio configuration. In current design, we store it in each VAP structure.
+ * So when MLD_Link_ID is updated for one VAP, we need to update it for all VAPs of the same radio.
+ */
+ unsigned int total_vaps = getTotalNumberVAPs();
+
+ for (unsigned int vap_idx = 0; vap_idx < total_vaps; vap_idx++) {
+ wifi_vap_info_t *temp_vapInfo = (wifi_vap_info_t *)get_dml_cache_vap_info(vap_idx);
+ if (temp_vapInfo == NULL) {
+ wifi_util_dbg_print(WIFI_DMCLI, "%s:%d Unable to get VAP info for vap index:%d\n",
+ __FUNCTION__, __LINE__, vap_idx);
+ continue;
+ }
+ if (temp_vapInfo->radio_index != pcfg->radio_index) {
+ continue;
+ }
+ if (isVapSTAMesh(vap_idx)) {
+ continue;
+ }
+ wifi_util_dbg_print(WIFI_DMCLI,
+ "%s:%d Updating mld_link_id radio_index %d vap index:%d old val %u new val %u\n",
+ __FUNCTION__, __LINE__, temp_vapInfo->radio_index, vap_idx,
+ uValue, temp_vapInfo->u.bss_info.mld_info.common_info.mld_link_id);
+ if (temp_vapInfo->u.bss_info.mld_info.common_info.mld_link_id == (unsigned int)uValue) {
+ continue;
+ }
+ temp_vapInfo->u.bss_info.mld_info.common_info.mld_link_id = uValue;
+ set_dml_cache_vap_config_changed(vap_idx);
+ }
+ return TRUE;
+ }
/* CcspTraceWarning(("Unsupported parameter '%s'\n", ParamName)); */
return FALSE;
@@ -6830,13 +6896,6 @@ AccessPoint_GetParamBoolValue
return TRUE;
}
- if( AnscEqualString(ParamName, "MLD_Apply", TRUE))
- {
- /* collect value */
- *pBool = pcfg->u.bss_info.mld_info.common_info.mld_apply;
- return TRUE;
- }
-
if( AnscEqualString(ParamName, "WMMCapability", TRUE))
{
/* collect value */
@@ -7204,7 +7263,14 @@ AccessPoint_GetParamUlongValue
if( AnscEqualString(ParamName, "MLD_Link_ID", TRUE))
{
- *puLong = pcfg->u.bss_info.mld_info.common_info.mld_link_id;
+ wifi_mld_common_info_t *mld_common_info = NULL;
+
+ if (isVapSTAMesh(pcfg->vap_index)) {
+ mld_common_info = &pcfg->u.sta_info.mld_info.common_info;
+ } else {
+ mld_common_info = &pcfg->u.bss_info.mld_info.common_info;
+ }
+ *puLong = mld_common_info->mld_link_id;
return TRUE;
}
@@ -7500,40 +7566,6 @@ AccessPoint_SetParamBoolValue
return TRUE;
}
- if( AnscEqualString(ParamName, "MLD_Enable", TRUE))
- {
- if (bValue && !isRadioBeEnabled(pcfg->radio_index))
- {
- wifi_util_error_print(WIFI_DMCLI,
- "%s:%d Cannot enable MLD on VAP %s: radio %d has no BE mode\n", __FUNCTION__,
- __LINE__, pcfg->vap_name, pcfg->radio_index);
- return FALSE;
- }
-
- if ( vapInfo->u.bss_info.mld_info.common_info.mld_enable == bValue )
- {
- return TRUE;
- }
-
- /* save update to backup */
- vapInfo->u.bss_info.mld_info.common_info.mld_enable = bValue;
- set_dml_cache_vap_config_changed(instance_number - 1);
- return TRUE;
- }
-
- if( AnscEqualString(ParamName, "MLD_Apply", TRUE))
- {
- if ( vapInfo->u.bss_info.mld_info.common_info.mld_apply == bValue )
- {
- return TRUE;
- }
-
- /* save update to backup */
- vapInfo->u.bss_info.mld_info.common_info.mld_apply = bValue;
- set_dml_cache_vap_config_changed(instance_number - 1);
- return TRUE;
- }
-
if( AnscEqualString(ParamName, "WMMEnable", TRUE))
{
if ( vapInfo->u.bss_info.wmm_enabled == bValue )
@@ -7952,65 +7984,6 @@ AccessPoint_SetParamUlongValue
return TRUE;
}
- if( AnscEqualString(ParamName, "MLD_ID", TRUE))
- {
- if (isVapSTAMesh(pcfg->vap_index)) {
- wifi_util_dbg_print(WIFI_DMCLI,"%s:%d %s does not support configuration\n", __FUNCTION__,__LINE__,pcfg->vap_name);
- return TRUE;
- }
- if (!isRadioBeEnabled(pcfg->radio_index)) {
- wifi_util_error_print(WIFI_DMCLI,"%s:%d Cannot set MLD_ID on VAP %s: radio %d has no BE mode\n",
- __FUNCTION__, __LINE__, pcfg->vap_name, pcfg->radio_index);
- return FALSE;
- }
- if ( vapInfo->u.bss_info.mld_info.common_info.mld_id == (unsigned int)uValue )
- {
- return TRUE;
- }
- /* save update to backup */
- vapInfo->u.bss_info.mld_info.common_info.mld_id = uValue;
- set_dml_cache_vap_config_changed(instance_number - 1);
- return TRUE;
- }
-
- if( AnscEqualString(ParamName, "MLD_Link_ID", TRUE))
- {
- if (isVapSTAMesh(pcfg->vap_index)) {
- wifi_util_dbg_print(WIFI_DMCLI,"%s:%d %s does not support configuration\n", __FUNCTION__,__LINE__,pcfg->vap_name);
- return TRUE;
- }
-
- /* MLD_Link_ID is per radio configuration. In current design, we store it in each VAP structure.
- * So when MLD_Link_ID is updated for one VAP, we need to update it for all VAPs of the same radio.
- */
- unsigned int total_vaps = getTotalNumberVAPs();
-
- for (unsigned int vap_idx = 0; vap_idx < total_vaps; vap_idx++) {
- wifi_vap_info_t *temp_vapInfo = (wifi_vap_info_t *)get_dml_cache_vap_info(vap_idx);
- if (temp_vapInfo == NULL) {
- wifi_util_dbg_print(WIFI_DMCLI, "%s:%d Unable to get VAP info for vap index:%d\n",
- __FUNCTION__, __LINE__, vap_idx);
- continue;
- }
- if (temp_vapInfo->radio_index != pcfg->radio_index) {
- continue;
- }
- if (isVapSTAMesh(vap_idx)) {
- continue;
- }
- wifi_util_dbg_print(WIFI_DMCLI,
- "%s:%d Updating mld_link_id radio_index %d vap index:%d old val %u new val %u\n",
- __FUNCTION__, __LINE__, temp_vapInfo->radio_index, vap_idx,
- uValue, temp_vapInfo->u.bss_info.mld_info.common_info.mld_link_id);
- if (temp_vapInfo->u.bss_info.mld_info.common_info.mld_link_id == (unsigned int)uValue) {
- continue;
- }
- temp_vapInfo->u.bss_info.mld_info.common_info.mld_link_id = uValue;
- set_dml_cache_vap_config_changed(vap_idx);
- }
- return TRUE;
- }
-
/* CcspTraceWarning(("Unsupported parameter '%s'\n", ParamName)); */
return FALSE;
}
diff --git a/source/utils/wifi_util.c b/source/utils/wifi_util.c
index 00752ffd7..32e63f2d4 100644
--- a/source/utils/wifi_util.c
+++ b/source/utils/wifi_util.c
@@ -4046,8 +4046,6 @@ bool is_vap_param_config_changed(wifi_vap_info_t *vap_info_old, wifi_vap_info_t
//should not be executed for BPi
IS_CHANGED(vap_info_old->u.bss_info.mld_info.common_info.mld_link_id,
vap_info_new->u.bss_info.mld_info.common_info.mld_link_id) ||
- IS_CHANGED(vap_info_old->u.bss_info.mld_info.common_info.mld_apply,
- vap_info_new->u.bss_info.mld_info.common_info.mld_apply) ||
is_mld_addr_changed(vap_info_old, vap_info_new) ||
#endif // CONFIG_IEEE80211BE && !CONFIG_GENERIC_MLO
IS_CHANGED(vap_info_old->u.bss_info.hostap_mgt_frame_ctrl,
diff --git a/source/utils/wifi_validator.c b/source/utils/wifi_validator.c
index 6ede21d4b..b163ec466 100644
--- a/source/utils/wifi_validator.c
+++ b/source/utils/wifi_validator.c
@@ -1524,10 +1524,6 @@ int validate_vap(const cJSON *vap, wifi_vap_info_t *vap_info, wifi_platform_prop
validate_param_bool(vap, "MLD_Enable", param);
vap_info->u.bss_info.mld_info.common_info.mld_enable = (param->type & cJSON_True) ? true:false;
- // MLD Apply
- validate_param_bool(vap, "MLD_Apply", param);
- vap_info->u.bss_info.mld_info.common_info.mld_apply = (param->type & cJSON_True) ? true:false;
-
// MLD ID
validate_param_integer(vap, "MLD_ID", param);
vap_info->u.bss_info.mld_info.common_info.mld_id = param->valuedouble;
diff --git a/source/webconfig/wifi_decoder.c b/source/webconfig/wifi_decoder.c
index 7959f9578..78e304fe3 100644
--- a/source/webconfig/wifi_decoder.c
+++ b/source/webconfig/wifi_decoder.c
@@ -1748,10 +1748,6 @@ webconfig_error_t decode_vap_common_object(const cJSON *vap, wifi_vap_info_t *va
decode_param_bool(vap, "MLD_Enable", param);
vap_info->u.bss_info.mld_info.common_info.mld_enable = (param->type & cJSON_True) ? true:false;
- // MLD Apply
- decode_param_bool(vap, "MLD_Apply", param);
- vap_info->u.bss_info.mld_info.common_info.mld_apply = (param->type & cJSON_True) ? true:false;
-
// MLD_ID
decode_param_integer(vap, "MLD_ID", param);
vap_info->u.bss_info.mld_info.common_info.mld_id = param->valuedouble;
diff --git a/source/webconfig/wifi_encoder.c b/source/webconfig/wifi_encoder.c
index 2522bcd01..ffc0c9960 100644
--- a/source/webconfig/wifi_encoder.c
+++ b/source/webconfig/wifi_encoder.c
@@ -408,9 +408,6 @@ webconfig_error_t encode_vap_common_object(const wifi_vap_info_t *vap_info,
// MLD Enable
cJSON_AddBoolToObject(vap_object, "MLD_Enable", vap_info->u.bss_info.mld_info.common_info.mld_enable);
- // MLD Apply
- cJSON_AddBoolToObject(vap_object, "MLD_Apply", vap_info->u.bss_info.mld_info.common_info.mld_apply);
-
// MLD_ID
cJSON_AddNumberToObject(vap_object, "MLD_ID", vap_info->u.bss_info.mld_info.common_info.mld_id);