From 4a6efa3a68d3b6b22c1053e643c6338dd4aeb60b Mon Sep 17 00:00:00 2001 From: Amin Ben Ramdhane Date: Wed, 23 May 2018 10:50:31 +0100 Subject: [PATCH] Ticket refs #14437: Add TR-181 support for Scan neighbouring APs in SDX-810 RG --- dm/dmtree/tr181/wifi.c | 182 ++++++++++++++++++++++++++++++++++++++++- dm/dmtree/tr181/wifi.h | 23 ++++++ 2 files changed, 203 insertions(+), 2 deletions(-) diff --git a/dm/dmtree/tr181/wifi.c b/dm/dmtree/tr181/wifi.c index af0b3eb..b4720a8 100644 --- a/dm/dmtree/tr181/wifi.c +++ b/dm/dmtree/tr181/wifi.c @@ -6,6 +6,7 @@ * * Copyright (C) 2016 Inteno Broadband Technology AB * Author: Anis Ellouze + * Author: Amin Ben Ramdhane * */ @@ -26,6 +27,7 @@ DMOBJ tWifiObj[] = { {"Radio", &DMWRITE, NULL, NULL, NULL, browseWifiRadioInst, NULL, NULL, tWifiRadioStatsObj, tWifiRadioParams, get_linker_Wifi_Radio}, {"SSID", &DMWRITE, add_wifi_ssid, delete_wifi_ssid, NULL, browseWifiSsidInst, NULL, NULL, tWifiSsidStatsObj, tWifiSsidParams, get_linker_Wifi_Ssid}, {"AccessPoint", &DMREAD, NULL, NULL, NULL, browseWifiAccessPointInst, NULL, NULL, tAcessPointSecurityObj, tWifiAcessPointParams, NULL}, +{"NeighboringWiFiDiagnostic", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tNeighboringWiFiDiagnosticObj, tNeighboringWiFiDiagnosticParams, NULL}, {0} }; @@ -178,6 +180,32 @@ DMLEAF tWifiAcessPointAssociatedDeviceStatsParams[] = { {0} }; +/*** WiFi.NeighboringWiFiDiagnostic. ***/ +DMOBJ tNeighboringWiFiDiagnosticObj[] = { +/* OBJ, permission, addobj, delobj, browseinstobj, finform, nextobj, leaf*/ +{"Result", &DMREAD, NULL, NULL, NULL, browseWifiNeighboringWiFiDiagnosticResultInst, NULL, NULL, NULL, tNeighboringWiFiDiagnosticResultParams, NULL}, +{0} +}; + +DMLEAF tNeighboringWiFiDiagnosticParams[] = { +/* PARAM, permission, type, getvlue, setvalue, forced_inform, notification*/ +{"DiagnosticsState", &DMWRITE, DMT_STRING, get_neighboring_wifi_diagnostics_diagnostics_state, set_neighboring_wifi_diagnostics_diagnostics_state, NULL, NULL}, +{"ResultNumberOfEntries", &DMREAD, DMT_UNINT, get_neighboring_wifi_diagnostics_result_number_entries, NULL, NULL, NULL}, +{0} +}; + +/*** WiFi.NeighboringWiFiDiagnostic.Result. ***/ +DMLEAF tNeighboringWiFiDiagnosticResultParams[] = { +/* PARAM, permission, type, getvlue, setvalue, forced_inform, NOTIFICATION, linker*/ +{"SSID", &DMREAD, DMT_STRING, get_neighboring_wifi_diagnostics_result_ssid, NULL, NULL, NULL}, +{"BSSID", &DMREAD, DMT_STRING, get_neighboring_wifi_diagnostics_result_bssid, NULL, NULL, NULL}, +{"Channel", &DMREAD, DMT_UNINT, get_neighboring_wifi_diagnostics_result_channel, NULL, NULL, NULL}, +{"SignalStrength", &DMREAD, DMT_INT, get_neighboring_wifi_diagnostics_result_signal_strength, NULL, NULL, NULL}, +{"OperatingFrequencyBand", &DMREAD, DMT_STRING, get_neighboring_wifi_diagnostics_result_operating_frequency_band, NULL, NULL, NULL}, +{"Noise", &DMREAD, DMT_INT, get_neighboring_wifi_diagnostics_result_noise, NULL, NULL, NULL}, +{0} +}; + /************************************************************************** * LINKER ***************************************************************************/ @@ -1445,6 +1473,108 @@ int get_access_point_associative_device_active(char *refparam, struct dmctx *ctx return 0; } +int get_neighboring_wifi_diagnostics_diagnostics_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) +{ + struct uci_section *ss; + json_object *res, *neighboring_wifi_obj; + + uci_foreach_sections("wireless", "wifi-device", ss) { + dmubus_call("router.wireless", "scanresults", UBUS_ARGS{{"radio", section_name(ss), String}}, 1, &res); + neighboring_wifi_obj = dmjson_select_obj_in_array_idx(res, 0, 1, "access_points"); + if(neighboring_wifi_obj) { + *value = "Complete"; + break; + } + else + *value = "None"; + } + return 0; +} + +int set_neighboring_wifi_diagnostics_diagnostics_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) +{ + struct uci_section *ss; + + switch (action) { + case VALUECHECK: + return 0; + case VALUESET: + if (strcmp(value, "Requested") == 0) { + uci_foreach_sections("wireless", "wifi-device", ss) { + dmubus_call_set("router.wireless", "scan", UBUS_ARGS{{"radio", section_name(ss), String}}, 1); + } + dmubus_call_set("tr069", "inform", UBUS_ARGS{{"event", "8 DIAGNOSTICS COMPLETE", String}}, 1); + } + return 0; + } + return 0; +} + +int get_neighboring_wifi_diagnostics_result_number_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) +{ + struct uci_section *ss; + json_object *res, *jobj; + int entries = 0, result = 0; + *value = "0"; + + uci_foreach_sections("wireless", "wifi-device", ss) { + dmubus_call("router.wireless", "scanresults", UBUS_ARGS{{"radio", section_name(ss), String}}, 1, &res); + while (res) { + jobj = dmjson_select_obj_in_array_idx(res, entries, 1, "access_points"); + if(jobj) + entries++; + else + break; + } + result = result + entries; + entries = 0; + } + dmasprintf(value, "%d", result); // MEM WILL BE FREED IN DMMEMCLEAN + return 0; +} + +int get_neighboring_wifi_diagnostics_result_ssid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) +{ + struct wifi_neighboring_diagnostic_args *cur_wifi_neighboring_diagnostic_args_ptr=(struct wifi_neighboring_diagnostic_args*)data; + dmasprintf(value, cur_wifi_neighboring_diagnostic_args_ptr->ssid); + return 0; +} + +int get_neighboring_wifi_diagnostics_result_bssid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) +{ + struct wifi_neighboring_diagnostic_args *cur_wifi_neighboring_diagnostic_args_ptr=(struct wifi_neighboring_diagnostic_args*)data; + dmasprintf(value, cur_wifi_neighboring_diagnostic_args_ptr->bssid); + return 0; +} + +int get_neighboring_wifi_diagnostics_result_channel(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) +{ + struct wifi_neighboring_diagnostic_args *cur_wifi_neighboring_diagnostic_args_ptr=(struct wifi_neighboring_diagnostic_args*)data; + dmasprintf(value, "%d", cur_wifi_neighboring_diagnostic_args_ptr->channel); + return 0; +} + +int get_neighboring_wifi_diagnostics_result_signal_strength(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) +{ + struct wifi_neighboring_diagnostic_args *cur_wifi_neighboring_diagnostic_args_ptr=(struct wifi_neighboring_diagnostic_args*)data; + dmasprintf(value, "%d", cur_wifi_neighboring_diagnostic_args_ptr->signalstrength); + return 0; +} + +int get_neighboring_wifi_diagnostics_result_operating_frequency_band(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) +{ + struct wifi_neighboring_diagnostic_args *cur_wifi_neighboring_diagnostic_args_ptr=(struct wifi_neighboring_diagnostic_args*)data; + dmasprintf(value, cur_wifi_neighboring_diagnostic_args_ptr->operatingfrequencyband); + return 0; +} + +int get_neighboring_wifi_diagnostics_result_noise(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) +{ + struct wifi_neighboring_diagnostic_args *cur_wifi_neighboring_diagnostic_args_ptr=(struct wifi_neighboring_diagnostic_args*)data; + dmasprintf(value, "%d", cur_wifi_neighboring_diagnostic_args_ptr->noise); + return 0; +} + /************************************************************************** * SET AND GET ALIAS ***************************************************************************/ @@ -1694,7 +1824,7 @@ int browse_wifi_associated_device(struct dmctx *dmctx, DMNODE *parent_node, void int id = 0; char *idx, *idx_last = NULL; char *macaddr= NULL, *active= NULL, *lastdatadownloadlinkrate= NULL, *lastdatauplinkrate= NULL, *signalstrength= NULL; - struct wifi_associative_device_args cur_wifi_associative_device_args = {0}, *args; + struct wifi_associative_device_args cur_wifi_associative_device_args = {0}; struct uci_section *dmmap_section; uci_foreach_sections("wireless", "wifi-iface", ss) { @@ -1739,7 +1869,6 @@ int browse_wifi_associated_device(struct dmctx *dmctx, DMNODE *parent_node, void cur_wifi_associative_device_args.signalstrength= atoi(signalstrength); else cur_wifi_associative_device_args.signalstrength = 0; - args= &cur_wifi_associative_device_args; idx = handle_update_instance(3, dmctx, &idx_last, update_instance_without_section, 1, ++id); if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&cur_wifi_associative_device_args, idx) == DM_STOP) break; @@ -1748,3 +1877,52 @@ int browse_wifi_associated_device(struct dmctx *dmctx, DMNODE *parent_node, void } } } + +int browseWifiNeighboringWiFiDiagnosticResultInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance) +{ + struct wifi_neighboring_diagnostic_args cur_wifi_neighboring_diagnostic_args = {0}; + json_object *res, *neighboring_wifi_obj; + struct uci_section *ss; + char *bssid, *ssid, *signalstrength, *channel, *frequency, *noise, *idx, *idx_last = NULL; + int entries = 0, id = 0; + + uci_foreach_sections("wireless", "wifi-device", ss) { + dmubus_call("router.wireless", "scanresults", UBUS_ARGS{{"radio", section_name(ss), String}}, 1, &res); + while (res) { + neighboring_wifi_obj = dmjson_select_obj_in_array_idx(res, entries, 1, "access_points"); + if(neighboring_wifi_obj) { + bssid=dmjson_get_value(neighboring_wifi_obj, 1, "bssid"); + if(bssid!=NULL && strlen(bssid)>0) + dmasprintf(&(cur_wifi_neighboring_diagnostic_args.bssid),dmjson_get_value(neighboring_wifi_obj, 1, "bssid")); + ssid=dmjson_get_value(neighboring_wifi_obj, 1, "ssid"); + if(ssid!=NULL && strlen(ssid)>0) + dmasprintf(&(cur_wifi_neighboring_diagnostic_args.ssid),dmjson_get_value(neighboring_wifi_obj, 1, "ssid")); + channel=dmjson_get_value(neighboring_wifi_obj, 1, "channel"); + if(channel!=NULL && strlen(channel)>0) + cur_wifi_neighboring_diagnostic_args.channel= atoi(channel); + else + cur_wifi_neighboring_diagnostic_args.channel = 0; + signalstrength=dmjson_get_value(neighboring_wifi_obj, 1, "rssi"); + if(signalstrength!=NULL && strlen(signalstrength)>0) + cur_wifi_neighboring_diagnostic_args.signalstrength= atoi(signalstrength); + else + cur_wifi_neighboring_diagnostic_args.signalstrength = 0; + frequency=dmjson_get_value(neighboring_wifi_obj, 1, "frequency"); + if(frequency!=NULL && strlen(frequency)>0) + dmasprintf(&(cur_wifi_neighboring_diagnostic_args.operatingfrequencyband),dmjson_get_value(neighboring_wifi_obj, 1, "frequency")); + noise=dmjson_get_value(neighboring_wifi_obj, 1, "noise"); + if(noise!=NULL && strlen(noise)>0) + cur_wifi_neighboring_diagnostic_args.noise= atoi(noise); + else + cur_wifi_neighboring_diagnostic_args.noise = 0; + entries++; + idx = handle_update_instance(3, dmctx, &idx_last, update_instance_without_section, 1, ++id); + if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&cur_wifi_neighboring_diagnostic_args, idx) == DM_STOP) + break; + } + else + break; + } + entries = 0; + } +} diff --git a/dm/dmtree/tr181/wifi.h b/dm/dmtree/tr181/wifi.h index 3dbcf08..a45eaf9 100644 --- a/dm/dmtree/tr181/wifi.h +++ b/dm/dmtree/tr181/wifi.h @@ -38,6 +38,16 @@ struct wifi_associative_device_args char *wdev; }; +struct wifi_neighboring_diagnostic_args +{ + char *ssid; + char *bssid; + char *operatingfrequencyband; + int channel; + int signalstrength; + int noise; +}; + extern DMOBJ tWifiObj[]; extern DMLEAF tWifiParams[]; extern DMOBJ tWifiRadioStatsObj[]; @@ -52,11 +62,15 @@ extern DMOBJ tWifiAcessPointAssociatedDeviceObj[]; extern DMLEAF tWifiAcessPointAssociatedDeviceStatsParams[]; extern DMLEAF tWifiRadioStatsParams[]; extern DMLEAF tWifiSsidStatsParams[]; +extern DMOBJ tNeighboringWiFiDiagnosticObj[]; +extern DMLEAF tNeighboringWiFiDiagnosticParams[]; +extern DMLEAF tNeighboringWiFiDiagnosticResultParams[]; int browseWifiSsidInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance); int browseWifiAccessPointInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance); int browseWifiRadioInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance); int browse_wifi_associated_device(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance); +int browseWifiNeighboringWiFiDiagnosticResultInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance); int add_wifi_ssid(char *refparam, struct dmctx *ctx, void *data, char **instancepara); int delete_wifi_ssid(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action); @@ -124,6 +138,14 @@ int get_access_point_associative_device_statistics_retrans_count(char *refparam, int get_access_point_associative_device_statistics_failed_retrans_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value); int get_access_point_associative_device_statistics_retry_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value); int get_access_point_associative_device_statistics_multiple_retry_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value); +int get_neighboring_wifi_diagnostics_diagnostics_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value); +int get_neighboring_wifi_diagnostics_result_number_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value); +int get_neighboring_wifi_diagnostics_result_ssid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value); +int get_neighboring_wifi_diagnostics_result_bssid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value); +int get_neighboring_wifi_diagnostics_result_channel(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value); +int get_neighboring_wifi_diagnostics_result_signal_strength(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value); +int get_neighboring_wifi_diagnostics_result_operating_frequency_band(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value); +int get_neighboring_wifi_diagnostics_result_noise(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value); int get_linker_Wifi_Radio(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value); int get_linker_Wifi_Ssid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value); int get_linker_associated_device(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker); @@ -155,5 +177,6 @@ int set_access_point_security_rekey_interval(char *refparam, struct dmctx *ctx, int set_access_point_security_radius_ip_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action); int set_access_point_security_radius_server_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action); int set_access_point_security_radius_secret(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action); +int set_neighboring_wifi_diagnostics_diagnostics_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action); static int set_wmm_enabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action); #endif