ubus: add get_connected_clients
Add a method to obtain local-host specific state data about usteers internal logic for each connected STA. Signed-off-by: David Bauer <mail@david-bauer.net>
This commit is contained in:
82
ubus.c
82
ubus.c
@@ -31,6 +31,14 @@
|
|||||||
static struct blob_buf b;
|
static struct blob_buf b;
|
||||||
static KVLIST(host_info, kvlist_blob_len);
|
static KVLIST(host_info, kvlist_blob_len);
|
||||||
|
|
||||||
|
static void *
|
||||||
|
blobmsg_open_table_mac(struct blob_buf *buf, uint8_t *addr)
|
||||||
|
{
|
||||||
|
char str[20];
|
||||||
|
sprintf(str, MAC_ADDR_FMT, MAC_ADDR_DATA(addr));
|
||||||
|
return blobmsg_open_table(buf, str);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
usteer_ubus_get_clients(struct ubus_context *ctx, struct ubus_object *obj,
|
usteer_ubus_get_clients(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
struct ubus_request_data *req, const char *method,
|
struct ubus_request_data *req, const char *method,
|
||||||
@@ -38,13 +46,11 @@ usteer_ubus_get_clients(struct ubus_context *ctx, struct ubus_object *obj,
|
|||||||
{
|
{
|
||||||
struct sta_info *si;
|
struct sta_info *si;
|
||||||
struct sta *sta;
|
struct sta *sta;
|
||||||
char str[20];
|
|
||||||
void *_s, *_cur_n;
|
void *_s, *_cur_n;
|
||||||
|
|
||||||
blob_buf_init(&b, 0);
|
blob_buf_init(&b, 0);
|
||||||
avl_for_each_element(&stations, sta, avl) {
|
avl_for_each_element(&stations, sta, avl) {
|
||||||
sprintf(str, MAC_ADDR_FMT, MAC_ADDR_DATA(sta->addr));
|
_s = blobmsg_open_table_mac(&b, sta->addr);
|
||||||
_s = blobmsg_open_table(&b, str);
|
|
||||||
list_for_each_entry(si, &sta->nodes, list) {
|
list_for_each_entry(si, &sta->nodes, list) {
|
||||||
_cur_n = blobmsg_open_table(&b, usteer_node_name(si->node));
|
_cur_n = blobmsg_open_table(&b, usteer_node_name(si->node));
|
||||||
blobmsg_add_u8(&b, "connected", si->connected);
|
blobmsg_add_u8(&b, "connected", si->connected);
|
||||||
@@ -369,6 +375,75 @@ usteer_ubus_remote_info(struct ubus_context *ctx, struct ubus_object *obj,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
usteer_ubus_get_connected_clients(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
|
struct ubus_request_data *req, const char *method,
|
||||||
|
struct blob_attr *msg)
|
||||||
|
{
|
||||||
|
struct usteer_measurement_report *mr;
|
||||||
|
struct usteer_node *node;
|
||||||
|
struct sta_info *si;
|
||||||
|
void *n, *s, *t, *a;
|
||||||
|
|
||||||
|
blob_buf_init(&b, 0);
|
||||||
|
|
||||||
|
for_each_local_node(node) {
|
||||||
|
n = blobmsg_open_table(&b, usteer_node_name(node));
|
||||||
|
|
||||||
|
list_for_each_entry(si, &node->sta_info, node_list) {
|
||||||
|
if (si->connected != STA_CONNECTED)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
s = blobmsg_open_table_mac(&b, si->sta->addr);
|
||||||
|
blobmsg_add_u32(&b, "signal", si->signal);
|
||||||
|
blobmsg_add_u64(&b, "created", si->created);
|
||||||
|
blobmsg_add_u64(&b, "seen", si->seen);
|
||||||
|
blobmsg_add_u64(&b, "last_connected", si->last_connected);
|
||||||
|
|
||||||
|
t = blobmsg_open_table(&b, "snr-kick");
|
||||||
|
blobmsg_add_u32(&b, "seen-below", si->below_min_snr);
|
||||||
|
blobmsg_close_table(&b, t);
|
||||||
|
|
||||||
|
t = blobmsg_open_table(&b, "load-kick");
|
||||||
|
blobmsg_add_u32(&b, "count", si->kick_count);
|
||||||
|
blobmsg_close_table(&b, t);
|
||||||
|
|
||||||
|
t = blobmsg_open_table(&b, "roam-state-machine");
|
||||||
|
blobmsg_add_u32(&b, "tries", si->roam_tries);
|
||||||
|
blobmsg_add_u64(&b, "event", si->roam_event);
|
||||||
|
blobmsg_add_u64(&b, "kick", si->roam_kick);
|
||||||
|
blobmsg_add_u64(&b, "scan_start", si->roam_scan_start);
|
||||||
|
blobmsg_add_u64(&b, "scan_timeout_start", si->roam_scan_timeout_start);
|
||||||
|
blobmsg_close_table(&b, t);
|
||||||
|
|
||||||
|
t = blobmsg_open_table(&b, "bss-transition-response");
|
||||||
|
blobmsg_add_u32(&b, "status-code", si->bss_transition_response.status_code);
|
||||||
|
blobmsg_add_u64(&b, "timestamp", si->bss_transition_response.timestamp);
|
||||||
|
blobmsg_close_table(&b, t);
|
||||||
|
|
||||||
|
/* Measurements */
|
||||||
|
a = blobmsg_open_array(&b, "measurements");
|
||||||
|
list_for_each_entry(mr, &si->sta->measurements, sta_list) {
|
||||||
|
t = blobmsg_open_table(&b, "");
|
||||||
|
blobmsg_add_string(&b, "node", usteer_node_name(mr->node));
|
||||||
|
blobmsg_add_u32(&b, "rcpi", mr->beacon_report.rcpi);
|
||||||
|
blobmsg_add_u32(&b, "rsni", mr->beacon_report.rsni);
|
||||||
|
blobmsg_add_u64(&b, "timestamp", mr->timestamp);
|
||||||
|
blobmsg_close_table(&b, t);
|
||||||
|
}
|
||||||
|
blobmsg_close_array(&b, a);
|
||||||
|
|
||||||
|
blobmsg_close_table(&b, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
blobmsg_close_table(&b, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
ubus_send_reply(ctx, req, b.head);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
NODE_DATA_NODE,
|
NODE_DATA_NODE,
|
||||||
NODE_DATA_VALUES,
|
NODE_DATA_VALUES,
|
||||||
@@ -463,6 +538,7 @@ static const struct ubus_method usteer_methods[] = {
|
|||||||
UBUS_METHOD_NOARG("local_info", usteer_ubus_local_info),
|
UBUS_METHOD_NOARG("local_info", usteer_ubus_local_info),
|
||||||
UBUS_METHOD_NOARG("remote_hosts", usteer_ubus_remote_hosts),
|
UBUS_METHOD_NOARG("remote_hosts", usteer_ubus_remote_hosts),
|
||||||
UBUS_METHOD_NOARG("remote_info", usteer_ubus_remote_info),
|
UBUS_METHOD_NOARG("remote_info", usteer_ubus_remote_info),
|
||||||
|
UBUS_METHOD_NOARG("connected_clients", usteer_ubus_get_connected_clients),
|
||||||
UBUS_METHOD_NOARG("get_clients", usteer_ubus_get_clients),
|
UBUS_METHOD_NOARG("get_clients", usteer_ubus_get_clients),
|
||||||
UBUS_METHOD("get_client_info", usteer_ubus_get_client_info, client_arg),
|
UBUS_METHOD("get_client_info", usteer_ubus_get_client_info, client_arg),
|
||||||
UBUS_METHOD_NOARG("get_config", usteer_ubus_get_config),
|
UBUS_METHOD_NOARG("get_config", usteer_ubus_get_config),
|
||||||
|
Reference in New Issue
Block a user