diff --git a/config/TR181-WiFi-USGv2.XML b/config/TR181-WiFi-USGv2.XML
index c11b08892..182744512 100644
--- a/config/TR181-WiFi-USGv2.XML
+++ b/config/TR181-WiFi-USGv2.XML
@@ -2187,6 +2187,36 @@ INSTMSMT_PH2 -->
bool
true
+
+ MLD_Enable
+ boolean
+ bool
+ true
+
+
+ MLD_ID
+ unsignedInt[0:255]
+ uint32
+ true
+
+
+ MLD_Link_ID
+ unsignedInt[0:255]
+ uint32
+ true
+
+
+ MLD_Addr
+ string(32)
+ string
+ false
+
+
+ MLD_Apply
+ boolean
+ bool
+ true
+
RetryLimit
unsignedInt[0:255]
diff --git a/config/rdkb-wifi.ovsschema b/config/rdkb-wifi.ovsschema
index 91e393ee9..5a9b373ef 100644
--- a/config/rdkb-wifi.ovsschema
+++ b/config/rdkb-wifi.ovsschema
@@ -1,6 +1,6 @@
{
"name": "Wifi_Rdk_Database",
- "version": "1.00.042",
+ "version": "1.00.043",
"cksum": "2353365742 523",
"tables": {
"Wifi_Device_Config": {
@@ -1174,6 +1174,51 @@
"min": 0,
"max": 1
}
+ },
+ "mld_enable": {
+ "type": {
+ "key": {
+ "type": "boolean"
+ },
+ "min": 0,
+ "max": 1
+ }
+ },
+ "mld_id": {
+ "type": {
+ "key": {
+ "type": "integer"
+ },
+ "min": 0,
+ "max": 1
+ }
+ },
+ "mld_link_id": {
+ "type": {
+ "key": {
+ "type": "integer"
+ },
+ "min": 0,
+ "max": 1
+ }
+ },
+ "mld_addr": {
+ "type": {
+ "key": {
+ "type": "string"
+ },
+ "min": 0,
+ "max": 1
+ }
+ },
+ "mld_apply": {
+ "type": {
+ "key": {
+ "type": "boolean"
+ },
+ "min": 0,
+ "max": 1
+ }
}
},
"isRoot": true
diff --git a/lib/inc/schema_gen.h b/lib/inc/schema_gen.h
index b28e46c08..dcfb42987 100644
--- a/lib/inc/schema_gen.h
+++ b/lib/inc/schema_gen.h
@@ -149,6 +149,11 @@
PJS_OVS_BOOL(mdu_enabled)\
PJS_OVS_INT(speed_tier)\
PJS_OVS_STRING(repurposed_bridge_name, 8 + 1)\
+ 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) \
)
#define PJS_SCHEMA_Wifi_Interworking_Config \
@@ -2084,7 +2089,12 @@
COLUMN(interop_ctrl)\
COLUMN(mdu_enabled)\
COLUMN(speed_tier)\
- COLUMN(repurposed_bridge_name)
+ COLUMN(repurposed_bridge_name)\
+ COLUMN(mld_enable)\
+ COLUMN(mld_id)\
+ COLUMN(mld_link_id)\
+ COLUMN(mld_addr)\
+ COLUMN(mld_apply)
#define SCHEMA__Wifi_Interworking_Config "Wifi_Interworking_Config"
#define SCHEMA_COLUMN__Wifi_Interworking_Config(COLUMN) \
@@ -3448,6 +3458,11 @@
#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"
+#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_Interworking_Config__enable "enable"
#define SCHEMA__Wifi_Interworking_Config__vap_name "vap_name"
diff --git a/source/db/wifi_db.c b/source/db/wifi_db.c
index 64fbc1048..13f06afab 100644
--- a/source/db/wifi_db.c
+++ b/source/db/wifi_db.c
@@ -471,6 +471,12 @@ static int init_vap_config_default(int vap_index, wifi_vap_info_t *config,
cfg.u.bss_info.beaconRate = WIFI_BITRATE_6MBPS;
strncpy(cfg.u.bss_info.beaconRateCtl,"6Mbps",sizeof(cfg.u.bss_info.beaconRateCtl)-1);
cfg.vap_mode = wifi_vap_mode_ap;
+ /*TODO: Are values correct? */
+ cfg.u.bss_info.mld_info.common_info.mld_enable = 0;
+ cfg.u.bss_info.mld_info.common_info.mld_id = 255;
+ 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 d1d30666d..7a33976d9 100644
--- a/source/db/wifi_db_apis.c
+++ b/source/db/wifi_db_apis.c
@@ -90,6 +90,13 @@
#define DEFAULT_WHIX_LOGINTERVAL 3600
#define ONEWIFI_DB_VERSION_WPA3_T_DISABLE_FLAG 100042
+#define ONEWIFI_DB_VERSION_UPDATE_MLD_FLAG 100043
+
+#ifdef CONFIG_NO_MLD_ONLY_PRIVATE
+#define MLD_UNIT_COUNT 8
+#else
+#define MLD_UNIT_COUNT 1
+#endif /* CONFIG_NO_MLD_ONLY_PRIVATE */
ovsdb_table_t table_Wifi_Radio_Config;
ovsdb_table_t table_Wifi_VAP_Config;
@@ -1033,6 +1040,10 @@ void callback_Wifi_VAP_Config(ovsdb_update_monitor_t *mon,
l_bss_param_cfg->mac_filter_enable = new_rec->mac_filter_enabled;
l_bss_param_cfg->mac_filter_mode = new_rec->mac_filter_mode;
l_bss_param_cfg->wmm_enabled = new_rec->wmm_enabled;
+ 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));
}
@@ -2771,6 +2782,11 @@ int wifidb_update_wifi_vap_info(char *vap_name, wifi_vap_info_t *config,
cfg.mbo_enabled = config->u.bss_info.mbo_enabled;
cfg.interop_ctrl = config->u.bss_info.interop_ctrl;
cfg.inum_sta = config->u.bss_info.inum_sta;
+ 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;
+
wifi_util_dbg_print(WIFI_DB,
"%s:%d: VAP Config update data cfg.radio_name=%s cfg.vap_name=%s cfg.ssid=%s "
"cfg.enabled=%d cfg.advertisement=%d cfg.isolation_enabled=%d "
@@ -2782,7 +2798,8 @@ 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 "
- "interop_ctrl:%d inum_sta:%d\n",
+ "interop_ctrl:%d inum_sta:%d "
+ "mld_enable=%d mld_id=%d mld_link_id=%d mld_apply=%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,
@@ -2792,7 +2809,8 @@ 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.interop_ctrl, cfg.inum_sta);
+ cfg.interop_ctrl, cfg.inum_sta,
+ cfg.mld_enable, cfg.mld_id, cfg.mld_link_id, cfg.mld_apply);
}
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)
{
@@ -4859,6 +4877,18 @@ static void wifidb_vap_config_upgrade(wifi_vap_info_map_t *config, rdk_wifi_vap_
config->vap_array[i].vap_name, ret);
}
}
+ if (g_wifidb->db_version < ONEWIFI_DB_VERSION_UPDATE_MLD_FLAG) {
+ wifi_util_info_print(WIFI_DB, "%s:%d upgrade vap's MLO configuration, db version %d\n",
+ __func__, __LINE__, g_wifidb->db_version);
+ if (!isVapSTAMesh(config->vap_array[i].vap_index)) {
+ config->vap_array[i].u.bss_info.mld_info.common_info.mld_enable = 0;
+ config->vap_array[i].u.bss_info.mld_info.common_info.mld_id = 255;
+ 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;
+ wifidb_update_wifi_vap_info(config->vap_array[i].vap_name, &config->vap_array[i],
+ &rdk_config[i]);
+ }
+ }
}
}
@@ -6187,6 +6217,10 @@ int wifidb_get_wifi_vap_info(char *vap_name, wifi_vap_info_t *config,
config->u.bss_info.interop_ctrl = pcfg->interop_ctrl;
config->u.bss_info.inum_sta = pcfg->inum_sta;
config->u.bss_info.mbo_enabled = pcfg->mbo_enabled;
+ 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);
@@ -7164,6 +7198,12 @@ int wifidb_init_vap_config_default(int vap_index, wifi_vap_info_t *config,
cfg.u.bss_info.beaconRate = WIFI_BITRATE_6MBPS;
strncpy(cfg.u.bss_info.beaconRateCtl,"6Mbps",sizeof(cfg.u.bss_info.beaconRateCtl)-1);
cfg.vap_mode = wifi_vap_mode_ap;
+ /*TODO: Are values correct? */
+ cfg.u.bss_info.mld_info.common_info.mld_enable = 0;
+ cfg.u.bss_info.mld_info.common_info.mld_id = 255;
+ 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)) {
cfg.u.bss_info.showSsid = true;
#ifdef FEATURE_SUPPORT_WPS
@@ -7543,6 +7583,88 @@ void wifidb_init_default_value()
}
+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;
+ 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;
+
+ 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(hal_vap_info_map));
+ /* 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);
+ 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);
+ 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));
+ }
+ }
+ }
+ return RETURN_OK;
+}
+
/************************************************************************************
************************************************************************************
Function : init_wifidb_data
@@ -7741,6 +7863,7 @@ void init_wifidb_data()
pthread_mutex_unlock(&g_wifidb->data_cache_lock);
return;
}
+ wifidb_vap_config_update_mld_mac();
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 de4af4273..ab9cb041a 100755
--- a/source/dml/tr_181/ml/cosa_wifi_dml.c
+++ b/source/dml/tr_181/ml/cosa_wifi_dml.c
@@ -6668,6 +6668,20 @@ AccessPoint_GetParamBoolValue
return TRUE;
}
+ if( AnscEqualString(ParamName, "MLD_Enable", TRUE))
+ {
+ /* collect value */
+ *pBool = pcfg->u.bss_info.mld_info.common_info.mld_enable;
+ 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 */
@@ -7023,6 +7037,18 @@ AccessPoint_GetParamUlongValue
return TRUE;
}
+ if( AnscEqualString(ParamName, "MLD_ID", TRUE))
+ {
+ *puLong = pcfg->u.bss_info.mld_info.common_info.mld_id;
+ return TRUE;
+ }
+
+ if( AnscEqualString(ParamName, "MLD_Link_ID", TRUE))
+ {
+ *puLong = pcfg->u.bss_info.mld_info.common_info.mld_link_id;
+ return TRUE;
+ }
+
if (AnscEqualString(ParamName, "X_CISCO_COM_LongRetryLimit", TRUE))
{
*puLong = cfg->long_retry_limit;
@@ -7171,6 +7197,38 @@ AccessPoint_GetParamStringValue
return 0;
}
+
+ if( AnscEqualString(ParamName, "MLD_Addr", TRUE))
+ {
+ char buff[24] = {0};
+ if (isVapSTAMesh(pcfg->vap_index)) {
+ _ansc_sprintf
+ (
+ buff,
+ "%02X:%02X:%02X:%02X:%02X:%02X",
+ 0x0,
+ 0x0,
+ 0x0,
+ 0x0,
+ 0x0,
+ 0x0
+ );
+ } else {
+ _ansc_sprintf
+ (
+ buff,
+ "%02X:%02X:%02X:%02X:%02X:%02X",
+ pcfg->u.bss_info.mld_info.common_info.mld_addr[0],
+ pcfg->u.bss_info.mld_info.common_info.mld_addr[1],
+ pcfg->u.bss_info.mld_info.common_info.mld_addr[2],
+ pcfg->u.bss_info.mld_info.common_info.mld_addr[3],
+ pcfg->u.bss_info.mld_info.common_info.mld_addr[4],
+ pcfg->u.bss_info.mld_info.common_info.mld_addr[5]
+ );
+ }
+ memcpy(pValue, buff, strlen(buff)+1);
+ return 0;
+ }
/* CcspTraceWarning(("Unsupported parameter '%s'\n", ParamName)); */
return -1;
}
@@ -7297,6 +7355,32 @@ AccessPoint_SetParamBoolValue
return TRUE;
}
+ if( AnscEqualString(ParamName, "MLD_Enable", TRUE))
+ {
+ 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 )
@@ -7612,7 +7696,6 @@ AccessPoint_SetParamIntValue
set_dml_cache_vap_config_changed(instance_number - 1);
return (TRUE);
}
-
/* CcspTraceWarning(("Unsupported parameter '%s'\n", ParamName)); */
return FALSE;
}
@@ -7714,6 +7797,31 @@ AccessPoint_SetParamUlongValue
cfg->associated_devices_highwatermark_threshold = uValue;
return TRUE;
}
+
+ if( AnscEqualString(ParamName, "MLD_ID", TRUE))
+ {
+ 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 ( vapInfo->u.bss_info.mld_info.common_info.mld_link_id == (unsigned int)uValue )
+ {
+ return TRUE;
+ }
+ /* save update to backup */
+ vapInfo->u.bss_info.mld_info.common_info.mld_link_id = uValue;
+ set_dml_cache_vap_config_changed(instance_number - 1);
+ 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 572146bb9..e96833a56 100644
--- a/source/utils/wifi_util.c
+++ b/source/utils/wifi_util.c
@@ -3870,6 +3870,14 @@ bool is_vap_param_config_changed(wifi_vap_info_t *vap_info_old, wifi_vap_info_t
vap_info_new->u.bss_info.mcast2ucast) ||
is_vap_preassoc_cac_config_changed(vap_info_new->vap_name,
&vap_info_old->u.bss_info.preassoc, &vap_info_new->u.bss_info.preassoc) ||
+ IS_CHANGED(vap_info_old->u.bss_info.mld_info.common_info.mld_enable,
+ vap_info_new->u.bss_info.mld_info.common_info.mld_enable) ||
+ IS_CHANGED(vap_info_old->u.bss_info.mld_info.common_info.mld_id,
+ vap_info_new->u.bss_info.mld_info.common_info.mld_id) ||
+ 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_CHANGED(vap_info_old->u.bss_info.hostap_mgt_frame_ctrl,
vap_info_new->u.bss_info.hostap_mgt_frame_ctrl) ||
IS_CHANGED(vap_info_old->u.bss_info.mbo_enabled,
diff --git a/source/utils/wifi_validator.c b/source/utils/wifi_validator.c
index 5e1a567db..ca5fff60d 100644
--- a/source/utils/wifi_validator.c
+++ b/source/utils/wifi_validator.c
@@ -1512,6 +1512,26 @@ int validate_vap(const cJSON *vap, wifi_vap_info_t *vap_info, wifi_platform_prop
validate_param_bool(vap, "SSIDAdvertisementEnabled", param);
vap_info->u.bss_info.showSsid = (param->type & cJSON_True) ? true:false;
+ // MLD Enable
+ 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;
+
+ // MLD Link ID
+ validate_param_integer(vap, "MLD_Link_ID", param);
+ vap_info->u.bss_info.mld_info.common_info.mld_link_id = param->valuedouble;
+
+ // MLD_Addr
+ validate_param_string(vap, "MLD_Addr", param);
+ string_mac_to_uint8_mac((uint8_t *)&vap_info->u.bss_info.mld_info.common_info.mld_addr, param->valuestring);
+
// Isolation
validate_param_bool(vap, "IsolationEnable", param);
vap_info->u.bss_info.isolation = (param->type & cJSON_True) ? true:false;
diff --git a/source/webconfig/wifi_decoder.c b/source/webconfig/wifi_decoder.c
index 9b6941950..a7924c9f6 100644
--- a/source/webconfig/wifi_decoder.c
+++ b/source/webconfig/wifi_decoder.c
@@ -1564,7 +1564,27 @@ webconfig_error_t decode_vap_common_object(const cJSON *vap, wifi_vap_info_t *va
decode_param_bool(vap, "MDUEnabled", param);
vap_info->u.bss_info.mdu_enabled = (param->type & cJSON_True) ? true : false;
}
-
+
+ // MLD Enable
+ 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;
+
+ // MLD_Link_ID
+ decode_param_integer(vap, "MLD_Link_ID", param);
+ vap_info->u.bss_info.mld_info.common_info.mld_link_id = param->valuedouble;
+
+ // MLD_Addr
+ decode_param_string(vap, "MLD_Addr", param);
+ string_mac_to_uint8_mac(vap_info->u.bss_info.mld_info.common_info.mld_addr, param->valuestring);
+
// Isolation
decode_param_bool(vap, "IsolationEnable", param);
vap_info->u.bss_info.isolation = (param->type & cJSON_True) ? true : false;
diff --git a/source/webconfig/wifi_encoder.c b/source/webconfig/wifi_encoder.c
index 840f244a3..539ff029d 100644
--- a/source/webconfig/wifi_encoder.c
+++ b/source/webconfig/wifi_encoder.c
@@ -368,6 +368,7 @@ webconfig_error_t encode_vap_common_object(const wifi_vap_info_t *vap_info,
const rdk_wifi_vap_info_t *rdk_vap_info, cJSON *vap_object)
{
char mac_str[32];
+ char mld_mac_str[32];
//VAP Name
cJSON_AddStringToObject(vap_object, "VapName", vap_info->vap_name);
@@ -408,6 +409,22 @@ webconfig_error_t encode_vap_common_object(const wifi_vap_info_t *vap_info,
// Managed WiFi Phase 2 Enabled
cJSON_AddBoolToObject(vap_object, "MDUEnabled", vap_info->u.bss_info.mdu_enabled);
+ // 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);
+
+ // MLD_Link_ID
+ cJSON_AddNumberToObject(vap_object, "MLD_Link_ID", vap_info->u.bss_info.mld_info.common_info.mld_link_id);
+
+ // MLD_Addr
+ uint8_mac_to_string_mac((uint8_t *)vap_info->u.bss_info.mld_info.common_info.mld_addr, mld_mac_str);
+ cJSON_AddStringToObject(vap_object, "MLD_Addr", mld_mac_str);
+
// Isolation
cJSON_AddBoolToObject(vap_object, "IsolationEnable", vap_info->u.bss_info.isolation);