diff --git a/README.md b/README.md index 368631dd23fd771bb5bd56ecf9dca66bcf2e3228..71def39b11e786cd323f873eac8f5c2d4889bb58 100644 --- a/README.md +++ b/README.md @@ -506,6 +506,7 @@ root@iopsys-021000000001:~# ubus -v list map.controller "sta_metric_query":{"agent":"String","sta":"String"} "unassoc_sta_lm_query":{"agent":"String","opclass":"Integer","metrics":"Array"} "bcn_metrics_query":{"agent":"String","sta":"String","opclass":"Integer","channel":"Integer","bssid":"String","reporting_detail":"Integer","ssid":"String","channel_report":"Array","request_element":"Array"} + "bcn_metrics_resp":{"sta":"String"} "bk_caps":{"agent":"String"} "topology_query":{"agent":"String"} "cac_req":{"agent":"String","radiolist":"Array"} diff --git a/src/cntlr_ubus.c b/src/cntlr_ubus.c index a788e3e66c2f7381eec949125bc9f8228fdffc70..cfd87f21eb582a4389b162cebbbb2777bc46f122 100644 --- a/src/cntlr_ubus.c +++ b/src/cntlr_ubus.c @@ -327,6 +327,16 @@ static const struct blobmsg_policy }; +enum { + BCN_METRICS_RESP_STA, + __BCN_METRICS_RESP_MAX, +}; + +static const struct blobmsg_policy + bcn_metrics_resp_params[__BCN_METRICS_RESP_MAX] = { + [BCN_METRICS_RESP_STA] = { .name = "sta", .type = BLOBMSG_TYPE_STRING }, +}; + static const struct blobmsg_policy bk_caps_policy_params[__BK_CAPS_POLICY_MAX] = { [BK_CAPS_POLICY_AGENT] = { .name = "agent", .type = BLOBMSG_TYPE_STRING }, }; @@ -2799,6 +2809,86 @@ out: return ret; } +int cntlr_bcn_metrics_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[__BCN_METRICS_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(bcn_metrics_resp_params, __BCN_METRICS_RESP_MAX, + tb, blob_data(msg), blob_len(msg)); + + if (tb[BCN_METRICS_RESP_STA]) { + strncpy(sta, blobmsg_data(tb[BCN_METRICS_RESP_STA]), + sizeof(sta) - 1); + + if (!hwaddr_aton(sta, sta_mac)) { + dbg("|%s:%d|Must provide valid STA address!\n", + __func__, __LINE__); + return UBUS_STATUS_UNKNOWN_ERROR; + } + } + + /* Example ubus call: + * ubus call map.controller bcn_metrics_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) { + struct wifi_sta_meas_report *bcn; + void *ttt, *tttt; + char stastr[18] = {0}; + char bssstr[18] = {0}; + + if (!hwaddr_is_zero(sta_mac) && + memcmp(s->de_sta->macaddr, sta_mac, 6)) + continue; + + hwaddr_ntoa(s->de_sta->macaddr, stastr); + hwaddr_ntoa(s->bssid, bssstr); + + ttt = blobmsg_open_table(&bb, ""); + + blobmsg_add_string(&bb, "macaddr", stastr); + + tttt = blobmsg_open_array(&bb, "meas_reportlist"); + list_for_each_entry(bcn, &s->de_sta->meas_reportlist, list) { + void *ttttt; + + ttttt = blobmsg_open_table(&bb, ""); + + blobmsg_add_u16(&bb, "channel", bcn->channel); + blobmsg_add_u16(&bb, "opclass", bcn->opclass); + blobmsg_add_u16(&bb, "rcpi", bcn->rcpi); + blobmsg_add_u16(&bb, "rsni", bcn->rsni); + hwaddr_ntoa(bcn->bssid, bssstr); + blobmsg_add_string(&bb, "bssid", bssstr); + blobmsg_add_u32(&bb, "requested", (bcn->requested) ? 1 : 0); + blobmsg_close_table(&bb, ttttt); + } + + blobmsg_close_array(&bb, tttt); + 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) @@ -3211,6 +3301,8 @@ int cntlr_publish_object(struct controller *c, const char *objname) unassoc_sta_lm_query_params), UBUS_METHOD("bcn_metrics_query", cntlr_bcn_metrics_query, bcn_metrics_query_params), + UBUS_METHOD("bcn_metrics_resp", cntlr_bcn_metrics_resp, + bcn_metrics_resp_params), UBUS_METHOD("bk_caps", cntlr_bk_caps, bk_caps_policy_params), UBUS_METHOD("topology_query", cntlr_topology_query,