Skip to main content
Sign in
Snippets Groups Projects
Commit 8aed30e5 authored by Filip Matusiak's avatar Filip Matusiak
Browse files

map-controller: unassociated STA link metrics UBUS query

parent 8f503643
Branches
No related tags found
No related merge requests found
Pipeline #29770 failed
This commit is part of merge request !56. Comments created here will be created in the context of that merge request.
...@@ -338,6 +338,33 @@ out: ...@@ -338,6 +338,33 @@ out:
return NULL; return NULL;
} }
struct cmdu_buff *cntlr_gen_unassoc_sta_metric_query(struct controller *c,
uint8_t *origin, uint8_t opclass)
{
int ret;
uint16_t mid = 0;
struct cmdu_buff *frm;
frm = cmdu_alloc_simple(CMDU_ASSOC_STA_LINK_METRICS_QUERY, &mid);
if (!frm) {
dbg("%s: -ENOMEM\n", __func__);
return NULL;
}
memcpy(frm->origin, origin, 6);
/* Unassociated STA link metrics query TLV */
ret = cntlr_gen_unassociated_sta_link_metrics(c, frm, opclass);
if (ret)
goto out;
cmdu_put_eom(frm);
return frm;
out:
return NULL;
}
struct cmdu_buff *cntlr_gen_bk_caps_query(struct controller *c, struct cmdu_buff *cntlr_gen_bk_caps_query(struct controller *c,
uint8_t *origin) uint8_t *origin)
{ {
... ...
......
...@@ -34,6 +34,8 @@ struct cmdu_buff *cntlr_gen_policy_config_req(struct controller *c, ...@@ -34,6 +34,8 @@ struct cmdu_buff *cntlr_gen_policy_config_req(struct controller *c,
int num_bss, uint8_t *bsslist); int num_bss, uint8_t *bsslist);
struct cmdu_buff *cntlr_gen_sta_metric_query(struct controller *c, struct cmdu_buff *cntlr_gen_sta_metric_query(struct controller *c,
uint8_t *origin, uint8_t *sta); uint8_t *origin, uint8_t *sta);
struct cmdu_buff *cntlr_gen_unassoc_sta_metric_query(struct controller *c,
uint8_t *origin, uint8_t opclass);
struct cmdu_buff *cntlr_gen_ap_autoconfig_search(struct controller *c, struct cmdu_buff *cntlr_gen_ap_autoconfig_search(struct controller *c,
uint8_t profile, uint8_t band); uint8_t profile, uint8_t band);
struct cmdu_buff *cntlr_gen_ap_autoconfig_response(struct controller *c, struct cmdu_buff *cntlr_gen_ap_autoconfig_response(struct controller *c,
... ...
......
...@@ -940,6 +940,31 @@ int cntlr_gen_sta_mac(struct controller *c, ...@@ -940,6 +940,31 @@ int cntlr_gen_sta_mac(struct controller *c,
return 0; return 0;
} }
int cntlr_gen_unassociated_sta_link_metrics(struct controller *c,
struct cmdu_buff *frm, uint8_t opclass)
{
int ret;
struct tlv *t;
struct tlv_unassoc_sta_link_metrics_query *data;
t = cmdu_reserve_tlv(frm, 512);
if (!t)
return -1;
t->type = MAP_TLV_UNASSOCIATED_STA_LINK_METRICS_QUERY;
t->len = sizeof(*data);
data = (struct tlv_unassoc_sta_link_metrics_query *) t->data;
data->opclass = opclass;
ret = cmdu_put_tlv(frm, t);
if (ret) {
dbg("%s: error: cmdu_put_tlv()\n", __func__);
return -1;
}
return 0;
}
int cntlr_gen_searched_role(struct controller *c, struct cmdu_buff *frm, int cntlr_gen_searched_role(struct controller *c, struct cmdu_buff *frm,
uint8_t role) uint8_t role)
{ {
... ...
......
...@@ -83,6 +83,8 @@ int cntlr_gen_ap_metric_query(struct controller *c, ...@@ -83,6 +83,8 @@ int cntlr_gen_ap_metric_query(struct controller *c,
struct cmdu_buff *frm, uint8_t num_bss, uint8_t *bsslist); struct cmdu_buff *frm, uint8_t num_bss, uint8_t *bsslist);
int cntlr_gen_sta_mac(struct controller *c, int cntlr_gen_sta_mac(struct controller *c,
struct cmdu_buff *frm, uint8_t *sta); struct cmdu_buff *frm, uint8_t *sta);
int cntlr_gen_unassociated_sta_link_metrics(struct controller *c,
struct cmdu_buff *frm, uint8_t opclass);
int cntlr_gen_searched_role(struct controller *c, struct cmdu_buff *frm, int cntlr_gen_searched_role(struct controller *c, struct cmdu_buff *frm,
uint8_t role); uint8_t role);
int cntlr_gen_autoconf_freq_band(struct controller *c, struct cmdu_buff *frm, int cntlr_gen_autoconf_freq_band(struct controller *c, struct cmdu_buff *frm,
... ...
......
...@@ -235,6 +235,25 @@ static const struct blobmsg_policy sta_metric_query_params[__STA_METRIC_QUERY_MA ...@@ -235,6 +235,25 @@ static const struct blobmsg_policy sta_metric_query_params[__STA_METRIC_QUERY_MA
[STA_METRIC_QUERY_STA] = { .name = "sta", .type = BLOBMSG_TYPE_STRING }, [STA_METRIC_QUERY_STA] = { .name = "sta", .type = BLOBMSG_TYPE_STRING },
}; };
enum {
UNASSOC_STA_LM_QUERY_AGENT,
UNASSOC_STA_LM_QUERY_OPCLASS,
UNASSOC_STA_LM_QUERY_METRICS,
__UNASSOC_STA_LM_QUERY_MAX,
};
static const struct blobmsg_policy unassoc_sta_lm_query_params[__UNASSOC_STA_LM_QUERY_MAX] = {
[UNASSOC_STA_LM_QUERY_AGENT] = { .name = "agent",
.type = BLOBMSG_TYPE_STRING },
[UNASSOC_STA_LM_QUERY_OPCLASS] = { .name = "opclass",
.type = BLOBMSG_TYPE_INT32 },
[UNASSOC_STA_LM_QUERY_METRICS] = { .name = "metrics",
.type = BLOBMSG_TYPE_ARRAY },
// ^^ as in: line 1778
// [BCN_METRICS_CHAN_REPORT] = { .name = "channel_report",
// .type = BLOBMSG_TYPE_ARRAY },
};
enum { enum {
BK_CAPS_POLICY_AGENT, BK_CAPS_POLICY_AGENT,
__BK_CAPS_POLICY_MAX, __BK_CAPS_POLICY_MAX,
...@@ -1650,6 +1669,46 @@ static int cntlr_sta_metric_query(struct ubus_context *ctx, ...@@ -1650,6 +1669,46 @@ static int cntlr_sta_metric_query(struct ubus_context *ctx,
return UBUS_STATUS_OK; return UBUS_STATUS_OK;
} }
static int cntlr_unassoc_sta_lm_query(struct ubus_context *ctx,
struct ubus_object *obj, struct ubus_request_data *req,
const char *method, struct blob_attr *msg)
{
struct cmdu_buff *cmdu;
char mac_str[18];
uint8_t agent_mac[6] = { 0 };
struct blob_attr *tb[__UNASSOC_STA_LM_QUERY_MAX];
struct controller *c = container_of(obj, struct controller, obj);
uint8_t opclass = 0;
blobmsg_parse(unassoc_sta_lm_query_params, __UNASSOC_STA_LM_QUERY_MAX, tb,
blob_data(msg), blob_len(msg));
if (!tb[UNASSOC_STA_LM_QUERY_AGENT]) {
fprintf(stderr, "Unassociated STA link metric query: provide Agent" \
"address in format aa:bb:cc:dd:ee:ff\n");
return UBUS_STATUS_INVALID_ARGUMENT;
}
memset(mac_str, 0, sizeof(mac_str));
strncpy(mac_str, blobmsg_data(tb[STA_METRIC_QUERY_AGENT]),
sizeof(mac_str) - 1);
if (!hwaddr_aton(mac_str, agent_mac))
return UBUS_STATUS_UNKNOWN_ERROR;
if (tb[BCN_METRICS_OPCLASS])
opclass = (int) blobmsg_get_u32(
tb[BCN_METRICS_OPCLASS]);
cmdu = cntlr_gen_unassoc_sta_metric_query(c, agent_mac, opclass);
if (!cmdu)
return UBUS_STATUS_UNKNOWN_ERROR;
send_cmdu(c, cmdu);
cmdu_free(cmdu);
return UBUS_STATUS_OK;
}
int cntlr_bcn_metrics_query(struct ubus_context *ctx, struct ubus_object *obj, int cntlr_bcn_metrics_query(struct ubus_context *ctx, struct ubus_object *obj,
struct ubus_request_data *req, const char *method, struct ubus_request_data *req, const char *method,
struct blob_attr *msg) struct blob_attr *msg)
...@@ -2187,6 +2246,8 @@ int cntlr_publish_object(struct controller *c, const char *objname) ...@@ -2187,6 +2246,8 @@ int cntlr_publish_object(struct controller *c, const char *objname)
UBUS_METHOD("scan", cntlr_scan, scan_policy_params), UBUS_METHOD("scan", cntlr_scan, scan_policy_params),
UBUS_METHOD("sta_metric_query", cntlr_sta_metric_query, UBUS_METHOD("sta_metric_query", cntlr_sta_metric_query,
sta_metric_query_params), sta_metric_query_params),
UBUS_METHOD("unassoc_sta_lm_query", cntlr_unassoc_sta_lm_query,
unassoc_sta_lm_query_params),
UBUS_METHOD("bcn_metrics_query", cntlr_bcn_metrics_query, UBUS_METHOD("bcn_metrics_query", cntlr_bcn_metrics_query,
bcn_metrics_query_params), bcn_metrics_query_params),
UBUS_METHOD("bk_caps", cntlr_bk_caps, UBUS_METHOD("bk_caps", cntlr_bk_caps,
... ...
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment