Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions config/TR181-WiFi-USGv2.XML
Original file line number Diff line number Diff line change
Expand Up @@ -1182,6 +1182,12 @@ INSTMSMT_PH2 -->
<syntax>uint32</syntax>
<writable>true</writable>
</parameter>
<parameter>
<name>X_RDK_MLDLinkID</name>
<type>unsignedInt[0:255]</type>
<syntax>uint32</syntax>
<writable>true</writable>
</parameter>
<parameter>
<name>OperatingChannelBandwidth</name>
<type>string: Auto(0),20MHz(1),40MHz(2),80MHz(3),160MHz(4),80_80MHz(5),320MHz(6)</type>
Expand Down Expand Up @@ -1972,12 +1978,6 @@ INSTMSMT_PH2 -->
<syntax>int</syntax>
<writable>true</writable>
</parameter>
<parameter>
<name>X_RDK_MLDLinkID</name>
<type>unsignedInt[0:255]</type>
<syntax>uint32</syntax>
<writable>true</writable>
</parameter>
<parameter>
<name>Enable</name>
<type>boolean</type>
Expand Down
8 changes: 4 additions & 4 deletions config/bus_dml_config.json
Original file line number Diff line number Diff line change
Expand Up @@ -1084,6 +1084,10 @@
"$ref": "#/definitions/uint32_t",
"writable": true
},
"X_RDK_MLDLinkID": {
"$ref": "#/definitions/linkid_t",
"writable": true
},
"AutoChannelSupported": {
"type": "boolean",
"writable": false
Expand Down Expand Up @@ -1327,10 +1331,6 @@
"X_COMCAST-COM_DefaultSSID": {
"type": "string",
"writable": false
},
"X_RDK_MLDLinkID": {
"$ref": "#/definitions/linkid_t",
"writable": true
}
}
}
Expand Down
13 changes: 12 additions & 1 deletion config/rdkb-wifi.ovsschema
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "Wifi_Rdk_Database",
"version": "1.00.051",
"version": "1.00.052",
"cksum": "2353365742 523",
"tables": {
"Wifi_Device_Config": {
Expand Down Expand Up @@ -1255,6 +1255,17 @@
"max": 1
}
},
"mld_link_id": {
"type": {
"key": {
"type": "integer",
"minInteger": 0,
"maxInteger": 255
},
"min": 0,
"max": 1
}
},
"channel": {
"type": {
"key": {
Expand Down
5 changes: 4 additions & 1 deletion lib/inc/schema_gen.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down Expand Up @@ -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) \
Expand Down Expand Up @@ -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"
Expand Down
15 changes: 11 additions & 4 deletions source/core/wifi_ctrl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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",
Expand Down
11 changes: 7 additions & 4 deletions source/core/wifi_ctrl_webconfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
}

Expand Down
1 change: 1 addition & 0 deletions source/db/wifi_db.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
35 changes: 35 additions & 0 deletions source/db/wifi_db_apis.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -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));
}
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 */
}

Expand Down Expand Up @@ -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 |
Expand Down
83 changes: 23 additions & 60 deletions source/dml/tr_181/ml/cosa_wifi_dml.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand Down
Loading
Loading