Ticket refs #14437: Add TR-181 support for Scan neighbouring APs in SDX-810 RG

This commit is contained in:
Amin Ben Ramdhane 2018-05-23 10:50:31 +01:00
parent 1009922a02
commit 4a6efa3a68
2 changed files with 203 additions and 2 deletions

View file

@ -6,6 +6,7 @@
*
* Copyright (C) 2016 Inteno Broadband Technology AB
* Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
*
*/
@ -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;
}
}

View file

@ -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