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