From ddc9e915a71eb44ee9a40480ed7400ecb3977c2d Mon Sep 17 00:00:00 2001 From: Vivek Kumar Dutta Date: Fri, 11 Aug 2023 10:11:30 +0000 Subject: [PATCH] Revert "B#11323: remove SSID object fail" --- libbbfdm/dmtree/tr181/wifi.c | 321 +++++++++++++-------------------- test/files/etc/config/wireless | 6 +- 2 files changed, 129 insertions(+), 198 deletions(-) diff --git a/libbbfdm/dmtree/tr181/wifi.c b/libbbfdm/dmtree/tr181/wifi.c index 8225e884..637efa79 100644 --- a/libbbfdm/dmtree/tr181/wifi.c +++ b/libbbfdm/dmtree/tr181/wifi.c @@ -29,9 +29,9 @@ struct wifi_radio_args struct wifi_ssid_args { - struct uci_section *config_s; - struct uci_section *dmmap_s; + struct dmmap_dup *sections; char *ifname; + char *linker; }; struct wifi_acp_args @@ -114,11 +114,11 @@ static inline int init_wifi_radio(struct wifi_radio_args *args, struct dmmap_dup return 0; } -static inline int init_wifi_ssid(struct wifi_ssid_args *args, struct uci_section *config_s, struct uci_section *dmmap_s, char *ifname) +static inline int init_wifi_ssid(struct wifi_ssid_args *args, struct dmmap_dup *s, char *wiface, char *linker) { - args->config_s = config_s; - args->dmmap_s = dmmap_s; - args->ifname = ifname; + args->sections = s; + args->ifname = wiface; + args->linker = linker; return 0; } @@ -291,7 +291,7 @@ static struct uci_section *find_mapcontroller_section(struct uci_section *wirele char *ssid = NULL; char *band = NULL; - if (!file_exists("/etc/config/mapcontroller") || !wireless_s) + if (!file_exists("/etc/config/mapcontroller")) return NULL; dmuci_get_value_by_section_string(wireless_s, "ssid", &ssid); @@ -319,19 +319,24 @@ static struct uci_section *find_mapcontroller_section(struct uci_section *wirele **************************************************************/ static int add_wifi_ssid(char *refparam, struct dmctx *ctx, void *data, char **instance) { - struct uci_section *dmmap = NULL; - char ssid[32] = {0}, ifname[32] = {0}; + struct uci_section *s = NULL, *dmmap_wifi = NULL; + char ssid[32] = {0}, s_name[32] = {0}; - snprintf(ssid, sizeof(ssid), "ssid_%s", *instance); - snprintf(ifname, sizeof(ifname), "wl%s", *instance); + snprintf(ssid, sizeof(ssid), "iopsys_ssid_%s", *instance); + snprintf(s_name, sizeof(s_name), "wlan_ssid_%s", *instance); - dmuci_add_section_bbfdm("dmmap_wireless", "ssid", &dmmap); - dmuci_set_value_by_section(dmmap, "enabled", "0"); - dmuci_set_value_by_section(dmmap, "ifname", ifname); - dmuci_set_value_by_section(dmmap, "ssid", ssid); - dmuci_set_value_by_section(dmmap, "name", ssid); - dmuci_set_value_by_section(dmmap, "added_by_user", "1"); - dmuci_set_value_by_section(dmmap, "ssid_instance", *instance); + dmuci_add_section("wireless", "wifi-iface", &s); + dmuci_rename_section_by_section(s, s_name); + dmuci_set_value_by_section(s, "disabled", "1"); + dmuci_set_value_by_section(s, "ssid", ssid); + dmuci_set_value_by_section(s, "network", "lan"); + dmuci_set_value_by_section(s, "mode", "ap"); + + dmuci_add_section_bbfdm("dmmap_wireless", "wifi-iface", &dmmap_wifi); + dmuci_set_value_by_section(dmmap_wifi, "section_name", s_name); + dmuci_set_value_by_section(dmmap_wifi, "ssid_added_by_user", "1"); + dmuci_set_value_by_section(dmmap_wifi, "ifname", ssid); + dmuci_set_value_by_section(dmmap_wifi, "ssidinstance", *instance); return 0; } @@ -341,31 +346,24 @@ static int delete_wifi_ssid(char *refparam, struct dmctx *ctx, void *data, char switch (del_action) { case DEL_INST: - if (((struct wifi_ssid_args *)data)->config_s) { - dmuci_delete_by_section(((struct wifi_ssid_args *)data)->config_s, "device", NULL); - dmuci_delete_by_section(((struct wifi_ssid_args *)data)->config_s, "ifname", NULL); - dmuci_delete_by_section(((struct wifi_ssid_args *)data)->config_s, "ssid", NULL); - } - - dmuci_delete_by_section(((struct wifi_ssid_args *)data)->dmmap_s, NULL, NULL); + dmuci_delete_by_section((((struct wifi_ssid_args *)data)->sections)->dmmap_section, NULL, NULL); + dmuci_delete_by_section((((struct wifi_ssid_args *)data)->sections)->config_section, NULL, NULL); break; case DEL_ALL: - uci_path_foreach_sections_safe(bbfdm, "dmmap_wireless", "ssid", stmp, ssid_s) { - struct uci_section *s = NULL; - char *ifname = NULL; + uci_foreach_sections_safe("wireless", "wifi-iface", stmp, ssid_s) { + struct uci_section *dmmap_section = NULL; + char *added_by_user; - dmuci_get_value_by_section_string(ssid_s, "ifname", &ifname); + get_dmmap_section_of_config_section("dmmap_wireless", "wifi-iface", section_name(ssid_s), &dmmap_section); + dmuci_get_value_by_section_string(dmmap_section, "ap_added_by_user", &added_by_user); + if (DM_LSTRCMP(added_by_user, "1") == 0) + continue; - s = get_dup_section_in_config_opt("wireless", "wifi-iface", "ifname", ifname); - if (s) { - dmuci_delete_by_section(s, "device", NULL); - dmuci_delete_by_section(s, "ifname", NULL); - dmuci_delete_by_section(s, "ssid", NULL); - } + dmuci_delete_by_section(dmmap_section, NULL, NULL); dmuci_delete_by_section(ssid_s, NULL, NULL); } - break; + return 0; } return 0; } @@ -373,18 +371,21 @@ static int delete_wifi_ssid(char *refparam, struct dmctx *ctx, void *data, char static int add_wifi_accesspoint(char *refparam, struct dmctx *ctx, void *data, char **instance) { struct uci_section *s = NULL, *dmmap_wifi = NULL; - char s_name[32] = {0}; + char ssid[32] = {0}, s_name[32] = {0}; + snprintf(ssid, sizeof(ssid), "iopsys_ap_%s", *instance); snprintf(s_name, sizeof(s_name), "wlan_ap_%s", *instance); dmuci_add_section("wireless", "wifi-iface", &s); dmuci_rename_section_by_section(s, s_name); dmuci_set_value_by_section(s, "disabled", "1"); + dmuci_set_value_by_section(s, "ssid", ssid); dmuci_set_value_by_section(s, "network", "lan"); dmuci_set_value_by_section(s, "mode", "ap"); dmuci_add_section_bbfdm("dmmap_wireless", "wifi-iface", &dmmap_wifi); dmuci_set_value_by_section(dmmap_wifi, "section_name", s_name); + dmuci_set_value_by_section(dmmap_wifi, "ap_added_by_user", "1"); dmuci_set_value_by_section(dmmap_wifi, "ap_instance", *instance); return 0; } @@ -395,14 +396,19 @@ static int delete_wifi_accesspoint(char *refparam, struct dmctx *ctx, void *data switch (del_action) { case DEL_INST: - dmuci_delete_by_section((((struct wifi_acp_args *)data)->sections)->dmmap_section, NULL, NULL); - dmuci_delete_by_section((((struct wifi_acp_args *)data)->sections)->config_section, NULL, NULL); + dmuci_delete_by_section((((struct wifi_ssid_args *)data)->sections)->dmmap_section, NULL, NULL); + dmuci_delete_by_section((((struct wifi_ssid_args *)data)->sections)->config_section, NULL, NULL); break; case DEL_ALL: uci_foreach_sections_safe("wireless", "wifi-iface", stmp, ap_s) { struct uci_section *dmmap_section = NULL; + char *added_by_user; get_dmmap_section_of_config_section("dmmap_wireless", "wifi-iface", section_name(ap_s), &dmmap_section); + dmuci_get_value_by_section_string(dmmap_section, "ssid_added_by_user", &added_by_user); + if (DM_LSTRCMP(added_by_user, "1") == 0) + continue; + dmuci_delete_by_section(dmmap_section, NULL, NULL); dmuci_delete_by_section(ap_s, NULL, NULL); @@ -467,7 +473,6 @@ static int browseWifiRadioInst(struct dmctx *dmctx, DMNODE *parent_node, void *p LIST_HEAD(dup_list); memset(&curr_wifi_radio_args, 0, sizeof(struct wifi_radio_args)); - synchronize_specific_config_sections_with_dmmap("wireless", "wifi-device", "dmmap_wireless", &dup_list); list_for_each_entry(p, &dup_list, list) { init_wifi_radio(&curr_wifi_radio_args, p); @@ -481,78 +486,38 @@ static int browseWifiRadioInst(struct dmctx *dmctx, DMNODE *parent_node, void *p return 0; } -static void dmmap_synchronizeWiFiSSID(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance) -{ - struct uci_section *s = NULL, *ss = NULL, *stmp = NULL; - char *user_s = NULL, *ifname = NULL; - - uci_path_foreach_sections_safe(bbfdm, "dmmap_wireless", "ssid", stmp, s) { - - // section added by user ==> skip it - dmuci_get_value_by_section_string(s, "added_by_user", &user_s); - if (DM_LSTRCMP(user_s, "1") == 0) - continue; - - // check config section ==> if it exists then skip it - dmuci_get_value_by_section_string(s, "ifname", &ifname); - ss = get_dup_section_in_config_opt("wireless", "wifi-iface", "ifname", ifname); - if (ss) - continue; - - // else ==> delete section - dmuci_delete_by_section(s, NULL, NULL); - } - - uci_foreach_sections("wireless", "wifi-iface", s) { - char *disabled = NULL, *ssid = NULL, *device = NULL; - - // if ifname is empty ==> skip it - dmuci_get_value_by_section_string(s, "ifname", &ifname); - if (DM_STRLEN(ifname) == 0) - continue; - - // if dmmap section exits ==> skip it - ss = get_dup_section_in_dmmap_opt("dmmap_wireless", "ssid", "ifname", ifname); - if (ss) - continue; - - dmuci_get_value_by_section_string(s, "disabled", &disabled); - dmuci_get_value_by_section_string(s, "ssid", &ssid); - dmuci_get_value_by_section_string(s, "device", &device); - - dmuci_add_section_bbfdm("dmmap_wireless", "ssid", &ss); - dmuci_set_value_by_section(ss, "enabled", DM_STRLEN(disabled) ? ((*disabled == '1') ? "0" : "1") : "1"); - dmuci_set_value_by_section(ss, "ifname", ifname); - dmuci_set_value_by_section(ss, "ssid", ssid); - dmuci_set_value_by_section(ss, "device", device); - dmuci_set_value_by_section(ss, "name", section_name(s)); - } -} - /*#Device.WiFi.SSID.{i}.!UCI:wireless/wifi-iface/dmmap_wireless*/ static int browseWifiSsidInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance) { + char *inst = NULL, *ifname = NULL, *linker = NULL; struct wifi_ssid_args curr_wifi_ssid_args = {0}; - struct uci_section *dmmap_s = NULL; - char *inst = NULL; + struct dmmap_dup *p = NULL; + LIST_HEAD(dup_list); - dmmap_synchronizeWiFiSSID(dmctx, parent_node, prev_data, prev_instance); + synchronize_specific_config_sections_with_dmmap("wireless", "wifi-iface", "dmmap_wireless", &dup_list); + list_for_each_entry(p, &dup_list, list) { - uci_path_foreach_sections(bbfdm, "dmmap_wireless", "ssid", dmmap_s) { - struct uci_section *config_s = NULL; - char *ifname = NULL; + dmuci_get_value_by_section_string(p->config_section, "device", &linker); + dmuci_get_value_by_section_string(p->config_section, "ifname", &ifname); - dmuci_get_value_by_section_string(dmmap_s, "ifname", &ifname); + if (*ifname == '\0') { + char *added_by_user; - config_s = get_dup_section_in_config_opt("wireless", "wifi-iface", "ifname", ifname); + dmuci_get_value_by_section_string(p->dmmap_section, "ap_added_by_user", &added_by_user); + if (DM_LSTRCMP(added_by_user, "1") == 0) + continue; - init_wifi_ssid(&curr_wifi_ssid_args, config_s, dmmap_s, ifname); + dmuci_get_value_by_section_string(p->dmmap_section, "ifname", &ifname); + } - inst = handle_instance(dmctx, parent_node, dmmap_s, "ssid_instance", "ssid_alias"); + init_wifi_ssid(&curr_wifi_ssid_args, p, ifname, linker); + + inst = handle_instance(dmctx, parent_node, p->dmmap_section, "ssidinstance", "ssidalias"); if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_wifi_ssid_args, inst) == DM_STOP) break; } + free_dmmap_config_dup_list(&dup_list); return 0; } @@ -566,13 +531,19 @@ static int browseWifiAccessPointInst(struct dmctx *dmctx, DMNODE *parent_node, v synchronize_specific_config_sections_with_dmmap("wireless", "wifi-iface", "dmmap_wireless", &dup_list); list_for_each_entry(p, &dup_list, list) { - char *mode = NULL, *ifname = NULL; + char *mode, *ifname, *added_by_user; dmuci_get_value_by_section_string(p->config_section, "mode", &mode); if (DM_LSTRCMP(mode, "ap") != 0) continue; + dmuci_get_value_by_section_string(p->dmmap_section, "ssid_added_by_user", &added_by_user); + if (DM_LSTRCMP(added_by_user, "1") == 0) + continue; + dmuci_get_value_by_section_string(p->config_section, "ifname", &ifname); + if (*ifname == '\0') + dmuci_get_value_by_section_string(p->dmmap_section, "ifname", &ifname); init_wifi_acp(&curr_wifi_acp_args, p, ifname); @@ -692,26 +663,29 @@ static int get_WiFi_EndPointNumberOfEntries(char *refparam, struct dmctx *ctx, v return 0; } -static int get_wifi_ssid_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) +/*#Device.WiFi.SSID.{i}.Enable!UCI:wireless/wifi-iface,@i-1/disabled*/ +/*#Device.WiFi.AccessPoint.{i}.Enable!UCI:wireless/wifi-iface,@i-1/disabled*/ +static int get_wifi_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - dmuci_get_value_by_section_string(((struct wifi_ssid_args *)data)->dmmap_s, "enabled", value); + dmuci_get_value_by_section_string((((struct wifi_ssid_args *)data)->sections)->config_section, "disabled", value); + *value = ((*value)[0] == '1') ? "0" : "1"; return 0; } -static int set_wifi_ssid_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) +static int set_wifi_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { struct uci_section *map_s = NULL; char *multi_ap = NULL; bool b; - map_s = find_mapcontroller_section(((struct wifi_ssid_args *)data)->config_s); + map_s = find_mapcontroller_section((((struct wifi_ssid_args *)data)->sections)->config_section); switch (action) { case VALUECHECK: if (dm_validate_boolean(value)) return FAULT_9007; - dmuci_get_value_by_section_string(((struct wifi_ssid_args *)data)->config_s, "multi_ap", &multi_ap); + dmuci_get_value_by_section_string((((struct wifi_ssid_args *)data)->sections)->config_section, "multi_ap", &multi_ap); if (DM_STRLEN(multi_ap) && !map_s) return FAULT_9007; @@ -720,14 +694,12 @@ static int set_wifi_ssid_enable(char *refparam, struct dmctx *ctx, void *data, c string_to_bool(value, &b); // wireless config: Update disabled option - if (((struct wifi_ssid_args *)data)->config_s) - dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->config_s, "disabled", b ? "0" : "1"); + dmuci_set_value_by_section((((struct wifi_ssid_args *)data)->sections)->config_section, "disabled", b ? "0" : "1"); // mapcontroller config: Update the corresponding ap section if exists if (map_s) dmuci_set_value_by_section(map_s, "enabled", b ? "1" : "0"); - dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->dmmap_s, "enabled", b ? "1" : "0"); return 0; } return 0; @@ -737,14 +709,14 @@ static int get_wifi_status(char *refparam, struct dmctx *ctx, void *data, char * { char *ifname = NULL; - dmuci_get_value_by_section_string(((struct wifi_ssid_args *)data)->dmmap_s, "ifname", &ifname); + dmuci_get_value_by_section_string((((struct wifi_ssid_args *)data)->sections)->config_section, "ifname", &ifname); return get_net_device_status(ifname, value); } /*#Device.WiFi.SSID.{i}.SSID!UCI:wireless/wifi-iface,@i-1/ssid*/ static int get_wlan_ssid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - dmuci_get_value_by_section_string(((struct wifi_ssid_args *)data)->dmmap_s, "ssid", value); + dmuci_get_value_by_section_string((((struct wifi_ssid_args *)data)->sections)->config_section, "ssid", value); return 0; } @@ -753,28 +725,26 @@ static int set_wlan_ssid(char *refparam, struct dmctx *ctx, void *data, char *in struct uci_section *map_s = NULL; char *multi_ap = NULL; - map_s = find_mapcontroller_section(((struct wifi_ssid_args *)data)->config_s); + map_s = find_mapcontroller_section((((struct wifi_ssid_args *)data)->sections)->config_section); switch (action) { case VALUECHECK: if (dm_validate_string(value, -1, 32, NULL, NULL)) return FAULT_9007; - dmuci_get_value_by_section_string(((struct wifi_ssid_args *)data)->config_s, "multi_ap", &multi_ap); + dmuci_get_value_by_section_string((((struct wifi_ssid_args *)data)->sections)->config_section, "multi_ap", &multi_ap); if (DM_STRLEN(multi_ap) && !map_s) return FAULT_9007; return 0; case VALUESET: // wireless config: Update ssid option - if (((struct wifi_ssid_args *)data)->config_s) - dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->config_s, "ssid", value); + dmuci_set_value_by_section((((struct wifi_ssid_args *)data)->sections)->config_section, "ssid", value); // mapcontroller config: Update the corresponding ap section if exists if (map_s) dmuci_set_value_by_section(map_s, "ssid", value); - dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->dmmap_s, "ssid", value); return 0; } return 0; @@ -782,7 +752,7 @@ static int set_wlan_ssid(char *refparam, struct dmctx *ctx, void *data, char *in static int get_wlan_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - dmuci_get_value_by_section_string(((struct wifi_ssid_args *)data)->dmmap_s, "name", value); + *value = dmstrdup(section_name((((struct wifi_ssid_args *)data)->sections)->config_section)); return 0; } @@ -1356,15 +1326,15 @@ static int set_radio_auto_channel_enable(char *refparam, struct dmctx *ctx, void return 0; } -/*#Device.WiFi.AccessPoint.{i}.SSIDAdvertisementEnabled!UCI:wireless/wifi-iface,@i-1/hidden*/ -static int get_wlan_ap_advertisement_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) +/*#Device.WiFi.SSID.{i}.SSIDAdvertisementEnabled!UCI:wireless/wifi-iface,@i-1/hidden*/ +static int get_wlan_ssid_advertisement_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - dmuci_get_value_by_section_string((((struct wifi_acp_args *)data)->sections)->config_section, "hidden", value); + dmuci_get_value_by_section_string((((struct wifi_ssid_args *)data)->sections)->config_section, "hidden", value); *value = ((*value)[0] == '1') ? "0" : "1"; return 0; } -static int set_wlan_ap_advertisement_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) +static int set_wlan_ssid_advertisement_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { bool b; @@ -1375,7 +1345,7 @@ static int set_wlan_ap_advertisement_enable(char *refparam, struct dmctx *ctx, v return 0; case VALUESET: string_to_bool(value, &b); - dmuci_set_value_by_section((((struct wifi_acp_args *)data)->sections)->config_section, "hidden", b ? "0" : "1"); + dmuci_set_value_by_section((((struct wifi_ssid_args *)data)->sections)->config_section, "hidden", b ? "0" : "1"); return 0; } @@ -1766,7 +1736,7 @@ static int set_access_point_security_shared_key(char *refparam, struct dmctx *ct char *encryption = NULL; char *multi_ap = NULL; - map_s = find_mapcontroller_section((((struct wifi_acp_args *)data)->sections)->config_section); + map_s = find_mapcontroller_section((((struct wifi_ssid_args *)data)->sections)->config_section); switch (action) { case VALUECHECK: @@ -1845,7 +1815,7 @@ static int set_WiFiAccessPointSecurity_SAEPassphrase(char *refparam, struct dmct char *encryption = NULL; char *multi_ap = NULL; - map_s = find_mapcontroller_section((((struct wifi_acp_args *)data)->sections)->config_section); + map_s = find_mapcontroller_section((((struct wifi_ssid_args *)data)->sections)->config_section); switch (action) { case VALUECHECK: @@ -2423,7 +2393,7 @@ static int set_WiFiEndPointProfileSecurity_ModeEnabled(char *refparam, struct dm char *supported_modes = NULL; char *multi_ap = NULL; - map_s = find_mapcontroller_section((((struct wifi_acp_args *)data)->sections)->config_section); + map_s = find_mapcontroller_section((((struct wifi_ssid_args *)data)->sections)->config_section); switch (action) { case VALUECHECK: @@ -2651,7 +2621,7 @@ static int set_radio_alias(char *refparam, struct dmctx *ctx, void *data, char * /*#Device.WiFi.SSID.{i}.Alias!UCI:dmmap_wireless/wifi-iface,@i-1/ssidalias*/ static int get_ssid_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - dmuci_get_value_by_section_string(((struct wifi_ssid_args *)data)->dmmap_s, "ssid_alias", value); + dmuci_get_value_by_section_string((((struct wifi_ssid_args *)data)->sections)->dmmap_section, "ssidalias", value); if ((*value)[0] == '\0') dmasprintf(value, "cpe-%s", instance); return 0; @@ -2665,7 +2635,7 @@ static int set_ssid_alias(char *refparam, struct dmctx *ctx, void *data, char *i return FAULT_9007; return 0; case VALUESET: - dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->dmmap_s, "ssid_alias", value); + dmuci_set_value_by_section((((struct wifi_ssid_args *)data)->sections)->dmmap_section, "ssidalias", value); return 0; } return 0; @@ -2696,10 +2666,7 @@ static int set_access_point_alias(char *refparam, struct dmctx *ctx, void *data, static int get_ssid_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - char *device = NULL; - - dmuci_get_value_by_section_string(((struct wifi_ssid_args *)data)->dmmap_s, "device", &device); - adm_entry_get_linker_param(ctx, "Device.WiFi.Radio.", device, value); + adm_entry_get_linker_param(ctx, "Device.WiFi.Radio.", ((struct wifi_ssid_args *)data)->linker, value); return 0; } @@ -2719,10 +2686,7 @@ static int set_ssid_lower_layer(char *refparam, struct dmctx *ctx, void *data, c return 0; case VALUESET: adm_entry_get_linker_value(ctx, value, &linker); - dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->dmmap_s, "device", linker ? linker : ""); - - if (((struct wifi_ssid_args *)data)->config_s) - dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->config_s, "device", linker ? linker : ""); + dmuci_set_value_by_section((((struct wifi_ssid_args *)data)->sections)->config_section, "device", linker ? linker : ""); return 0; } return 0; @@ -2737,6 +2701,7 @@ static int get_ap_ssid_ref(char *refparam, struct dmctx *ctx, void *data, char * static int set_ap_ssid_ref(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.WiFi.SSID.", NULL}; + struct uci_section *s = NULL, *ssid_dmmap_s = NULL; char *linker = NULL; switch (action) { @@ -2749,30 +2714,36 @@ static int set_ap_ssid_ref(char *refparam, struct dmctx *ctx, void *data, char * break; case VALUESET: + if ((((struct wifi_acp_args *)data)->ifname)[0] != '\0' || *value == '\0') + break; + adm_entry_get_linker_value(ctx, value, &linker); - if (linker) { - struct uci_section *ss = NULL; - char *device = NULL, *ssid = NULL, *enabled = NULL; + uci_foreach_sections("wireless", "wifi-iface", s) { + struct uci_section *dmmap_section = NULL; + char *ifname; - ss = get_dup_section_in_dmmap_opt("dmmap_wireless", "ssid", "ifname", linker); + get_dmmap_section_of_config_section("dmmap_wireless", "wifi-iface", section_name(s), &dmmap_section); + dmuci_get_value_by_section_string(s, "ifname", &ifname); + if (DM_STRCMP(ifname, linker) == 0) { + ssid_dmmap_s = dmmap_section; + break; + } - dmuci_get_value_by_section_string(ss, "device", &device); - dmuci_get_value_by_section_string(ss, "ssid", &ssid); - dmuci_get_value_by_section_string(ss, "enabled", &enabled); - - bool b = dmuci_string_to_boolean(enabled); - - dmuci_set_value_by_section((((struct wifi_acp_args *)data)->sections)->config_section, "device", device); - dmuci_set_value_by_section((((struct wifi_acp_args *)data)->sections)->config_section, "ssid", ssid); - dmuci_set_value_by_section((((struct wifi_acp_args *)data)->sections)->config_section, "disabled", b ? "0" : "1"); - - dmuci_set_value_by_section((((struct wifi_acp_args *)data)->sections)->config_section, "ifname", linker); - } else { - dmuci_set_value_by_section((((struct wifi_acp_args *)data)->sections)->config_section, "ifname", ""); - dmuci_set_value_by_section((((struct wifi_acp_args *)data)->sections)->config_section, "ssid", ""); - dmuci_set_value_by_section((((struct wifi_acp_args *)data)->sections)->config_section, "device", ""); + dmuci_get_value_by_section_string(dmmap_section, "ifname", &ifname); + if (DM_STRCMP(ifname, linker) == 0) { + ssid_dmmap_s = dmmap_section; + break; + } } + + if (ssid_dmmap_s != NULL) { + dmuci_set_value_by_section(ssid_dmmap_s, "ap_instance", instance); + dmuci_delete_by_section(ssid_dmmap_s, "ssid_added_by_user", NULL); + dmuci_delete_by_section((((struct wifi_acp_args *)data)->sections)->config_section, NULL, NULL); + dmuci_delete_by_section((((struct wifi_acp_args *)data)->sections)->dmmap_section, NULL, NULL); + } + break; } return 0; @@ -3138,46 +3109,6 @@ static int get_access_point_associative_device_statistics_retrans_count(char *re return 0; } -/*#Device.WiFi.AccessPoint.{i}.Enable!UCI:wireless/wifi-iface,@i-1/disabled*/ -static int get_access_point_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) -{ - dmuci_get_value_by_section_string((((struct wifi_acp_args *)data)->sections)->config_section, "disabled", value); - *value = ((*value)[0] == '1') ? "0" : "1"; - return 0; -} - -static int set_access_point_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) -{ - struct uci_section *map_s = NULL; - char *multi_ap = NULL; - bool b; - - map_s = find_mapcontroller_section((((struct wifi_acp_args *)data)->sections)->config_section); - - switch (action) { - case VALUECHECK: - if (dm_validate_boolean(value)) - return FAULT_9007; - - dmuci_get_value_by_section_string((((struct wifi_acp_args *)data)->sections)->config_section, "multi_ap", &multi_ap); - if (DM_STRLEN(multi_ap) && !map_s) - return FAULT_9007; - - return 0; - case VALUESET: - string_to_bool(value, &b); - - // wireless config: Update disabled option - dmuci_set_value_by_section((((struct wifi_acp_args *)data)->sections)->config_section, "disabled", b ? "0" : "1"); - - // mapcontroller config: Update the corresponding ap section if exists - if (map_s) - dmuci_set_value_by_section(map_s, "enabled", b ? "1" : "0"); - - return 0; - } - return 0; -} /*#Device.WiFi.AccessPoint.{i}.Status!UBUS:wifi.ap.@Name/status//status*/ static int get_wifi_access_point_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) @@ -3722,7 +3653,7 @@ DMOBJ tWiFiSSIDObj[] = { DMLEAF tWiFiSSIDParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Alias", &DMWRITE, DMT_STRING, get_ssid_alias, set_ssid_alias, BBFDM_BOTH, "2.0"}, -{"Enable", &DMWRITE, DMT_BOOL, get_wifi_ssid_enable, set_wifi_ssid_enable, BBFDM_BOTH, "2.0"}, +{"Enable", &DMWRITE, DMT_BOOL, get_wifi_enable, set_wifi_enable, BBFDM_BOTH, "2.0"}, {"Status", &DMREAD, DMT_STRING, get_wifi_status, NULL, BBFDM_BOTH, "2.0"}, {"SSID", &DMWRITE, DMT_STRING, get_wlan_ssid, set_wlan_ssid, BBFDM_BOTH, "2.0"}, {"Name", &DMREAD, DMT_STRING, get_wlan_name, NULL, BBFDM_BOTH, "2.0"}, @@ -3772,10 +3703,10 @@ DMOBJ tWiFiAccessPointObj[] = { DMLEAF tWiFiAccessPointParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Alias", &DMWRITE, DMT_STRING, get_access_point_alias, set_access_point_alias, BBFDM_BOTH, "2.0"}, -{"Enable", &DMWRITE, DMT_BOOL, get_access_point_enable, set_access_point_enable, BBFDM_BOTH, "2.0"}, +{"Enable", &DMWRITE, DMT_BOOL, get_wifi_enable, set_wifi_enable, BBFDM_BOTH, "2.0"}, {"Status", &DMREAD, DMT_STRING, get_wifi_access_point_status, NULL, BBFDM_BOTH, "2.0"}, {"SSIDReference", &DMWRITE, DMT_STRING, get_ap_ssid_ref, set_ap_ssid_ref, BBFDM_BOTH, "2.0"}, -{"SSIDAdvertisementEnabled", &DMWRITE, DMT_BOOL, get_wlan_ap_advertisement_enable, set_wlan_ap_advertisement_enable, BBFDM_BOTH, "2.0"}, +{"SSIDAdvertisementEnabled", &DMWRITE, DMT_BOOL, get_wlan_ssid_advertisement_enable, set_wlan_ssid_advertisement_enable, BBFDM_BOTH, "2.0"}, {"WMMEnable", &DMWRITE, DMT_BOOL, get_wmm_enabled, set_wmm_enabled, BBFDM_BOTH, "2.0"}, {"UAPSDEnable", &DMWRITE, DMT_BOOL, get_WiFiAccessPoint_UAPSDEnable, set_WiFiAccessPoint_UAPSDEnable, BBFDM_BOTH, "2.0"}, {"AssociatedDeviceNumberOfEntries", &DMREAD, DMT_UNINT, get_access_point_total_associations, NULL, BBFDM_BOTH, "2.0"}, diff --git a/test/files/etc/config/wireless b/test/files/etc/config/wireless index 3ff872c8..1937ae7f 100644 --- a/test/files/etc/config/wireless +++ b/test/files/etc/config/wireless @@ -11,7 +11,7 @@ config wifi-iface 'no_mp_test1' option device 'test1' option network 'lan' option mode 'ap' - option ifname 'test1_0' + option ifname 'test1' option encryption 'psk2' option wps_pushbutton '1' option ieee80211k '1' @@ -23,7 +23,7 @@ config wifi-iface 'default_test1' option device 'test1' option network 'lan' option mode 'ap' - option ifname 'test1_1' + option ifname 'test1' option ssid 'MAP-44D43771B810-BH-5GHz' option encryption 'psk2' option wps_pushbutton '1' @@ -45,7 +45,7 @@ config wifi-iface 'default_test2' option device 'test2' option network 'lan' option mode 'ap' - option ifname 'test2_0' + option ifname 'test2' option ssid 'iopsysWrt-44D43771B810' option encryption 'psk2' option key 'MPUEO3L7WHJ45P'