diff --git a/src/cntlr.c b/src/cntlr.c index c419a36793144a1d36b0c01e23355b7b582c89fa..81bf00b171d34ecd684ce8e98b4c39d82499949e 100644 --- a/src/cntlr.c +++ b/src/cntlr.c @@ -897,7 +897,7 @@ struct sta *cntlr_add_sta(struct controller *c, uint8_t *macaddr) if (!s) return NULL; - INIT_LIST_HEAD(&s->unassoclist); + INIT_LIST_HEAD(&s->umetriclist); list_add(&s->list, &c->stalist); timer_init(&s->bcn_metrics_timer, cntlr_bcn_metrics_parse); timer_init(&s->btm_req_timer, cntlr_btm_req_timer_cb); @@ -1304,7 +1304,7 @@ void free_usta_metrics(struct controller *c, struct sta *s) { struct una_sta_metrics *u = NULL, *tmp; - list_for_each_entry_safe(u, tmp, &s->unassoclist, list) { + list_for_each_entry_safe(u, tmp, &s->umetriclist, list) { list_del(&u->list); free(u); } diff --git a/src/cntlr.h b/src/cntlr.h index e7510ba4111def7370d07a2c9b073618dc5e9712..809094cdf3efab3b7a30b946656e2e7d326f2830 100644 --- a/src/cntlr.h +++ b/src/cntlr.h @@ -125,8 +125,7 @@ struct sta { uint32_t time_delta; - /* TODO: change name to match the data (e.g. umetriclist) */ - struct list_head unassoclist; + struct list_head umetriclist; struct wifi_sta_element *de_sta; diff --git a/src/cntlr_map.c b/src/cntlr_map.c index 07c26f88368fc567d874ebf2523f46afb72a83df..06a2c20dd988a339e21176f983b034754601a01e 100644 --- a/src/cntlr_map.c +++ b/src/cntlr_map.c @@ -2345,7 +2345,7 @@ struct una_sta_metrics *cntlr_find_usta_metric(struct controller *c, { struct una_sta_metrics *u = NULL; - list_for_each_entry(u, &s->unassoclist, list) { + list_for_each_entry(u, &s->umetriclist, list) { dbg("%s %d mac "MACFMT" alid " MACFMT"\n", __func__, __LINE__, MAC2STR(u->agent->alid), MAC2STR(mac)); if (!memcmp(u->agent->alid, mac, 6)) @@ -2379,7 +2379,7 @@ void cntlr_check_usta_steer(struct controller *c, struct sta *s) MACFMT "\n", __func__, __LINE__, MAC2STR(s->de_sta->macaddr), MAC2STR(s->bssid), MAC2STR(n->alid)); - list_for_each_entry(u, &s->unassoclist, list) { + list_for_each_entry(u, &s->umetriclist, list) { dbg("%s %d check usta node "MACFMT"\n", __func__, __LINE__, MAC2STR(u->agent->alid)); @@ -2498,7 +2498,7 @@ int handle_unassoc_sta_link_metrics_response(void *cntlr, if (!u) continue; - list_add(&u->list, &s->unassoclist); + list_add(&u->list, &s->umetriclist); u->agent = cntlr_find_node(c, cmdu->origin); dbg("%s %d\n", __func__, __LINE__); } diff --git a/src/cntlr_ubus.c b/src/cntlr_ubus.c index 5a9adff93da3e84b260d3c9d47c9100824261bb7..e198b8954d86c7cca27298da0e4f0a4df2bddf50 100644 --- a/src/cntlr_ubus.c +++ b/src/cntlr_ubus.c @@ -299,6 +299,15 @@ static const struct blobmsg_policy unassoc_sta_lm_query_params[__UNASSOC_STA_LM_ .type = BLOBMSG_TYPE_ARRAY }, }; +enum { + UNASSOC_STA_LM_RESP_STA, + __UNASSOC_STA_LM_RESP_MAX, +}; + +static const struct blobmsg_policy unassoc_sta_lm_resp_params[__UNASSOC_STA_LM_RESP_MAX] = { + [UNASSOC_STA_LM_RESP_STA] = { .name = "sta", .type = BLOBMSG_TYPE_STRING }, +}; + enum { BK_CAPS_POLICY_AGENT, __BK_CAPS_POLICY_MAX, @@ -3038,6 +3047,95 @@ int cntlr_bcn_metrics_resp(struct ubus_context *ctx, struct ubus_object *obj, return UBUS_STATUS_OK; } +static void add_array_una_sta_lm(struct blob_buf *bb, + struct sta *s) +{ + void *t; + struct una_sta_metrics *usm = NULL; + char alid_str[18] = {0}; + + t = blobmsg_open_array(bb, "unassociated_metrics"); + list_for_each_entry(usm, &s->umetriclist, list) { + void *tt; + + tt = blobmsg_open_table(bb, ""); + + if (WARN_ON(!usm->agent)) + continue; + hwaddr_ntoa(usm->agent->alid, alid_str); + blobmsg_add_string(bb, "alid", alid_str); + blobmsg_add_u16(bb, "channel", usm->channel); + blobmsg_add_u16(bb, "ul_rcpi", usm->ul_rcpi); + blobmsg_add_u64(bb, "time_delta", usm->time_delta); + + blobmsg_close_table(bb, tt); + } + + blobmsg_close_array(bb, t); +} + +int cntlr_unassoc_sta_lm_resp(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct controller *c = container_of(obj, struct controller, obj); + struct blob_attr *tb[__UNASSOC_STA_LM_RESP_MAX]; + struct blob_buf bb = {0}; + struct sta *s = NULL; + char sta[18] = {0}; + uint8_t sta_mac[6] = {0}; + void *a; + + trace("%s:--->\n", __func__); + + blobmsg_parse(unassoc_sta_lm_resp_params, __UNASSOC_STA_LM_RESP_MAX, + tb, blob_data(msg), blob_len(msg)); + + if (tb[UNASSOC_STA_LM_RESP_STA]) { + strncpy(sta, blobmsg_data(tb[UNASSOC_STA_LM_RESP_STA]), + sizeof(sta) - 1); + + if (!hwaddr_aton(sta, sta_mac)) { + dbg("|%s:%d|Provide valid STA address!\n", + __func__, __LINE__); + return UBUS_STATUS_UNKNOWN_ERROR; + } + } + + /* Example ubus call: + * ubus call map.controller unassoc_sta_lm_resp '{ + * "sta":"44:d4:37:4d:84:83"}' + */ + + blob_buf_init(&bb, 0); + + a = blobmsg_open_array(&bb, "stations"); + list_for_each_entry(s, &c->stalist, list) { + void *ttt; + char stastr[18] = {0}; + + if (!hwaddr_is_zero(sta_mac) && + memcmp(s->de_sta->macaddr, sta_mac, 6)) + continue; + + hwaddr_ntoa(s->de_sta->macaddr, stastr); + + ttt = blobmsg_open_table(&bb, ""); + + blobmsg_add_string(&bb, "macaddr", stastr); + + add_array_una_sta_lm(&bb, s); + + blobmsg_close_table(&bb, ttt); + } + + blobmsg_close_array(&bb, a); + ubus_send_reply(ctx, req, bb.head); + blob_buf_free(&bb); + + return UBUS_STATUS_OK; +} + static int cntlr_bk_caps(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) @@ -3475,6 +3573,8 @@ int cntlr_publish_object(struct controller *c, const char *objname) sta_metric_query_params), UBUS_METHOD("unassoc_sta_lm_query", cntlr_unassoc_sta_lm_query, unassoc_sta_lm_query_params), + UBUS_METHOD("unassoc_sta_lm_resp", cntlr_unassoc_sta_lm_resp, + unassoc_sta_lm_resp_params), UBUS_METHOD("bcn_metrics_query", cntlr_bcn_metrics_query, bcn_metrics_query_params), UBUS_METHOD("bcn_metrics_resp", cntlr_bcn_metrics_resp,