diff --git a/include/wifi_base.h b/include/wifi_base.h index 274c30259..715c043cd 100644 --- a/include/wifi_base.h +++ b/include/wifi_base.h @@ -1192,6 +1192,19 @@ typedef struct { radio_metrics_policy_t radio_metrics_policy[EM_MAX_RADIO_POLICY]; } radio_metrics_policies_t; +#define EM_MAX_SSID_LEN 33 +typedef struct { + unsigned char ssid_len; + char ssid[EM_MAX_SSID_LEN]; + unsigned short vlan_id; +} traffic_sep_policy_ssid_t; + +#define EM_MAX_TRAFFIC_SEP_POLICY 5 +typedef struct { + unsigned char ssids_num; + traffic_sep_policy_ssid_t ssids[EM_MAX_TRAFFIC_SEP_POLICY]; +} traffic_sep_policy_t; + typedef struct { ap_metrics_policy_t ap_metric_policy; steering_disallowed_policy_t local_steering_dslw_policy; @@ -1199,6 +1212,7 @@ typedef struct { backhaul_bss_config_policy_t backhaul_bss_config_policy; channel_scan_reporting_policy_t channel_scan_reporting_policy; radio_metrics_policies_t radio_metrics_policies; + traffic_sep_policy_t traffic_separation_policy; } em_config_t; typedef struct { diff --git a/source/core/wifi_ctrl_webconfig.c b/source/core/wifi_ctrl_webconfig.c index 1cb2b0926..91d836d58 100644 --- a/source/core/wifi_ctrl_webconfig.c +++ b/source/core/wifi_ctrl_webconfig.c @@ -1881,6 +1881,111 @@ int webconfig_hal_multivap_apply(wifi_ctrl_t *ctrl, webconfig_subdoc_decoded_dat return webconfig_hal_vap_apply_by_name(ctrl, data, vap_names, num_vaps); } +#ifdef EM_APP +int webconfig_em_subdoc_config_apply(wifi_ctrl_t *ctrl, webconfig_subdoc_decoded_data_t *data) +{ + vap_svc_t *svc; + UINT apIdx = 0, ret, index; + wifi_mgr_t *mgr = get_wifimgr_obj(); + rdk_wifi_vap_info_t *rdk_vap_info; + wifi_vap_info_map_t tgt_vap_map; + wifi_vap_info_t *vapInfo = NULL; + char update_status[128]; + for(index = 0; index < getTotalNumberVAPs(); index++) + { + int idx=0; + apIdx = VAP_INDEX(mgr->hal_cap, index); + vapInfo = get_wifidb_vap_parameters(apIdx); + + if ((svc = get_svc_by_name(ctrl, vapInfo->vap_name)) == NULL) { + continue; + } + + wifi_util_info_print(WIFI_CTRL,"%s:%d: ssids_num =%d \n",__func__, __LINE__,data->em_config.traffic_separation_policy.ssids_num); + + if(isVapPrivate(apIdx)) + { + if((strncmp(vapInfo->u.bss_info.ssid,data->em_config.traffic_separation_policy.ssids[0].ssid,sizeof(data->em_config.traffic_separation_policy.ssids[0].ssid))==0) + && (vapInfo->vlan_id == data->em_config.traffic_separation_policy.ssids[0].vlan_id)) + { + continue; + } + strncpy(vapInfo->u.bss_info.ssid,data->em_config.traffic_separation_policy.ssids[0].ssid,sizeof(data->em_config.traffic_separation_policy.ssids[0].ssid)); + vapInfo->vlan_id = data->em_config.traffic_separation_policy.ssids[0].vlan_id; + } + else if(isVapMesh(apIdx)) + { + if((strncmp(vapInfo->u.bss_info.ssid,data->em_config.traffic_separation_policy.ssids[0].ssid,sizeof(data->em_config.traffic_separation_policy.ssids[0].ssid))==0) + && (vapInfo->vlan_id == data->em_config.traffic_separation_policy.ssids[1].vlan_id)) + { + continue; + } + strncpy(vapInfo->u.bss_info.ssid,data->em_config.traffic_separation_policy.ssids[1].ssid,sizeof(data->em_config.traffic_separation_policy.ssids[1].ssid)); + vapInfo->vlan_id = data->em_config.traffic_separation_policy.ssids[1].vlan_id; + } + else if(isVapXhs(apIdx)) + { + if((strncmp(vapInfo->u.bss_info.ssid,data->em_config.traffic_separation_policy.ssids[2].ssid,sizeof(data->em_config.traffic_separation_policy.ssids[0].ssid))==0) + && (vapInfo->vlan_id == data->em_config.traffic_separation_policy.ssids[2].vlan_id)) + { + continue; + } + strncpy(vapInfo->u.bss_info.ssid,data->em_config.traffic_separation_policy.ssids[2].ssid,sizeof(data->em_config.traffic_separation_policy.ssids[2].ssid)); + vapInfo->vlan_id = data->em_config.traffic_separation_policy.ssids[2].vlan_id; + } + else if(isVapLnf(apIdx)) + { + if(strncmp(vapInfo->u.bss_info.ssid,data->em_config.traffic_separation_policy.ssids[3].ssid,sizeof(data->em_config.traffic_separation_policy.ssids[0].ssid))==0) + { + continue; + } + strncpy(vapInfo->u.bss_info.ssid,data->em_config.traffic_separation_policy.ssids[3].ssid,sizeof(data->em_config.traffic_separation_policy.ssids[3].ssid)); + vapInfo->vlan_id = data->em_config.traffic_separation_policy.ssids[3].vlan_id; + } + else if(isVapHotspot(apIdx)) + { + if(strncmp(vapInfo->u.bss_info.ssid,data->em_config.traffic_separation_policy.ssids[4].ssid,sizeof(data->em_config.traffic_separation_policy.ssids[4].ssid))==0) + { + continue; + } + strncpy(vapInfo->u.bss_info.ssid,data->em_config.traffic_separation_policy.ssids[4].ssid,sizeof(data->em_config.traffic_separation_policy.ssids[4].ssid)); + vapInfo->vlan_id = data->em_config.traffic_separation_policy.ssids[4].vlan_id; + } + else + { + wifi_util_error_print(WIFI_CTRL,"%s:%d: : No matching VAP type \n",__func__, __LINE__); + continue; + } + + if(strlen(vapInfo->u.bss_info.ssid)==0) + { + wifi_util_error_print(WIFI_CTRL, "%s:%d Failed to get rdk vap info for index %d\n",__func__, __LINE__, apIdx); + continue; + } + + + memset(&tgt_vap_map, 0, sizeof(wifi_vap_info_map_t)); + tgt_vap_map.num_vaps = 1; + memcpy(&tgt_vap_map.vap_array[0], vapInfo, sizeof(wifi_vap_info_t)); + rdk_vap_info = get_wifidb_rdk_vap_info(apIdx); + if (rdk_vap_info == NULL) { + wifi_util_error_print(WIFI_CTRL, "%s:%d Failed to get rdk vap info for index %d\n",__func__, __LINE__, apIdx); + continue; + } + ret = svc->update_fn(svc, vapInfo->radio_index, &tgt_vap_map, rdk_vap_info); + memset(update_status, 0, sizeof(update_status)); + snprintf(update_status, sizeof(update_status), "%s %s", vapInfo->vap_name, (ret == RETURN_OK)?"success":"fail"); + apps_mgr_analytics_event(&ctrl->apps_mgr, wifi_event_type_webconfig, wifi_event_webconfig_hal_result, update_status); + if (ret != RETURN_OK) { + wifi_util_error_print(WIFI_CTRL,"%s:%d: Private vaps service update_fn failed \n",__func__, __LINE__); + } else { + wifi_util_dbg_print(WIFI_CTRL,"%s:%d: Private vaps service update_fn success apIdx %d \n",__func__,__LINE__,apIdx); + } + } + return RETURN_OK; +} +#endif + static int remove_all_mac_acl_entries_from_cache_and_db(rdk_wifi_vap_info_t *current_config) { if (current_config == NULL || current_config->acl_map == NULL) { @@ -3066,7 +3171,26 @@ webconfig_error_t webconfig_ctrl_apply(webconfig_subdoc_t *doc, webconfig_subdoc } } break; - +#ifdef EM_APP + case webconfig_subdoc_type_em_config: + if (data->descriptor & webconfig_data_descriptor_encoded) { + if (ctrl->webconfig_state & radio_state_pending) { + ctrl->webconfig_state &= ~radio_state_pending; + ret = webconfig_bus_apply(ctrl, &data->u.encoded); + } + } else { + if (check_wifi_csa_sched_timeout_active_status(ctrl) == true) { + if (push_data_to_apply_pending_queue(data) != RETURN_OK) { + return webconfig_error_apply; + } + } else { + ctrl->webconfig_state |= radio_state_pending; + webconfig_analytic_event_data_to_hal_apply(data); + ret = webconfig_em_subdoc_config_apply(ctrl, &data->u.decoded); + } + } + break; +#endif default: break; } diff --git a/source/webconfig/wifi_decoder.c b/source/webconfig/wifi_decoder.c index 9d34610d8..05b5e5f91 100644 --- a/source/webconfig/wifi_decoder.c +++ b/source/webconfig/wifi_decoder.c @@ -5776,9 +5776,9 @@ webconfig_error_t decode_sta_beacon_report_object(const cJSON *obj_sta_cfg, webconfig_error_t decode_em_policy_object(const cJSON *em_cfg, em_config_t *em_config) { - const cJSON *param, *disallowed_sta_array, *sta_obj, *radio_metrics_obj; + const cJSON *param, *disallowed_sta_array, *sta_obj, *radio_metrics_obj, *traffic_sep_obj; const cJSON *policy_obj, *local_steering_policy, *btm_steering_policy, *backhaul_policy, - *channel_scan_policy, *radio_metrics_array; + *channel_scan_policy, *radio_metrics_array,*traffic_sep_policy, *traffic_sep_array; policy_obj = cJSON_GetObjectItem(em_cfg, "Policy"); if (policy_obj == NULL) { @@ -5927,6 +5927,44 @@ webconfig_error_t decode_em_policy_object(const cJSON *em_cfg, em_config_t *em_c em_config->radio_metrics_policies.radio_metrics_policy[i].sta_status = (param->type & cJSON_True) ? true : false; } + + // Traffic Separation Policy + traffic_sep_policy = cJSON_GetObjectItem(policy_obj, "Traffic Separation Policy"); + if (traffic_sep_policy == NULL) { + wifi_util_error_print(WIFI_WEBCONFIG, "%s:%d: [TRAFFIC_SEP] Traffic Separation Policy is NULL\n", + __func__, __LINE__); + return webconfig_error_decode; + } + + traffic_sep_array = cJSON_GetObjectItem(traffic_sep_policy, "Traffic Separation"); + if (traffic_sep_array == NULL) { + wifi_util_error_print(WIFI_WEBCONFIG, "%s:%d: [TRAFFIC_SEP] NULL Json pointer\n", __func__, __LINE__); + } + + if (cJSON_IsArray(traffic_sep_array) == false) { + wifi_util_error_print(WIFI_WEBCONFIG,"%s:%d:[TRAFFIC_SEP] Traffic Separation Policy object not present\n", __func__, __LINE__); + return webconfig_error_decode; + } + wifi_util_error_print(WIFI_WEBCONFIG, "%s:%d: [TRAFFIC_SEP] Traffic Separation count: %d\n", __func__, __LINE__, + cJSON_GetArraySize(traffic_sep_array)); + em_config->traffic_separation_policy.ssids_num = cJSON_GetArraySize(traffic_sep_array); + for (int i = 0; i < em_config->traffic_separation_policy.ssids_num; i++) { + unsigned char ssid_len; + traffic_sep_obj = cJSON_GetArrayItem(traffic_sep_array, i); + decode_param_allow_optional_string(traffic_sep_obj, "SSID Name", param); + ssid_len = strlen(param->valuestring); + em_config->traffic_separation_policy.ssids[i].ssid_len = ssid_len; + strncpy(em_config->traffic_separation_policy.ssids[i].ssid, param->valuestring, ssid_len); + em_config->traffic_separation_policy.ssids[i].ssid[ssid_len] = '\0'; + + decode_param_integer(traffic_sep_obj, "VLAN ID", param); + em_config->traffic_separation_policy.ssids[i].vlan_id = param->valuedouble; + + wifi_util_error_print(WIFI_WEBCONFIG, "%s:%d: [TRAFFIC_SEP] Traffic Separation SSID=%s, SSID Len=%d, VLAN=%d\n", __func__, __LINE__, + em_config->traffic_separation_policy.ssids[i].ssid, em_config->traffic_separation_policy.ssids[i].ssid_len, + em_config->traffic_separation_policy.ssids[i].vlan_id); + } + return webconfig_error_none; } diff --git a/source/webconfig/wifi_easymesh_translator.c b/source/webconfig/wifi_easymesh_translator.c index 9e23b0413..8f22d1cc0 100644 --- a/source/webconfig/wifi_easymesh_translator.c +++ b/source/webconfig/wifi_easymesh_translator.c @@ -180,9 +180,9 @@ void default_em_device_info(em_device_info_t *device_info, em_ieee_1905_securit strncpy(device_info->exec_env,"testEnv",strlen("testEnv")); memset(device_info->primary_device_type,'\0',sizeof(device_info->primary_device_type)); memset(device_info->secondary_device_type,'\0',sizeof(device_info->secondary_device_type)); - device_info->traffic_sep_cap = false; + device_info->traffic_sep_cap = true; device_info->report_unsuccess_assocs = false; - device_info->traffic_sep_allowed = false; + device_info->traffic_sep_allowed = true; device_info->svc_prio_allowed = false; device_info->sta_steer_state = false; device_info->coord_cac_allowed = false; @@ -2717,6 +2717,26 @@ webconfig_error_t translate_policy_cfg_object_from_easymesh_to_em_cfg(webconfig_ (em_policy_cfg->metrics_policy.radios[i].sta_policy >> 5) & 1; } + // Traffic Separation policy + policy_cfg->traffic_separation_policy.ssids_num = em_policy_cfg->traffic_separation_policy.ssids_num; + wifi_util_error_print(WIFI_WEBCONFIG, "%s:%d: [TRAFFIC_SEP] Traffic Separation policy ssids_num=%d\n", __func__, __LINE__, + em_policy_cfg->traffic_separation_policy.ssids_num); + for ( int i = 0; i < policy_cfg->traffic_separation_policy.ssids_num; i++) { + int len = em_policy_cfg->traffic_separation_policy.ssids[i].ssid_len; + memcpy(policy_cfg->traffic_separation_policy.ssids[i].ssid, + em_policy_cfg->traffic_separation_policy.ssids[i].ssid, len); + + policy_cfg->traffic_separation_policy.ssids[i].ssid[len] = '\0'; + policy_cfg->traffic_separation_policy.ssids[i].ssid_len = len; + + policy_cfg->traffic_separation_policy.ssids[i].vlan_id = em_policy_cfg->traffic_separation_policy.ssids[i].vlan_id; + + wifi_util_error_print(WIFI_WEBCONFIG, "%s:%d [TRAFFIC_SEP] SSID %s Len : %d VLAN %d\n", __func__, __LINE__, + policy_cfg->traffic_separation_policy.ssids[i].ssid, + policy_cfg->traffic_separation_policy.ssids[i].ssid_len, + policy_cfg->traffic_separation_policy.ssids[i].vlan_id); + } + return webconfig_error_none; } #endif diff --git a/source/webconfig/wifi_encoder.c b/source/webconfig/wifi_encoder.c index 35a6868d2..a784ffa20 100644 --- a/source/webconfig/wifi_encoder.c +++ b/source/webconfig/wifi_encoder.c @@ -2836,6 +2836,36 @@ webconfig_error_t encode_em_config_object(const em_config_t *em_config, cJSON *e em_config->radio_metrics_policies.radio_metrics_policy[i].sta_status); } + // Traffic Separation Policy + param_obj = cJSON_CreateObject(); + if (param_obj == NULL) { + wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d:[TRAFFIC_SEP] json create object failed\n", __func__, + __LINE__); + } + cJSON_AddItemToObject(policy_obj, "Traffic Separation Policy", param_obj); + param_arr = cJSON_CreateArray(); + if (param_arr == NULL) { + wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d: [TRAFFIC_SEP] json create object failed\n", __func__, + __LINE__); + } + cJSON_AddItemToObject(param_obj, "Traffic Separation", param_arr); + wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d [TRAFFIC_SEP] Traffic Separation num SSID %d\n", __func__, __LINE__, + em_config->traffic_separation_policy.ssids_num); + for (int i = 0; i < em_config->traffic_separation_policy.ssids_num; i++) { + param_obj = cJSON_CreateObject(); + if (param_obj == NULL) { + wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d:[TRAFFIC_SEP] json create object failed\n", __func__, + __LINE__); + } + cJSON_AddItemToArray(param_arr, param_obj); + cJSON_AddNumberToObject(param_obj, "VLAN ID", em_config->traffic_separation_policy.ssids[i].vlan_id); + cJSON_AddStringToObject(param_obj, "SSID Name", em_config->traffic_separation_policy.ssids[i].ssid); + wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d: [TRAFFIC_SEP] Traffic Separation SSID=%s, SSID_LEN=%d, VLAN=%d\n", __func__, __LINE__, + em_config->traffic_separation_policy.ssids[i].ssid, + em_config->traffic_separation_policy.ssids[i].ssid_len, + em_config->traffic_separation_policy.ssids[i].vlan_id); + } + return webconfig_error_none; }