diff --git a/include/wifi_base.h b/include/wifi_base.h index 47a0e7c0e..1de09cfdc 100644 --- a/include/wifi_base.h +++ b/include/wifi_base.h @@ -1298,6 +1298,63 @@ typedef struct { radio_metrics_policy_t radio_metrics_policy[EM_MAX_RADIO_POLICY]; } radio_metrics_policies_t; +typedef struct { + bool report_unassoc_sta; + unsigned int max_reporting_rate; +} unsuccessful_assoc_policy_t; + +#define EM_MAX_QOS_MAC 16 +typedef struct { + int num_mscs; + mac_addr_t mscs_mac[EM_MAX_QOS_MAC]; + int num_scs; + mac_addr_t scs_mac[EM_MAX_QOS_MAC]; +} qos_mgt_policy_t; + +typedef struct { + unsigned short primary_vid; + unsigned char default_pcp; +} default_8021q_policy_t; + +#define EM_MAX_SSIDS_TRAFFIC_SEP 8 +typedef struct { + char ssid[33]; + unsigned short vlan_id; +} ssid_vlan_info_t; + +typedef struct { + int num_ssids; + ssid_vlan_info_t ssid_info[EM_MAX_SSIDS_TRAFFIC_SEP]; +} traffic_separation_policy_t; + +typedef struct { + mac_addr_t ruid; + int policy; + int util_threshold; + int rcpi_threshold; +} radio_steering_policy_t; + +typedef struct { + int radio_count; + radio_steering_policy_t radio_steering_policy[EM_MAX_RADIO_POLICY]; +} radio_steering_policies_t; + +/* Bitmask flags for em_policy_cfg_params_t::present_mask (em_base.h) — used by the + * encoder to determine which policy sections to include. Zero = encode all. */ +#define EM_POLICY_PRESENT_ALARM (1u << 0) +#define EM_POLICY_PRESENT_AP_METRICS (1u << 1) +#define EM_POLICY_PRESENT_LOCAL_STEERING (1u << 2) +#define EM_POLICY_PRESENT_BTM_STEERING (1u << 3) +#define EM_POLICY_PRESENT_BACKHAUL_BSS (1u << 4) +#define EM_POLICY_PRESENT_CHAN_SCAN (1u << 5) +#define EM_POLICY_PRESENT_RADIO_METRICS (1u << 6) +#define EM_POLICY_PRESENT_UNSUCCESS_ASSOC (1u << 7) +#define EM_POLICY_PRESENT_QOS_MGT (1u << 8) +#define EM_POLICY_PRESENT_8021Q (1u << 9) +#define EM_POLICY_PRESENT_TRAFFIC_SEP (1u << 10) +#define EM_POLICY_PRESENT_CLIENT_FILTERS (1u << 11) +#define EM_POLICY_PRESENT_RADIO_STEERING (1u << 12) + typedef struct { alarm_report_policy_t alarm_report_policy; ap_metrics_policy_t ap_metric_policy; @@ -1306,6 +1363,12 @@ 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; + unsuccessful_assoc_policy_t unsuccess_assoc_policy; + qos_mgt_policy_t qos_mgt_policy; + default_8021q_policy_t default_8021q_policy; + // traffic_separation_policy_t traffic_separation_policy; + radio_steering_policies_t radio_steering_policies; + uint32_t em_policy_present_mask; /* EM_POLICY_PRESENT_* flags; 0 = encode all sections */ } em_config_t; typedef struct { diff --git a/source/webconfig/wifi_decoder.c b/source/webconfig/wifi_decoder.c index 83e43defe..f94df81c6 100644 --- a/source/webconfig/wifi_decoder.c +++ b/source/webconfig/wifi_decoder.c @@ -6294,6 +6294,9 @@ webconfig_error_t decode_em_policy_object(const cJSON *em_cfg, em_config_t *em_c const cJSON *param, *disallowed_sta_array, *sta_obj, *radio_metrics_obj; const cJSON *policy_obj, *local_steering_policy, *btm_steering_policy, *backhaul_policy, *channel_scan_policy, *radio_metrics_array; + const cJSON *unsuccess_assoc_policy, *qos_mgt_policy, *def_8021q_policy; + const cJSON *traffic_sep_policy, *client_filters_policy, *radio_steer_array, *radio_steer_obj; + char mac_str[32]; policy_obj = cJSON_GetObjectItem(em_cfg, "Policy"); if (policy_obj == NULL) { @@ -6403,15 +6406,18 @@ webconfig_error_t decode_em_policy_object(const cJSON *em_cfg, em_config_t *em_c return webconfig_error_decode; } - decode_param_allow_optional_string(backhaul_policy, "BSSID", param); - strncpy((char *)em_config->backhaul_bss_config_policy.bssid, param->valuestring, - sizeof(bssid_t)); - - decode_param_allow_optional_string(backhaul_policy, "Profile-1 bSTA Disallowed", param); - em_config->backhaul_bss_config_policy.profile_1_bsta_disallowed = 0; // param->valuedouble; - - decode_param_allow_optional_string(backhaul_policy, "Profile-2 bSTA Disallowed", param); - em_config->backhaul_bss_config_policy.profile_2_bsta_disallowed = 1; // param->valuedouble; + if (cJSON_IsArray(backhaul_policy) && cJSON_GetArraySize(backhaul_policy) > 0) { + const cJSON *bss_item = cJSON_GetArrayItem(backhaul_policy, 0); + decode_param_allow_optional_string(bss_item, "BSSID", param); + strncpy((char *)em_config->backhaul_bss_config_policy.bssid, param->valuestring, + sizeof(bssid_t)); + decode_param_bool(bss_item, "Profile-1 bSTA Disallowed", param); + em_config->backhaul_bss_config_policy.profile_1_bsta_disallowed = + (param->type & cJSON_True) ? true : false; + decode_param_bool(bss_item, "Profile-2 bSTA Disallowed", param); + em_config->backhaul_bss_config_policy.profile_2_bsta_disallowed = + (param->type & cJSON_True) ? true : false; + } // Channel Scan Reporting Policy channel_scan_policy = cJSON_GetObjectItem(policy_obj, "Channel Scan Reporting Policy"); @@ -6467,6 +6473,91 @@ 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; } + + // Unsuccessful Association Policy + unsuccess_assoc_policy = cJSON_GetObjectItem(policy_obj, "Unsuccessful Association Policy"); + if (unsuccess_assoc_policy != NULL) { + decode_param_bool(unsuccess_assoc_policy, "Report Unsuccessful Associations", param); + em_config->unsuccess_assoc_policy.report_unassoc_sta = + (param->type & cJSON_True) ? true : false; + decode_param_integer(unsuccess_assoc_policy, "Maximum Reporting Rate", param); + em_config->unsuccess_assoc_policy.max_reporting_rate = param->valuedouble; + } + + // QoS Management Policy + qos_mgt_policy = cJSON_GetObjectItem(policy_obj, "QoS Management Policy"); + if (qos_mgt_policy != NULL) { + const cJSON *mscs_arr = cJSON_GetObjectItem(qos_mgt_policy, "MSCS Disallowed STA List"); + if (mscs_arr != NULL && cJSON_IsArray(mscs_arr)) { + em_config->qos_mgt_policy.num_mscs = cJSON_GetArraySize(mscs_arr); + for (int i = 0; i < em_config->qos_mgt_policy.num_mscs && i < EM_MAX_QOS_MAC; i++) { + const cJSON *mac_item = cJSON_GetArrayItem(mscs_arr, i); + str_to_mac_bytes(cJSON_GetStringValue(mac_item), + em_config->qos_mgt_policy.mscs_mac[i]); + } + } + const cJSON *scs_arr = cJSON_GetObjectItem(qos_mgt_policy, "SCS Disallowed STA List"); + if (scs_arr != NULL && cJSON_IsArray(scs_arr)) { + em_config->qos_mgt_policy.num_scs = cJSON_GetArraySize(scs_arr); + for (int i = 0; i < em_config->qos_mgt_policy.num_scs && i < EM_MAX_QOS_MAC; i++) { + const cJSON *mac_item = cJSON_GetArrayItem(scs_arr, i); + str_to_mac_bytes(cJSON_GetStringValue(mac_item), + em_config->qos_mgt_policy.scs_mac[i]); + } + } + } + + // Default 802.1Q Settings Policy + def_8021q_policy = cJSON_GetObjectItem(policy_obj, "Default 802.1Q Settings Policy"); + if (def_8021q_policy != NULL) { + decode_param_integer(def_8021q_policy, "Primay VLAN ID", param); + em_config->default_8021q_policy.primary_vid = (unsigned short)param->valuedouble; + decode_param_integer(def_8021q_policy, "Default PCP", param); + em_config->default_8021q_policy.default_pcp = (unsigned char)param->valuedouble; + } + + // Traffic Separation Policy + // traffic_sep_policy = cJSON_GetObjectItem(policy_obj, "Traffic Separation Policy"); + // if (traffic_sep_policy != NULL) { + // const cJSON *ssid_arr = cJSON_GetObjectItem(traffic_sep_policy, "SSID List"); + // if (ssid_arr != NULL && cJSON_IsArray(ssid_arr)) { + // em_config->traffic_separation_policy.num_ssids = cJSON_GetArraySize(ssid_arr); + // for (int i = 0; i < em_config->traffic_separation_policy.num_ssids && + // i < EM_MAX_SSIDS_TRAFFIC_SEP; i++) { + // const cJSON *ssid_obj = cJSON_GetArrayItem(ssid_arr, i); + // decode_param_allow_optional_string(ssid_obj, "SSID", param); + // strncpy(em_config->traffic_separation_policy.ssid_info[i].ssid, + // param->valuestring, + // sizeof(em_config->traffic_separation_policy.ssid_info[i].ssid) - 1); + // decode_param_integer(ssid_obj, "VLAN ID", param); + // em_config->traffic_separation_policy.ssid_info[i].vlan_id = + // (unsigned short)param->valuedouble; + // } + // } + // } + + // Radio Steering Parameters + radio_steer_array = cJSON_GetObjectItem(policy_obj, "Radio Steering Parameters"); + if (radio_steer_array != NULL && cJSON_IsArray(radio_steer_array)) { + em_config->radio_steering_policies.radio_count = cJSON_GetArraySize(radio_steer_array); + for (int i = 0; i < em_config->radio_steering_policies.radio_count && + i < EM_MAX_RADIO_POLICY; i++) { + radio_steer_obj = cJSON_GetArrayItem(radio_steer_array, i); + decode_param_allow_optional_string(radio_steer_obj, "ID", param); + str_to_mac_bytes(param->valuestring, + em_config->radio_steering_policies.radio_steering_policy[i].ruid); + decode_param_integer(radio_steer_obj, "Steering Policy", param); + em_config->radio_steering_policies.radio_steering_policy[i].policy = + (int)param->valuedouble; + decode_param_integer(radio_steer_obj, "Utilization Threshold", param); + em_config->radio_steering_policies.radio_steering_policy[i].util_threshold = + (int)param->valuedouble; + decode_param_integer(radio_steer_obj, "RCPI Threshold", param); + em_config->radio_steering_policies.radio_steering_policy[i].rcpi_threshold = + (int)param->valuedouble; + } + } + return webconfig_error_none; } diff --git a/source/webconfig/wifi_easymesh_translator.c b/source/webconfig/wifi_easymesh_translator.c index a75e3039d..3fd40abe4 100644 --- a/source/webconfig/wifi_easymesh_translator.c +++ b/source/webconfig/wifi_easymesh_translator.c @@ -3087,9 +3087,13 @@ webconfig_error_t translate_policy_cfg_object_from_easymesh_to_em_cfg(webconfig_ sizeof(bssid_t)); policy_cfg->backhaul_bss_config_policy.profile_1_bsta_disallowed = em_policy_cfg->bh_bss_cfg_policy.p1_bsta_disallowed; - policy_cfg->backhaul_bss_config_policy.profile_1_bsta_disallowed = + policy_cfg->backhaul_bss_config_policy.profile_2_bsta_disallowed = em_policy_cfg->bh_bss_cfg_policy.p2_bsta_disallowed; + // default 802.1Q settings policy + policy_cfg->default_8021q_policy.primary_vid = em_policy_cfg->def_8021q_settings.primary_vlan_id; + policy_cfg->default_8021q_policy.default_pcp = em_policy_cfg->def_8021q_settings.default_pcp; + // channel scan reporting policy policy_cfg->channel_scan_reporting_policy.report_independent_channel_scan = em_policy_cfg->channel_scan_policy.rprt_ind_ch_scan; @@ -3113,6 +3117,9 @@ webconfig_error_t translate_policy_cfg_object_from_easymesh_to_em_cfg(webconfig_ (em_policy_cfg->metrics_policy.radios[i].sta_policy >> 5) & 1; } + /* store the received-sections bitmask so the encoder skips absent policy sections */ + policy_cfg->em_policy_present_mask = em_policy_cfg->present_mask; + return webconfig_error_none; } #endif diff --git a/source/webconfig/wifi_encoder.c b/source/webconfig/wifi_encoder.c index 587e1a3eb..c7844660b 100644 --- a/source/webconfig/wifi_encoder.c +++ b/source/webconfig/wifi_encoder.c @@ -2932,7 +2932,12 @@ webconfig_error_t encode_em_config_object(const em_config_t *em_config, cJSON *e cJSON_AddItemToObject(emconfig_obj, "Policy", policy_obj); - // AP Metrics Reporting Policy +/* em_policy_present_mask == 0 means full update (encode all); non-zero selects sections. */ +#define EM_POLICY_SECTION_PRESENT(flag) \ + ((em_config->em_policy_present_mask) == 0 || ((em_config->em_policy_present_mask) & (flag))) + + // Algorithm Run Policy (alarm threshold) + if (EM_POLICY_SECTION_PRESENT(EM_POLICY_PRESENT_ALARM)) { param_obj = cJSON_CreateObject(); if (param_obj == NULL) { wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d: json create object failed\n", __func__, @@ -2945,8 +2950,10 @@ webconfig_error_t encode_em_config_object(const em_config_t *em_config, cJSON *e em_config->alarm_report_policy.collection_start_time); cJSON_AddNumberToObject(param_obj, "Reporting Interval", em_config->alarm_report_policy.reporting_interval); cJSON_AddNumberToObject(param_obj, "Link Quality Threshold", em_config->alarm_report_policy.link_quality_threshold); + } // EM_POLICY_PRESENT_ALARM - // Algorithm Run Policy + // AP Metrics Reporting Policy + if (EM_POLICY_SECTION_PRESENT(EM_POLICY_PRESENT_AP_METRICS)) { param_obj = cJSON_CreateObject(); if (param_obj == NULL) { wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d: json create object failed\n", __func__, @@ -2957,8 +2964,10 @@ webconfig_error_t encode_em_config_object(const em_config_t *em_config, cJSON *e cJSON_AddNumberToObject(param_obj, "Interval", em_config->ap_metric_policy.interval); cJSON_AddStringToObject(param_obj, "Managed Client Marker", em_config->ap_metric_policy.managed_client_marker); + } // EM_POLICY_PRESENT_AP_METRICS // Local Steering Disallowed Policy + if (EM_POLICY_SECTION_PRESENT(EM_POLICY_PRESENT_LOCAL_STEERING)) { param_obj = cJSON_CreateObject(); if (param_obj == NULL) { wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d: json create object failed\n", __func__, @@ -2982,8 +2991,10 @@ webconfig_error_t encode_em_config_object(const em_config_t *em_config, cJSON *e cJSON_AddStringToObject(param_obj, "MAC", (const char *)em_config->local_steering_dslw_policy.disallowed_sta[i]); } + } // EM_POLICY_PRESENT_LOCAL_STEERING // BTM Steering Disallowed Policy + if (EM_POLICY_SECTION_PRESENT(EM_POLICY_PRESENT_BTM_STEERING)) { param_obj = cJSON_CreateObject(); if (param_obj == NULL) { wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d: json create object failed\n", __func__, @@ -3007,22 +3018,34 @@ webconfig_error_t encode_em_config_object(const em_config_t *em_config, cJSON *e cJSON_AddStringToObject(param_obj, "MAC", (const char *)em_config->btm_steering_dslw_policy.disallowed_sta[i]); } + } // EM_POLICY_PRESENT_BTM_STEERING // Backhaul BSS Configuration Policy + if (EM_POLICY_SECTION_PRESENT(EM_POLICY_PRESENT_BACKHAUL_BSS)) { + param_arr = cJSON_CreateArray(); + if (param_arr == NULL) { + wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d: json create object failed\n", __func__, + __LINE__); + return webconfig_error_encode; + } + cJSON_AddItemToObject(policy_obj, "Backhaul BSS Configuration Policy", param_arr); param_obj = cJSON_CreateObject(); if (param_obj == NULL) { wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d: json create object failed\n", __func__, __LINE__); + return webconfig_error_encode; } - cJSON_AddItemToObject(policy_obj, "Backhaul BSS Configuration Policy", param_obj); + cJSON_AddItemToArray(param_arr, param_obj); cJSON_AddStringToObject(param_obj, "BSSID", (const char *)em_config->backhaul_bss_config_policy.bssid); cJSON_AddBoolToObject(param_obj, "Profile-1 bSTA Disallowed", - 0); // em_config->backhaul_bss_config_policy.profile_1_bsta_disallowed); + em_config->backhaul_bss_config_policy.profile_1_bsta_disallowed); cJSON_AddBoolToObject(param_obj, "Profile-2 bSTA Disallowed", - 1); // em_config->backhaul_bss_config_policy.profile_2_bsta_disallowed); + em_config->backhaul_bss_config_policy.profile_2_bsta_disallowed); + } // EM_POLICY_PRESENT_BACKHAUL_BSS // Channel Scan Reporting Policy + if (EM_POLICY_SECTION_PRESENT(EM_POLICY_PRESENT_CHAN_SCAN)) { param_obj = cJSON_CreateObject(); if (param_obj == NULL) { wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d: json create object failed\n", __func__, @@ -3031,8 +3054,10 @@ webconfig_error_t encode_em_config_object(const em_config_t *em_config, cJSON *e cJSON_AddItemToObject(policy_obj, "Channel Scan Reporting Policy", param_obj); cJSON_AddNumberToObject(param_obj, "Report Independent Channel Scans", em_config->channel_scan_reporting_policy.report_independent_channel_scan); + } // EM_POLICY_PRESENT_CHAN_SCAN // Radio Specific Metrics Policy + if (EM_POLICY_SECTION_PRESENT(EM_POLICY_PRESENT_RADIO_METRICS)) { param_arr = cJSON_CreateArray(); if (param_arr == NULL) { wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d: json create object failed\n", __func__, @@ -3063,6 +3088,112 @@ webconfig_error_t encode_em_config_object(const em_config_t *em_config, cJSON *e cJSON_AddBoolToObject(param_obj, "STA Status", em_config->radio_metrics_policies.radio_metrics_policy[i].sta_status); } + } // EM_POLICY_PRESENT_RADIO_METRICS + + // Unsuccessful Association Policy + if (EM_POLICY_SECTION_PRESENT(EM_POLICY_PRESENT_UNSUCCESS_ASSOC)) { + param_obj = cJSON_CreateObject(); + if (param_obj == NULL) { + wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d: json create object failed\n", __func__, + __LINE__); + return webconfig_error_encode; + } + cJSON_AddItemToObject(policy_obj, "Unsuccessful Association Policy", param_obj); + cJSON_AddBoolToObject(param_obj, "Report Unsuccessful Associations", + em_config->unsuccess_assoc_policy.report_unassoc_sta); + cJSON_AddNumberToObject(param_obj, "Maximum Reporting Rate", + em_config->unsuccess_assoc_policy.max_reporting_rate); + } // EM_POLICY_PRESENT_UNSUCCESS_ASSOC + + // QoS Management Policy + if (EM_POLICY_SECTION_PRESENT(EM_POLICY_PRESENT_QOS_MGT)) { + param_obj = cJSON_CreateObject(); + if (param_obj == NULL) { + wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d: json create object failed\n", __func__, + __LINE__); + return webconfig_error_encode; + } + cJSON_AddItemToObject(policy_obj, "QoS Management Policy", param_obj); + param_arr = cJSON_CreateArray(); + cJSON_AddItemToObject(param_obj, "MSCS Disallowed STA List", param_arr); + for (int i = 0; i < em_config->qos_mgt_policy.num_mscs; i++) { + uint8_mac_to_string_mac((uint8_t *)em_config->qos_mgt_policy.mscs_mac[i], mac_str); + cJSON_AddItemToArray(param_arr, cJSON_CreateString(mac_str)); + } + param_arr = cJSON_CreateArray(); + cJSON_AddItemToObject(param_obj, "SCS Disallowed STA List", param_arr); + for (int i = 0; i < em_config->qos_mgt_policy.num_scs; i++) { + uint8_mac_to_string_mac((uint8_t *)em_config->qos_mgt_policy.scs_mac[i], mac_str); + cJSON_AddItemToArray(param_arr, cJSON_CreateString(mac_str)); + } + } // EM_POLICY_PRESENT_QOS_MGT + + // Default 802.1Q Settings Policy + if (EM_POLICY_SECTION_PRESENT(EM_POLICY_PRESENT_8021Q)) { + param_obj = cJSON_CreateObject(); + if (param_obj == NULL) { + wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d: json create object failed\n", __func__, + __LINE__); + return webconfig_error_encode; + } + cJSON_AddItemToObject(policy_obj, "Default 802.1Q Settings Policy", param_obj); + cJSON_AddNumberToObject(param_obj, "Primay VLAN ID", + em_config->default_8021q_policy.primary_vid); + cJSON_AddNumberToObject(param_obj, "Default PCP", + em_config->default_8021q_policy.default_pcp); + } // EM_POLICY_PRESENT_8021Q + + // Traffic Separation Policy + // if (EM_POLICY_SECTION_PRESENT(EM_POLICY_PRESENT_TRAFFIC_SEP)) { + // param_obj = cJSON_CreateObject(); + // if (param_obj == NULL) { + // wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d: json create object failed\n", __func__, + // __LINE__); + // return webconfig_error_encode; + // } + // cJSON_AddItemToObject(policy_obj, "Traffic Separation Policy", param_obj); + // param_arr = cJSON_CreateArray(); + // cJSON_AddItemToObject(param_obj, "SSID List", param_arr); + // for (int i = 0; i < em_config->traffic_separation_policy.num_ssids; i++) { + // cJSON *ssid_obj = cJSON_CreateObject(); + // cJSON_AddStringToObject(ssid_obj, "SSID", + // em_config->traffic_separation_policy.ssid_info[i].ssid); + // cJSON_AddNumberToObject(ssid_obj, "VLAN ID", + // em_config->traffic_separation_policy.ssid_info[i].vlan_id); + // cJSON_AddItemToArray(param_arr, ssid_obj); + // } + // } // EM_POLICY_PRESENT_TRAFFIC_SEP + + // Radio Steering Parameters + if (EM_POLICY_SECTION_PRESENT(EM_POLICY_PRESENT_RADIO_STEERING)) { + param_arr = cJSON_CreateArray(); + if (param_arr == NULL) { + wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d: json create object failed\n", __func__, + __LINE__); + return webconfig_error_encode; + } + cJSON_AddItemToObject(policy_obj, "Radio Steering Parameters", param_arr); + for (int i = 0; i < em_config->radio_steering_policies.radio_count; i++) { + param_obj = cJSON_CreateObject(); + if (param_obj == NULL) { + wifi_util_dbg_print(WIFI_WEBCONFIG, "%s:%d: json create object failed\n", __func__, + __LINE__); + return webconfig_error_encode; + } + cJSON_AddItemToArray(param_arr, param_obj); + uint8_mac_to_string_mac((uint8_t *)em_config->radio_steering_policies.radio_steering_policy[i].ruid, + mac_str); + cJSON_AddStringToObject(param_obj, "ID", mac_str); + cJSON_AddNumberToObject(param_obj, "Steering Policy", + em_config->radio_steering_policies.radio_steering_policy[i].policy); + cJSON_AddNumberToObject(param_obj, "Utilization Threshold", + em_config->radio_steering_policies.radio_steering_policy[i].util_threshold); + cJSON_AddNumberToObject(param_obj, "RCPI Threshold", + em_config->radio_steering_policies.radio_steering_policy[i].rcpi_threshold); + } + } // EM_POLICY_PRESENT_RADIO_STEERING + +#undef EM_POLICY_SECTION_PRESENT return webconfig_error_none; }