Merge "wifi-uci: [AUTO00214297] [[Colgin][RDKB][WiFi][MT76] add uci cmd for igmpsn,acl,wps]"
diff --git a/recipes-wifi/wifi-test-tool/files/src/wifi-test-tool.c b/recipes-wifi/wifi-test-tool/files/src/wifi-test-tool.c
index 76d9a13..1887aca 100644
--- a/recipes-wifi/wifi-test-tool/files/src/wifi-test-tool.c
+++ b/recipes-wifi/wifi-test-tool/files/src/wifi-test-tool.c
@@ -165,6 +165,49 @@
radio_param->txantenna = strtol(mask, NULL, 16);
}
+void set_igmpsn_enable(wifi_intf_param *intf_param, char *enable)
+{
+ if (strcmp(enable, "1") == 0)
+ intf_param->igmpsn_enable = TRUE;
+ else
+ intf_param->igmpsn_enable = FALSE;
+}
+
+void set_wps_state(wifi_intf_param *intf_param, char *enable)
+{
+ if (strcmp(enable, "1") == 0)
+ intf_param->wps_state = TRUE;
+ else
+ intf_param->wps_state = FALSE;
+}
+
+void set_wps_cancel(wifi_intf_param *intf_param, char *enable)
+{
+ if (strcmp(enable, "1") == 0)
+ intf_param->wps_cancel = TRUE;
+ else
+ intf_param->wps_cancel = FALSE;
+}
+
+void set_wps_pushbutton(wifi_intf_param *intf_param, char *enable)
+{
+ if (strcmp(enable, "1") == 0)
+ intf_param->wps_pushbutton = TRUE;
+ else
+ intf_param->wps_pushbutton = FALSE;
+}
+
+
+void set_macfilter(wifi_intf_param *intf_param, char *macfilter)
+{
+ strncpy(intf_param->macfilter, macfilter, 10);
+}
+
+void set_maclist(wifi_intf_param *intf_param, char *maclist)
+{
+ strncpy(intf_param->maclist, maclist, 512);
+}
+
void set_htcoex(wifi_radio_param *radio_param, char *ht_coex)
{
radio_param->ht_coex = strtol(ht_coex, NULL, 10);
@@ -455,6 +498,66 @@
// hidden
vap_info.u.bss_info.showSsid = (ap_param.hidden ? 0 : 1);
+ // igmpsn_enable
+ vap_info.u.bss_info.mcast2ucast = ap_param.igmpsn_enable;
+ fprintf(stderr, "Set igmpsn_enable: %d \n", ap_param.igmpsn_enable);
+
+ // wps_state
+ fprintf(stderr, "Set wps_state: %d \n", ap_param.wps_state);
+ ret = wifi_setApWpsEnable(ap_param.ap_index, ap_param.wps_state);
+ if (ret != RETURN_OK)
+ fprintf(stderr, "[Set wps_state failed!!!]\n");
+ ret = 0;
+
+ // wps_cancel
+ fprintf(stderr, "Set wps_cancel: %d \n", ap_param.wps_cancel);
+ if (ap_param.wps_cancel){
+ ret = wifi_cancelApWPS(ap_param.ap_index);
+ if (ret != RETURN_OK)
+ fprintf(stderr, "[Set wps_cancel failed!!!]\n");
+ ret = 0;
+ }
+
+ // wps_pushbutton
+ fprintf(stderr, "Set wps_pushbutton: %d \n", ap_param.wps_pushbutton);
+ if (ap_param.wps_pushbutton){
+ ret = wifi_setApWpsButtonPush(ap_param.ap_index);
+ if (ret != RETURN_OK)
+ fprintf(stderr, "[Set wps_pushbutton failed!!!]\n");
+ ret = 0;
+ }
+
+ // macfilter
+ if ((strcmp(ap_param.macfilter, "disable") == 0) || (strcmp(ap_param.macfilter, "\0") == 0) )
+ vap_info.u.bss_info.mac_filter_enable = false;
+ else if (strcmp(ap_param.macfilter, "deny") == 0){
+ vap_info.u.bss_info.mac_filter_enable = true;
+ vap_info.u.bss_info.mac_filter_mode = wifi_mac_filter_mode_black_list;
+ }
+ else if (strcmp(ap_param.macfilter, "allow") == 0){
+ vap_info.u.bss_info.mac_filter_enable = true;
+ vap_info.u.bss_info.mac_filter_mode = wifi_mac_filter_mode_white_list;
+ }
+ else
+ fprintf(stderr, "The macfilter tpye: %s is invalid!!!\n", ap_param.macfilter);
+ fprintf(stderr, "Set macfilter: %s \n", ap_param.macfilter);
+
+ // maclist
+ if ((strcmp(ap_param.macfilter, "\0") == 0)){
+ ret = wifi_delApAclDevices(ap_param.ap_index);
+ if (ret != RETURN_OK)
+ fprintf(stderr, "[Del all maclist failed!!!]\n");
+ ret = 0;
+ }
+ else{
+ ret = wifi_addApAclDevice(ap_param.ap_index, ap_param.maclist);
+ if (ret != RETURN_OK)
+ fprintf(stderr, "[Add maclist failed!!!]\n");
+ ret = 0;
+ }
+ fprintf(stderr, "Set maclist: %s \n", ap_param.maclist);
+
+ ret = 0;
// Replace the setting with uci config
map->vap_array[vap_index_in_map] = vap_info;
}
@@ -518,6 +621,73 @@
}
}
+void show_ap_param(wifi_intf_param ap_param , wifi_vap_info_map_t *map)
+{
+ int ret = 0;
+ int vap_index_in_map = 0;
+ int phy_index = 0;
+ wifi_vap_info_t vap_info = {0};
+ BOOL radio_enable = FALSE;
+ BOOL wps_state = FALSE;
+ UINT buf_size = 1024;
+ char macArray[1024] = "";
+
+ if(ap_param.radio_index == -1)
+ return;
+
+ wifi_getRadioEnable(ap_param.radio_index, &radio_enable);
+ if (radio_enable == FALSE)
+ return;
+
+
+ // get the index of the map
+ for (int i = 0; i < map->num_vaps; i++) {
+ if (map->vap_array[i].vap_index == ap_param.ap_index) {
+ vap_index_in_map = i;
+ break;
+ }
+ }
+
+ vap_info = map->vap_array[vap_index_in_map];
+ vap_info.u.bss_info.enabled = TRUE;
+ phy_index = radio_index_to_phy(vap_info.radio_index);
+
+ // SSID
+ printf("wifi%d ssid: %s\n", ap_param.ap_index, vap_info.u.bss_info.ssid);
+
+ // igmpsn_enable
+ printf("wifi%d igmpsn_enable: %d\n", ap_param.ap_index, vap_info.u.bss_info.mcast2ucast);
+
+ // wps_state
+ ret = wifi_getApWpsEnable(ap_param.ap_index, &wps_state);
+ if (ret != RETURN_OK)
+ fprintf(stderr, "[Set wps_state failed!!!]\n");
+ else
+ printf("wifi%d wps_state: %d\n", ap_param.ap_index, wps_state);
+ ret = 0;
+
+ // macfilter
+ if (vap_info.u.bss_info.mac_filter_enable == FALSE)
+ printf("wifi%d macfilter: disable\n", ap_param.ap_index);
+ else if (vap_info.u.bss_info.mac_filter_mode = wifi_mac_filter_mode_white_list)
+ printf("wifi%d macfilter: allow\n", ap_param.ap_index);
+ else if (vap_info.u.bss_info.mac_filter_mode = wifi_mac_filter_mode_black_list)
+ printf("wifi%d macfilter: deny\n", ap_param.ap_index);
+
+ printf("daisy wifi%d macfilter: %d\n", ap_param.ap_index, vap_info.u.bss_info.mac_filter_enable);
+ printf("daisy wifi%d macfilter: %d\n", ap_param.ap_index, vap_info.u.bss_info.mac_filter_mode);
+
+ // maclist
+ printf("wifi%d maclist: \n", ap_param.ap_index);
+ ret = wifi_getApAclDevices(ap_param.ap_index, macArray, buf_size);
+ if (ret != RETURN_OK)
+ fprintf(stderr, "[Get maclist failed!!!]\n");
+ else
+ printf("%s \n", macArray);
+ ret = 0;
+
+}
+
int apply_uci_config ()
{
struct uci_context *uci_ctx = uci_alloc_context();
@@ -627,9 +797,21 @@
set_wds(&intf_param, op->v.string);
}else if (strcmp(op->e.name, "hidden") == 0){
set_hidden(&intf_param, op->v.string);
+ }else if (strcmp(op->e.name, "igmpsn_enable") == 0){
+ set_igmpsn_enable(&intf_param, op->v.string);
+ }else if (strcmp(op->e.name, "wps_state") == 0){
+ set_wps_state(&intf_param, op->v.string);
+ }else if (strcmp(op->e.name, "wps_cancel") == 0){
+ set_wps_cancel(&intf_param, op->v.string);
+ }else if (strcmp(op->e.name, "wps_pushbutton") == 0){
+ set_wps_pushbutton(&intf_param, op->v.string);
+ }else if (strcmp(op->e.name, "macfilter") == 0){
+ set_macfilter(&intf_param, op->v.string);
+ }else if (strcmp(op->e.name, "maclist") == 0){
+ set_maclist(&intf_param, op->v.string);
}else{
fprintf(stderr, "[%s %s not set!]\n", op->e.name, op->v.string);
- }
+ }
}
}
if (parsing_radio == TRUE) {
@@ -670,18 +852,114 @@
if (ret != RETURN_OK)
fprintf(stderr, "[Apply vap setting failed!!!]\n");
}
-
+
uci_unload(uci_ctx, uci_pkg);
uci_free_context(uci_ctx);
return RETURN_OK;
}
+int dump_wifi_status ()
+{
+
+ struct uci_context *uci_ctx = uci_alloc_context();
+ struct uci_package *uci_pkg = NULL;
+ struct uci_element *e;
+ // struct uci_section *s;
+ const char cfg_name[] = "wireless";
+ int max_radio_num = 0;
+ BOOL parsing_radio = FALSE;
+ int apCount[3] = {0};
+ int staCount[3] = {0};
+ wifi_vap_info_map_t vap_map[3] = {0};
+ int ret = 0;
+ int i = 0;
+
+ wifi_getMaxRadioNumber(&max_radio_num);
+ fprintf(stderr, "max radio number: %d\n", max_radio_num);
+ for (i = 0; i < max_radio_num ;i++ ){
+ ret = wifi_getRadioVapInfoMap(i, &vap_map[i]);
+ if (ret != RETURN_OK) { // if failed, we set assume this vap as the first vap.
+ fprintf(stderr, "[Get vap map failed!!!]\n");
+ vap_map[i].num_vaps = MAX_NUM_VAP_PER_RADIO;
+ }
+ }
+ if (uci_load(uci_ctx, cfg_name, &uci_pkg) != UCI_OK) {
+ uci_free_context(uci_ctx);
+ fprintf(stderr, "%s: load uci failed.\n", __func__);
+ return RETURN_ERR;
+ }
+
+ uci_foreach_element(&uci_pkg->sections, e) {
+
+ struct uci_section *s = uci_to_section(e);
+ struct uci_element *option = NULL;
+ wifi_radio_param radio_param = {0};
+ wifi_intf_param intf_param = {0};
+ int phyId = 0;
+ radio_param.radio_index = -1;
+ intf_param.ap_index = -1;
+
+ if (strcmp(s->type, "wifi-device") == 0) {
+ sscanf(s->e.name, "radio%d", &phyId);
+ radio_param.radio_index = phy_index_to_radio(phyId);
+ parsing_radio = TRUE;
+ fprintf(stderr, "\n----- Start show radio %d config. -----\n", radio_param.radio_index);
+ } else if (strcmp(s->type, "wifi-iface") == 0) {
+ parsing_radio = FALSE;
+ }
+
+ uci_foreach_element(&s->options, option) {
+
+ struct uci_option *op = uci_to_option(option);
+ if (parsing_radio == TRUE) {
+ // transform the type from input string and store the value in radio_param.
+ } else {
+ // parsing iface
+ if (strcmp(op->e.name, "device") == 0){
+ set_radionum(&intf_param, op->v.string);
+ }else if (strcmp(op->e.name, "mode") == 0){
+ intf_param.mac_offset = staCount[intf_param.radio_index] + apCount[intf_param.radio_index];
+ if (strncmp(op->v.string, "sta", 3) == 0) {
+ intf_param.sta_mode = TRUE;
+ intf_param.sta_index = intf_param.radio_index + staCount[intf_param.radio_index]*max_radio_num;
+ staCount[intf_param.radio_index] ++ ;
+ fprintf(stderr, "\n----- Start show sta %d config. -----\n", intf_param.sta_index);
+ } else if (strncmp(op->v.string, "ap", 2) == 0) {
+ intf_param.sta_mode = FALSE;
+ intf_param.ap_index = intf_param.radio_index + apCount[intf_param.radio_index]*max_radio_num;
+ apCount[intf_param.radio_index] ++ ;
+ fprintf(stderr, "\n----- Start show ap %d config. -----\n", intf_param.ap_index);
+ }
+ }
+ }
+ }
+ if (parsing_radio == TRUE)
+ printf("show radio params: \n");
+ // show_radio_param(radio_param);
+ else if (intf_param.sta_mode == TRUE)
+ printf("show sta params: \n");
+ // show_sta_param(intf_param);
+ else{
+ printf("show ap params: \n");
+ show_ap_param(intf_param, &vap_map[intf_param.radio_index]);
+ }
+ }
+
+ uci_unload(uci_ctx, uci_pkg);
+ uci_free_context(uci_ctx);
+ return RETURN_OK;
+
+}
+
int main(int argc, char **argv)
{
- if (argc != 2 || strcmp(argv[1], "reload") != 0) {
- fprintf(stderr, "Usage: wifi reload.\nThis tool is only for RDKB MSP/SQC test.\n");
+ if (argc != 2 || (strcmp(argv[1], "reload") != 0 && strcmp(argv[1], "dump") != 0) ){
+ fprintf(stderr, "Usage: wifi reload/wifi dump.\nThis tool is only for RDKB MSP/SQC test.\n");
return -1;
}
- apply_uci_config();
+ if (strcmp(argv[1], "reload") == 0)
+ apply_uci_config();
+ else if (strcmp(argv[1], "dump") == 0)
+ dump_wifi_status();
return 0;
}
diff --git a/recipes-wifi/wifi-test-tool/files/src/wifi-test-tool.h b/recipes-wifi/wifi-test-tool/files/src/wifi-test-tool.h
index 5dd1079..2ca1331 100644
--- a/recipes-wifi/wifi-test-tool/files/src/wifi-test-tool.h
+++ b/recipes-wifi/wifi-test-tool/files/src/wifi-test-tool.h
@@ -60,6 +60,12 @@
int mac_offset;
char ifname[16];
bool hidden;
+ bool igmpsn_enable;
+ bool wps_state;
+ bool wps_cancel;
+ bool wps_pushbutton;
+ char macfilter[10];
+ char maclist[512];
} wifi_intf_param;
struct params