tr181: wifi: fix invalid SSID stats

There is not always an "ifname" option in the wifi-iface section.
This commit uses ubus to resolve the right interface for the SSID.

Signed-off-by: Daniel Danzberger <daniel@dd-wrt.com>
This commit is contained in:
Daniel Danzberger 2020-01-10 02:52:59 +01:00
parent b135d0b5ae
commit cda2d2a61c
5 changed files with 50 additions and 1 deletions

View file

@ -3244,8 +3244,8 @@ int browseWifiSsidInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data
synchronize_specific_config_sections_with_dmmap("wireless", "wifi-iface", "dmmap_wireless", &dup_list);
list_for_each_entry(p, &dup_list, list) {
dmuci_get_value_by_section_string(p->config_section, "ifname", &ifname);
dmuci_get_value_by_section_string(p->config_section, "device", &linker);
ifname = get_device_from_wifi_iface(linker, section_name(p->config_section));
init_wifi_ssid(&curr_wifi_ssid_args, p->config_section, ifname, linker);
wnum = handle_update_instance(1, dmctx, &ssid_last, update_instance_alias, 3, p->dmmap_section, "ssidinstance", "ssidalias");
if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_wifi_ssid_args, wnum) == DM_STOP)

View file

@ -1418,6 +1418,40 @@ char *get_device(char *interface_name)
return dmjson_get_value(res, 1, "device");
}
char *get_device_from_wifi_iface(const char *wifi_iface, const char *wifi_section)
{
json_object *jobj;
array_list *jarr;
unsigned n = 0, i;
const char *ifname = "";
if (wifi_iface[0] == 0 || wifi_section[0] == 0)
return "";
dmubus_call("network.wireless", "status", UBUS_ARGS{{}}, 0, &jobj);
if (jobj == NULL)
return "";
json_object_object_get_ex(jobj, wifi_iface, &jobj);
json_object_object_get_ex(jobj, "interfaces", &jobj);
jarr = json_object_get_array(jobj);
if (jarr)
n = array_list_length(jarr);
for (i = 0; i < n; i++) {
json_object *j_e = jarr->array[i];
const char *sect;
sect = __dmjson_get_string(j_e, "section");
if (!strcmp(sect, wifi_section)) {
ifname = __dmjson_get_string(j_e, "ifname");
break;
}
}
return (char *)ifname;
}
/*
* Manage string lists
*/

View file

@ -259,4 +259,5 @@ char * dmmap_file_path_get(const char *dmmap_package);
int dm_read_sysfs_file(const char *file, char *dst, unsigned len);
int get_net_iface_sysfs(const char *uci_iface, const char *name, char **value);
int get_net_device_sysfs(const char *uci_iface, const char *name, char **value);
char *get_device_from_wifi_iface(const char *wifi_iface, const char *wifi_section);
#endif

View file

@ -136,6 +136,19 @@ json_object *dmjson_select_obj(json_object * jobj, char *argv[])
return jobj;
}
const char * __dmjson_get_string(json_object *jobj, const char *name)
{
const char *str = "";
json_object_object_get_ex(jobj, name, &jobj);
if (jobj) {
str = json_object_get_string(jobj);
if (str == NULL)
str = "";
}
return str;
}
json_object *____dmjson_select_obj_in_array_idx(json_object *mainjobj, json_object **arrobj, int index, char *argv[])
{
json_object *jobj = NULL;

View file

@ -39,6 +39,7 @@ char *____dmjson_get_value_in_obj(json_object *mainjobj, char *argv[]);
char *__dmjson_get_value_in_obj(json_object *mainjobj, int argc, ...);
char *__dmjson_get_value_in_array_idx(json_object *mainjobj, json_object **arrobj, char *defret, int index, int argc, ...);
json_object *__dmjson_select_obj_in_array_idx(json_object *mainjobj, json_object **arrobj, int index, int argc, ...);
const char * __dmjson_get_string(json_object *jobj, const char *name);
char *____dmjson_get_value_array_all(json_object *mainjobj, char *delim, char *argv[]);
char *__dmjson_get_value_array_all(json_object *mainjobj, char *delim, int argc, ...);