local-node: obtain channel + op-class
authorDavid Bauer <mail@david-bauer.net>
Sat, 8 Jan 2022 22:26:03 +0000 (23:26 +0100)
committerDavid Bauer <mail@david-bauer.net>
Thu, 3 Feb 2022 21:43:37 +0000 (22:43 +0100)
In order to send passive beacon-requests, channel and op-class of nodes
are required. Obtain this information per local-node from hostapd.

Signed-off-by: David Bauer <mail@david-bauer.net>
local_node.c
node.h
parse.c
remote.c
remote.h
usteer.h

index 6f2d6a73559d850d27a7367389c4533395fdacd9..e4412661699a8b6511acf1ba60519e66bae64d81 100644 (file)
@@ -342,6 +342,36 @@ usteer_local_node_list_cb(struct ubus_request *req, int type, struct blob_attr *
        usteer_local_node_set_assoc(ln, tb[MSG_CLIENTS]);
 }
 
+static void
+usteer_local_node_status_cb(struct ubus_request *req, int type, struct blob_attr *msg)
+{
+       enum {
+               MSG_FREQ,
+               MSG_CHANNEL,
+               MSG_OP_CLASS,
+               __MSG_MAX,
+       };
+       static struct blobmsg_policy policy[__MSG_MAX] = {
+               [MSG_FREQ] = { "freq", BLOBMSG_TYPE_INT32 },
+               [MSG_CHANNEL] = { "channel", BLOBMSG_TYPE_INT32 },
+               [MSG_OP_CLASS] = { "op_class", BLOBMSG_TYPE_INT32 },
+       };
+       struct blob_attr *tb[__MSG_MAX];
+       struct usteer_local_node *ln;
+       struct usteer_node *node;
+
+       ln = container_of(req, struct usteer_local_node, req);
+       node = &ln->node;
+
+       blobmsg_parse(policy, __MSG_MAX, tb, blob_data(msg), blob_len(msg));
+       if (tb[MSG_FREQ])
+               node->freq = blobmsg_get_u32(tb[MSG_FREQ]);
+       if (tb[MSG_CHANNEL])
+               node->channel = blobmsg_get_u32(tb[MSG_CHANNEL]);
+       if (tb[MSG_FREQ])
+               node->op_class = blobmsg_get_u32(tb[MSG_OP_CLASS]);     
+}
+
 static void
 usteer_local_node_rrm_nr_cb(struct ubus_request *req, int type, struct blob_attr *msg)
 {
@@ -438,6 +468,10 @@ usteer_local_node_state_next(struct uloop_timeout *timeout)
                ubus_invoke_async(ubus_ctx, ln->obj_id, "get_clients", b.head, &ln->req);
                ln->req.data_cb = usteer_local_node_list_cb;
                break;
+       case REQ_STATUS:
+               ubus_invoke_async(ubus_ctx, ln->obj_id, "get_status", b.head, &ln->req);
+               ln->req.data_cb = usteer_local_node_status_cb;
+               break;
        case REQ_RRM_SET_LIST:
                usteer_local_node_prepare_rrm_set(ln);
                ubus_invoke_async(ubus_ctx, ln->obj_id, "rrm_nr_set", b.head, &ln->req);
diff --git a/node.h b/node.h
index 05c32ae6d0fbad2aef79787b246a88fba0569d85..6d5f8fd791d45af9857c05e0263a78025c736187 100644 (file)
--- a/node.h
+++ b/node.h
@@ -25,6 +25,7 @@
 enum local_req_state {
        REQ_IDLE,
        REQ_CLIENTS,
+       REQ_STATUS,
        REQ_RRM_SET_LIST,
        REQ_RRM_GET_OWN,
        __REQ_MAX
diff --git a/parse.c b/parse.c
index b0b7bc22a2e42b767e676272c5db038d7a1c22ee..2aa37169e8559750aa26425c351242ed805c9d9f 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -64,6 +64,8 @@ bool parse_apmsg_node(struct apmsg_node *msg, struct blob_attr *data)
                [APMSG_NODE_LOAD] = { .type = BLOB_ATTR_INT32 },
                [APMSG_NODE_RRM_NR] = { .type = BLOB_ATTR_NESTED },
                [APMSG_NODE_NODE_INFO] = { .type = BLOB_ATTR_NESTED },
+               [APMSG_NODE_CHANNEL] = { .type = BLOB_ATTR_INT32 },
+               [APMSG_NODE_OP_CLASS] = { .type = BLOB_ATTR_INT32 },
        };
        struct blob_attr *tb[__APMSG_NODE_MAX];
        struct blob_attr *cur;
@@ -90,6 +92,11 @@ bool parse_apmsg_node(struct apmsg_node *msg, struct blob_attr *data)
        msg->max_assoc = get_int32(tb[APMSG_NODE_MAX_ASSOC]);
        msg->rrm_nr = NULL;
 
+       if (tb[APMSG_NODE_CHANNEL] && tb[APMSG_NODE_OP_CLASS]) {
+               msg->channel = blob_get_int32(tb[APMSG_NODE_CHANNEL]);
+               msg->op_class = blob_get_int32(tb[APMSG_NODE_OP_CLASS]);
+       }
+
        cur = tb[APMSG_NODE_RRM_NR];
        if (cur && blob_len(cur) >= sizeof(struct blob_attr) &&
            blob_len(cur) >= blob_pad_len(blob_data(cur))) {
index cb4f3ddc350d8b61e89fb2e6e6090a8a1f236ab8..bad5f8b56b89de01f306eb09e3c5794b59eed908 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -287,6 +287,8 @@ interface_add_node(struct usteer_remote_host *host, struct blob_attr *data)
        node = interface_get_node(host, msg.name);
        node->check = 0;
        node->node.freq = msg.freq;
+       node->node.channel = msg.channel;
+       node->node.op_class = msg.op_class;
        node->node.n_assoc = msg.n_assoc;
        node->node.max_assoc = msg.max_assoc;
        node->node.noise = msg.noise;
@@ -565,6 +567,8 @@ static void usteer_send_node(struct usteer_node *node, struct sta_info *sta)
        blob_put_int32(&buf, APMSG_NODE_LOAD, node->load);
        blob_put_int32(&buf, APMSG_NODE_N_ASSOC, node->n_assoc);
        blob_put_int32(&buf, APMSG_NODE_MAX_ASSOC, node->max_assoc);
+       blob_put_int32(&buf, APMSG_NODE_OP_CLASS, node->op_class);
+       blob_put_int32(&buf, APMSG_NODE_CHANNEL, node->channel);
        blob_put(&buf, APMSG_NODE_BSSID, node->bssid, sizeof(node->bssid));
        if (node->rrm_nr) {
                r = blob_nest_start(&buf, APMSG_NODE_RRM_NR);
index 9361b252eaab56f24cbdbb63c6f0f90858d1171c..a1486e7fa1491f8d641825559dd3c91c0d691e02 100644 (file)
--- a/remote.h
+++ b/remote.h
@@ -49,6 +49,8 @@ enum {
        APMSG_NODE_RRM_NR,
        APMSG_NODE_NODE_INFO,
        APMSG_NODE_BSSID,
+       APMSG_NODE_CHANNEL,
+       APMSG_NODE_OP_CLASS,
        __APMSG_NODE_MAX
 };
 
@@ -57,6 +59,8 @@ struct apmsg_node {
        const char *ssid;
        const char *bssid;
        int freq;
+       int channel;
+       int op_class;
        int n_assoc;
        int max_assoc;
        int noise;
index f4ba8004a30fcaf5d77d95b904f2ded064a3ee9f..23c9e4120a08a3d674eaee8dd5a434719ec509b9 100644 (file)
--- a/usteer.h
+++ b/usteer.h
@@ -83,6 +83,8 @@ struct usteer_node {
 
        bool disabled;
        int freq;
+       int channel;
+       int op_class;
        int noise;
        int n_assoc;
        int max_assoc;