diff --git a/config/TR181-WiFi-USGv2.XML b/config/TR181-WiFi-USGv2.XML index 45f0e9060..42b7bb123 100644 --- a/config/TR181-WiFi-USGv2.XML +++ b/config/TR181-WiFi-USGv2.XML @@ -1182,6 +1182,12 @@ INSTMSMT_PH2 --> uint32 true + + X_RDK_MLDLinkID + unsignedInt[0:255] + uint32 + true + OperatingChannelBandwidth string: Auto(0),20MHz(1),40MHz(2),80MHz(3),160MHz(4),80_80MHz(5),320MHz(6) @@ -1972,12 +1978,6 @@ INSTMSMT_PH2 --> int true - - X_RDK_MLDLinkID - unsignedInt[0:255] - uint32 - true - Enable boolean diff --git a/config/bus_dml_config.json b/config/bus_dml_config.json index b3028fb51..0ea8223b3 100644 --- a/config/bus_dml_config.json +++ b/config/bus_dml_config.json @@ -1084,6 +1084,10 @@ "$ref": "#/definitions/uint32_t", "writable": true }, + "X_RDK_MLDLinkID": { + "$ref": "#/definitions/linkid_t", + "writable": true + }, "AutoChannelSupported": { "type": "boolean", "writable": false @@ -1327,10 +1331,6 @@ "X_COMCAST-COM_DefaultSSID": { "type": "string", "writable": false - }, - "X_RDK_MLDLinkID": { - "$ref": "#/definitions/linkid_t", - "writable": true } } } diff --git a/config/rdkb-wifi.ovsschema b/config/rdkb-wifi.ovsschema index 2477f5ae1..95186c896 100644 --- a/config/rdkb-wifi.ovsschema +++ b/config/rdkb-wifi.ovsschema @@ -1,6 +1,6 @@ { "name": "Wifi_Rdk_Database", - "version": "1.00.051", + "version": "1.00.052", "cksum": "2353365742 523", "tables": { "Wifi_Device_Config": { @@ -1255,6 +1255,17 @@ "max": 1 } }, + "mld_link_id": { + "type": { + "key": { + "type": "integer", + "minInteger": 0, + "maxInteger": 255 + }, + "min": 0, + "max": 1 + } + }, "channel": { "type": { "key": { diff --git a/lib/inc/schema_gen.h b/lib/inc/schema_gen.h index 0b8a2684f..b05d07aa8 100644 --- a/lib/inc/schema_gen.h +++ b/lib/inc/schema_gen.h @@ -1597,6 +1597,7 @@ PJS_OVS_INT(dfs_timer) \ PJS_OVS_STRING(radar_detected, 256 + 1) \ PJS_OVS_STRING(amsdu_tid, 128 + 1) \ + PJS_OVS_INT(mld_link_id) \ ) #define PJS_SCHEMA_Wifi_Global_Config \ @@ -3299,7 +3300,8 @@ COLUMN(Tidle) \ COLUMN(dfs_timer) \ COLUMN(radar_detected) \ - COLUMN(amsdu_tid) + COLUMN(amsdu_tid) \ + COLUMN(mld_link_id) \ #define SCHEMA__Wifi_Global_Config "Wifi_Global_Config" #define SCHEMA_COLUMN__Wifi_Global_Config(COLUMN) \ @@ -4591,6 +4593,7 @@ #define SCHEMA__Wifi_Radio_Config__dfs_timer "dfs_timer" #define SCHEMA__Wifi_Radio_Config__radar_detected "radar_detected" #define SCHEMA__Wifi_Radio_Config__amsdu_tid "amsdu_tid" +#define SCHEMA__Wifi_Radio_Config__mld_link_id "mld_link_id" #define SCHEMA__Wifi_Global_Config__gas_config "gas_config" #define SCHEMA__Wifi_Global_Config__notify_wifi_changes "notify_wifi_changes" diff --git a/source/core/wifi_ctrl.c b/source/core/wifi_ctrl.c index 436fe5d27..6ae57ed45 100644 --- a/source/core/wifi_ctrl.c +++ b/source/core/wifi_ctrl.c @@ -3276,10 +3276,8 @@ UINT getNumberVAPsPerRadio(UINT radioIndex) #if defined(CONFIG_IEEE80211BE) && !defined(CONFIG_GENERIC_MLO) /* A radio is MLO-capable only if it is enabled, not in EcoPowerDown, and running 802.11be. */ -static bool is_radio_mlo_capable(unsigned int radio_index) +static bool is_radio_mlo_capable(wifi_radio_operationParam_t *radio_param) { - wifi_radio_operationParam_t *radio_param = getRadioOperationParam(radio_index); - if (radio_param == NULL) { return false; } @@ -3394,10 +3392,14 @@ unsigned int update_mld_groups(webconfig_subdoc_decoded_data_t *data, /* --- 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); + wifi_radio_operationParam_t *radio_oper = NULL; + if (mgr_vap_map == NULL) { continue; } + radio_oper = getRadioOperationParam(r_idx); + 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; @@ -3432,6 +3434,11 @@ unsigned int update_mld_groups(webconfig_subdoc_decoded_data_t *data, * Subsequent group iterations must not overwrite values * already propagated by an earlier group. */ if (i == 0) { + /* MLD Link ID is radio-scoped: when the radio carries a valid link id, + * it is the source of truth and is propagated to all of its VAPs. */ + if (radio_oper != NULL) { + mld_conf->mld_link_id = radio_oper->mldLinkId; + } 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); @@ -3455,7 +3462,7 @@ unsigned int update_mld_groups(webconfig_subdoc_decoded_data_t *data, } /* Radio must be enabled and in 802.11be mode for MLO VAP */ - if (is_radio_mlo_capable(mgr_vap->radio_index) == false) { + if (is_radio_mlo_capable(radio_oper) == false) { wifi_util_info_print(log_type, "%s:%d: vap_index=%d excluded from MLO unit %d " "(radio %u not enabled/EDPD/BE)\n", diff --git a/source/core/wifi_ctrl_webconfig.c b/source/core/wifi_ctrl_webconfig.c index 826eaa232..95cd29903 100644 --- a/source/core/wifi_ctrl_webconfig.c +++ b/source/core/wifi_ctrl_webconfig.c @@ -47,7 +47,7 @@ struct ow_conf_vif_config_cb_arg void print_wifi_hal_radio_data(wifi_dbg_type_t log_file_type, char *prefix, unsigned int radio_index, wifi_radio_operationParam_t *radio_config) { - wifi_util_info_print(log_file_type, "%s:%d: [%s] Wifi_Radio[%d]_Config data: enable = %d\n band = %d\n autoChannelEnabled = %d\n channel = %d\n numSecondaryChannels = %d\n channelSecondary = %s\n channelWidth = %d\n variant = %d\n csa_beacon_count = %d\n countryCode = %d\n DCSEnabled = %d\n dtimPeriod = %d\n beaconInterval = %d\n operatingClass = %d\n basicDataTransmitRates = %d\n operationalDataTransmitRates = %d\n fragmentationThreshold = %d\n guardInterval = %d\n transmitPower = %d\n rtsThreshold = %d\n factoryResetSsid = %d\n radioStatsMeasuringRate = %d\n radioStatsMeasuringInterval = %d\n ctsProtection = %d\n obssCoex = %d\n stbcEnable = %d\n greenFieldEnable = %d\n userControl = %d\n adminControl = %d\n chanUtilThreshold = %d\n chanUtilSelfHealEnable = %d\n EcoPowerDown = %d DFSTimer:%d \r\n", __func__, __LINE__, prefix, radio_index, radio_config->enable, radio_config->band, radio_config->autoChannelEnabled, radio_config->channel, radio_config->numSecondaryChannels, (char *)radio_config->channelSecondary, radio_config->channelWidth, radio_config->variant, radio_config->csa_beacon_count, radio_config->countryCode, radio_config->DCSEnabled, radio_config->dtimPeriod, radio_config->beaconInterval, radio_config->operatingClass, radio_config->basicDataTransmitRates, radio_config->operationalDataTransmitRates, radio_config->fragmentationThreshold, radio_config->guardInterval, radio_config->transmitPower, radio_config->rtsThreshold, radio_config->factoryResetSsid, radio_config->radioStatsMeasuringRate, radio_config->radioStatsMeasuringInterval, radio_config->ctsProtection, radio_config->obssCoex, radio_config->stbcEnable, radio_config->greenFieldEnable, radio_config->userControl, radio_config->adminControl, radio_config->chanUtilThreshold, radio_config->chanUtilSelfHealEnable, radio_config->EcoPowerDown, radio_config->DFSTimer); + wifi_util_info_print(log_file_type, "%s:%d: [%s] Wifi_Radio[%d]_Config data: enable = %d\n band = %d\n autoChannelEnabled = %d\n channel = %d\n numSecondaryChannels = %d\n channelSecondary = %s\n channelWidth = %d\n variant = %d\n csa_beacon_count = %d\n countryCode = %d\n DCSEnabled = %d\n dtimPeriod = %d\n beaconInterval = %d\n operatingClass = %d\n basicDataTransmitRates = %d\n operationalDataTransmitRates = %d\n fragmentationThreshold = %d\n guardInterval = %d\n transmitPower = %d\n rtsThreshold = %d\n factoryResetSsid = %d\n radioStatsMeasuringRate = %d\n radioStatsMeasuringInterval = %d\n ctsProtection = %d\n obssCoex = %d\n stbcEnable = %d\n greenFieldEnable = %d\n userControl = %d\n adminControl = %d\n chanUtilThreshold = %d\n chanUtilSelfHealEnable = %d\n EcoPowerDown = %d DFSTimer:%d mldLinkId = %d\r\n", __func__, __LINE__, prefix, radio_index, radio_config->enable, radio_config->band, radio_config->autoChannelEnabled, radio_config->channel, radio_config->numSecondaryChannels, (char *)radio_config->channelSecondary, radio_config->channelWidth, radio_config->variant, radio_config->csa_beacon_count, radio_config->countryCode, radio_config->DCSEnabled, radio_config->dtimPeriod, radio_config->beaconInterval, radio_config->operatingClass, radio_config->basicDataTransmitRates, radio_config->operationalDataTransmitRates, radio_config->fragmentationThreshold, radio_config->guardInterval, radio_config->transmitPower, radio_config->rtsThreshold, radio_config->factoryResetSsid, radio_config->radioStatsMeasuringRate, radio_config->radioStatsMeasuringInterval, radio_config->ctsProtection, radio_config->obssCoex, radio_config->stbcEnable, radio_config->greenFieldEnable, radio_config->userControl, radio_config->adminControl, radio_config->chanUtilThreshold, radio_config->chanUtilSelfHealEnable, radio_config->EcoPowerDown, radio_config->DFSTimer, radio_config->mldLinkId); } void print_wifi_hal_bss_vap_data(wifi_dbg_type_t log_file_type, char *prefix, @@ -2166,6 +2166,9 @@ static bool is_radio_param_config_changed(wifi_radio_operationParam_t *old , wif if (IS_CHANGED(old->variant,new->variant)) return true; if (IS_CHANGED(old->EcoPowerDown,new->EcoPowerDown)) return true; if (IS_CHANGED(old->DFSTimer, new->DFSTimer)) return true; +#if defined(CONFIG_IEEE80211BE) && !defined(CONFIG_GENERIC_MLO) + if (IS_CHANGED(old->mldLinkId, new->mldLinkId)) return true; +#endif /* CONFIG_IEEE80211BE && !CONFIG_GENERIC_MLO */ for (int i = 0; i < MAX_AMSDU_TID; ++i) { if (IS_CHANGED(old->amsduTid[i], new->amsduTid[i])) return true; @@ -2253,7 +2256,8 @@ static bool is_radio_mlo_trigger_changed(wifi_radio_operationParam_t *old_p, bool old_enabled = old_p->enable && !old_p->EcoPowerDown; bool new_enabled = new_p->enable && !new_p->EcoPowerDown; - return (old_enabled != new_enabled) || (old_be != new_be); + return (old_enabled != new_enabled) || (old_be != new_be) || + (old_p->mldLinkId != new_p->mldLinkId); } /* Re-encode the current mgr VAP config for one subdoc type and re-inject it @@ -2345,8 +2349,7 @@ static void trigger_mlo_vap_reconfiguration(wifi_ctrl_t *ctrl, unsigned int radi mld_conf = &vap->u.bss_info.mld_info.common_info; /* Only VAPs with valid MLD config participate in MLO. */ - if (mld_conf->mld_id >= MLD_UNIT_COUNT || - mld_conf->mld_link_id >= MAX_NUM_MLD_LINKS) { + if (mld_conf->mld_id >= MLD_UNIT_COUNT) { continue; } diff --git a/source/db/wifi_db.c b/source/db/wifi_db.c index 51b4e64f1..65754e83b 100644 --- a/source/db/wifi_db.c +++ b/source/db/wifi_db.c @@ -201,6 +201,7 @@ static int init_radio_config_default(int radio_index, wifi_radio_operationParam_ cfg.chanUtilThreshold = 90; cfg.chanUtilSelfHealEnable = 0; cfg.EcoPowerDown = false; + cfg.mldLinkId = 255; cfg.factoryResetSsid = 0; cfg.basicDataTransmitRates = WIFI_BITRATE_6MBPS | WIFI_BITRATE_12MBPS | WIFI_BITRATE_24MBPS; cfg.operationalDataTransmitRates = WIFI_BITRATE_6MBPS | WIFI_BITRATE_9MBPS | WIFI_BITRATE_12MBPS | WIFI_BITRATE_18MBPS | WIFI_BITRATE_24MBPS | WIFI_BITRATE_36MBPS | WIFI_BITRATE_48MBPS | WIFI_BITRATE_54MBPS; diff --git a/source/db/wifi_db_apis.c b/source/db/wifi_db_apis.c index 5b9fb692e..e5aeacc1b 100644 --- a/source/db/wifi_db_apis.c +++ b/source/db/wifi_db_apis.c @@ -94,6 +94,7 @@ #define ONEWIFI_DB_VERSION_ENCR_NEW_FLAG 100049 #define ONEWIFI_DB_VERSION_TCM_PER_VAP_FLAG 100050 #define ONEWIFI_DB_VERSION_HOSTAP_MGMT_FRAME_CTRL_NEW_FLAG 100051 +#define ONEWIFI_DB_VERSION_RADIO_MLD_LINK_ID_FLAG 100052 #define IGNITE_MIN_CHUTIL_THRESHOLD 50 #define IGNITE_MAX_CHUTIL_THRESHOLD 100 @@ -450,6 +451,7 @@ void callback_Wifi_Radio_Config(ovsdb_update_monitor_t *mon, } l_radio_cfg->autoChannelEnabled = new_rec->auto_channel_enabled; + l_radio_cfg->mldLinkId = new_rec->mld_link_id; l_radio_cfg->channel = new_rec->channel; l_radio_cfg->channelWidth = new_rec->channel_width; if ((new_rec->hw_mode != 0) && (validate_wifi_hw_variant(new_rec->freq_band, new_rec->hw_mode) == RETURN_OK)) { @@ -2074,6 +2076,8 @@ int wifidb_update_wifi_radio_config(int radio_index, wifi_radio_operationParam_t cfg.chan_util_selfheal_enable = config->chanUtilSelfHealEnable; cfg.eco_power_down = config->EcoPowerDown; cfg.dfs_timer = config->DFSTimer; + cfg.mld_link_id = config->mldLinkId; + if(strlen(config->radarDetected) != 0) { strncpy(cfg.radar_detected, config->radarDetected, sizeof(cfg.radar_detected)); } @@ -2207,6 +2211,7 @@ int wifidb_get_wifi_radio_config(int radio_index, wifi_radio_operationParam_t *c oper_radio->channel = cfg->channel; oper_radio->channelWidth = cfg->channel_width; oper_radio->DfsEnabled = cfg->dfs_enabled; + config->mldLinkId = cfg->mld_link_id; if (wifi_radio_operationParam_validation(&((wifi_mgr_t*) get_wifimgr_obj())->hal_cap, oper_radio) == RETURN_OK) { if((is_bootup) && (config->band == WIFI_FREQUENCY_5L_BAND @@ -5067,6 +5072,35 @@ static void wifidb_radio_config_upgrade(unsigned int index, wifi_radio_operation return; } } + + if (g_wifidb->db_version < ONEWIFI_DB_VERSION_RADIO_MLD_LINK_ID_FLAG) { + wifi_vap_info_map_t *vap_map = get_wifidb_vap_map(index); + + wifi_util_info_print(WIFI_DB, "%s:%d upgrade radio=%d mldLinkId, old db version: %d\n", + __func__, __LINE__, index, g_wifidb->db_version); + if (vap_map == NULL) { + wifi_util_error_print(WIFI_DB, "%s:%d failed to get vap map for radio %d\n", __func__, + __LINE__, index); + } else { + unsigned int vap_idx; + + for (vap_idx = 0; vap_idx < vap_map->num_vaps; vap_idx++) { + if (!isVapPrivate(vap_map->vap_array[vap_idx].vap_index)) { + continue; + } + config->mldLinkId = vap_map->vap_array[vap_idx].u.bss_info.mld_info.common_info.mld_link_id; + wifi_util_info_print(WIFI_DB, + "%s:%d radio %d mldLinkId set to %d from private vap %s\n", __func__, __LINE__, + index, config->mldLinkId, vap_map->vap_array[vap_idx].vap_name); + break; + } + if (wifidb_update_wifi_radio_config(index, config, rdk_config) != RETURN_OK) { + wifi_util_error_print(WIFI_DB, "%s:%d error in updating radio config\n", __func__, + __LINE__); + return; + } + } + } #endif /* CONFIG_IEEE80211BE */ } @@ -7439,6 +7473,7 @@ int wifidb_init_radio_config_default(int radio_index,wifi_radio_operationParam_t cfg->chanUtilThreshold = 90; cfg->chanUtilSelfHealEnable = 0; cfg->EcoPowerDown = false; + cfg->mldLinkId = 255; cfg->factoryResetSsid = 0; if ((is_device_type_sr213() == true) && (WIFI_FREQUENCY_2_4_BAND == cfg->band)) { cfg->basicDataTransmitRates = WIFI_BITRATE_1MBPS | WIFI_BITRATE_2MBPS | diff --git a/source/dml/tr_181/ml/cosa_wifi_dml.c b/source/dml/tr_181/ml/cosa_wifi_dml.c index 9e6d1fc8c..6d5510452 100755 --- a/source/dml/tr_181/ml/cosa_wifi_dml.c +++ b/source/dml/tr_181/ml/cosa_wifi_dml.c @@ -2417,6 +2417,12 @@ Radio_GetParamUlongValue return TRUE; } + if( AnscEqualString(ParamName, "X_RDK_MLDLinkID", TRUE)) + { + *puLong = pcfg->mldLinkId; + return TRUE; + } + if( AnscEqualString(ParamName, "MaxBitRate", TRUE)) { /* collect value */ @@ -3770,6 +3776,23 @@ Radio_SetParamUlongValue return TRUE; } + if( AnscEqualString(ParamName, "X_RDK_MLDLinkID", TRUE)) + { + if (uValue != 255 && uValue >= MAX_NUM_MLD_LINKS) { + wifi_util_error_print(WIFI_DMCLI, "%s:%d Invalid X_RDK_MLDLinkID value %lu\n", __func__, + __LINE__, uValue); + return FALSE; + } + if (wifiRadioOperParam->mldLinkId == uValue) { + return TRUE; + } + wifiRadioOperParam->mldLinkId = uValue; + wifi_util_dbg_print(WIFI_DMCLI, "%s:%d: mldLinkId=%lu radio_index=%d\n", __func__, __LINE__, + uValue, instance_number); + is_radio_config_changed = TRUE; + return TRUE; + } + if (AnscEqualString(ParamName, "OperatingChannelBandwidth", TRUE)) { if (operChanBandwidthDmlEnumtoHalEnum(uValue, &tmpChanWidth) != ANSC_STATUS_SUCCESS) { return FALSE; @@ -5569,19 +5592,6 @@ 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; } @@ -6080,53 +6090,6 @@ SSID_SetParamUlongValue 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, - temp_vapInfo->u.bss_info.mld_info.common_info.mld_link_id, uValue); - 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/platform/common/data_model/wifi_dml_cb.c b/source/platform/common/data_model/wifi_dml_cb.c index eb3c97044..e4358a0f0 100644 --- a/source/platform/common/data_model/wifi_dml_cb.c +++ b/source/platform/common/data_model/wifi_dml_cb.c @@ -867,6 +867,8 @@ bool radio_get_param_uint_value(void *obj_ins_context, char *param_name, uint32_ dml_radio_default *dm_radio_default = get_radio_default_obj(radio_index); DM_CHECK_NULL_WITH_RC(dm_radio_default, false); *output_value = dm_radio_default->ExtensionChannel; + } else if (STR_CMP(param_name, "X_RDK_MLDLinkID")) { + *output_value = pcfg->mldLinkId; } else { wifi_util_info_print(WIFI_DMCLI, "%s:%d: unsupported param name:%s\n", __func__, __LINE__, param_name); @@ -1299,6 +1301,19 @@ bool radio_set_param_uint_value(void *obj_ins_context, char *param_name, uint32_ if (dm_radio_default->ExtensionChannel != output_value) { dm_radio_default->ExtensionChannel = output_value; } + } else if (STR_CMP(param_name, "X_RDK_MLDLinkID")) { + if (output_value != 255 && output_value >= MAX_NUM_MLD_LINKS) { + wifi_util_error_print(WIFI_DMCLI, "%s:%d Invalid X_RDK_MLDLinkID value %u\n", __func__, + __LINE__, output_value); + return false; + } + if (dm_radio_param->mldLinkId == output_value) { + return true; + } + dm_radio_param->mldLinkId = output_value; + wifi_util_dbg_print(WIFI_DMCLI, "%s:%d: mldLinkId=%u radio_index=%d\n", __func__, __LINE__, + dm_radio_param->mldLinkId, radio_index); + is_radio_config_changed = true; } else { wifi_util_info_print(WIFI_DMCLI, "%s:%d: unsupported param name:%s\n", __func__, __LINE__, param_name); @@ -2241,15 +2256,6 @@ bool ssid_get_param_uint_value(void *obj_ins_context, char *param_name, uint32_t if (STR_CMP(param_name, "LastChange")) { *output_value = (uint32_t)get_current_time_in_sec(); - } else if (STR_CMP(param_name, "X_RDK_MLDLinkID")) { - 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; - } - *output_value = (uint32_t)mld_common_info->mld_link_id; } else { wifi_util_info_print(WIFI_DMCLI, "%s:%d: unsupported param name:%s\n", __func__, __LINE__, param_name); @@ -2538,47 +2544,9 @@ bool ssid_set_param_uint_value(void *obj_ins_context, char *param_name, uint32_t DM_CHECK_NULL_WITH_RC(pcfg, false); - if (STR_CMP(param_name, "X_RDK_MLDLinkID")) { - 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, - (uint32_t)temp_vapInfo->u.bss_info.mld_info.common_info.mld_link_id, output_value); - if (temp_vapInfo->u.bss_info.mld_info.common_info.mld_link_id == output_value) { - continue; - } - temp_vapInfo->u.bss_info.mld_info.common_info.mld_link_id = output_value; - set_dml_cache_vap_config_changed(vap_idx); - } - return true; - } else { - wifi_util_info_print(WIFI_DMCLI, "%s:%d: unsupported param name:%s\n",__func__, __LINE__, param_name); - return false; - } - - return true; + wifi_util_info_print(WIFI_DMCLI, "%s:%d: unsupported param name:%s\n", __func__, __LINE__, + param_name); + return false; } bool ssid_set_param_string_value(void *obj_ins_context, char *param_name, diff --git a/source/webconfig/wifi_decoder.c b/source/webconfig/wifi_decoder.c index 77f7d7df4..1dde7fae5 100644 --- a/source/webconfig/wifi_decoder.c +++ b/source/webconfig/wifi_decoder.c @@ -3309,6 +3309,9 @@ webconfig_error_t decode_radio_object(const cJSON *obj_radio, rdk_wifi_radio_t * } #endif // FEATURE_SUPPORT_ECOPOWERDOWN + decode_param_integer(obj_radio, "MldLinkId", param); + radio_info->mldLinkId = param->valuedouble; + // Tscan decode_param_integer(obj_radio, "Tscan", param); radio_feat->OffChanTscanInMsec = param->valuedouble; diff --git a/source/webconfig/wifi_encoder.c b/source/webconfig/wifi_encoder.c index 3ad57c056..5c16211cc 100644 --- a/source/webconfig/wifi_encoder.c +++ b/source/webconfig/wifi_encoder.c @@ -336,6 +336,9 @@ webconfig_error_t encode_radio_object(const rdk_wifi_radio_t *radio, cJSON *radi // EcoPowerDown cJSON_AddBoolToObject(radio_object, "EcoPowerDown", radio_info->EcoPowerDown); + // MldLinkId + cJSON_AddNumberToObject(radio_object, "MldLinkId", radio_info->mldLinkId); + //Tscan cJSON_AddNumberToObject(radio_object, "Tscan", radio_feat->OffChanTscanInMsec);