remote: close file on usteer_init_local_id fread fail
[project/usteer.git] / parse.c
diff --git a/parse.c b/parse.c
index 800ae5aa99512c17356ae37e30333e6a01abc694..2aa37169e8559750aa26425c351242ed805c9d9f 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -26,6 +26,7 @@ bool parse_apmsg(struct apmsg *msg, struct blob_attr *data)
                [APMSG_ID] = { .type = BLOB_ATTR_INT32 },
                [APMSG_SEQ] = { .type = BLOB_ATTR_INT32 },
                [APMSG_NODES] = { .type = BLOB_ATTR_NESTED },
+               [APMSG_HOST_INFO] = { .type = BLOB_ATTR_NESTED },
        };
        struct blob_attr *tb[__APMSG_MAX];
 
@@ -36,6 +37,7 @@ bool parse_apmsg(struct apmsg *msg, struct blob_attr *data)
        msg->id = blob_get_int32(tb[APMSG_ID]);
        msg->seq = blob_get_int32(tb[APMSG_SEQ]);
        msg->nodes = tb[APMSG_NODES];
+       msg->host_info = tb[APMSG_HOST_INFO];
 
        return true;
 }
@@ -53,6 +55,7 @@ bool parse_apmsg_node(struct apmsg_node *msg, struct blob_attr *data)
 {
        static const struct blob_attr_info policy[__APMSG_NODE_MAX] = {
                [APMSG_NODE_NAME] = { .type = BLOB_ATTR_STRING },
+               [APMSG_NODE_BSSID] = { .type = BLOB_ATTR_BINARY },
                [APMSG_NODE_FREQ] = { .type = BLOB_ATTR_INT32 },
                [APMSG_NODE_N_ASSOC] = { .type = BLOB_ATTR_INT32 },
                [APMSG_NODE_MAX_ASSOC] = { .type = BLOB_ATTR_INT32 },
@@ -60,13 +63,17 @@ bool parse_apmsg_node(struct apmsg_node *msg, struct blob_attr *data)
                [APMSG_NODE_NOISE] = { .type = BLOB_ATTR_INT32 },
                [APMSG_NODE_LOAD] = { .type = BLOB_ATTR_INT32 },
                [APMSG_NODE_RRM_NR] = { .type = BLOB_ATTR_NESTED },
-               [APMSG_NODE_SCRIPT_DATA] = { .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;
 
        blob_parse(data, tb, policy, __APMSG_NODE_MAX);
        if (!tb[APMSG_NODE_NAME] ||
+           !tb[APMSG_NODE_BSSID] ||
+           blob_len(tb[APMSG_NODE_BSSID]) != 6 ||
            !tb[APMSG_NODE_FREQ] ||
            !tb[APMSG_NODE_N_ASSOC] ||
            !tb[APMSG_NODE_STATIONS] ||
@@ -78,12 +85,18 @@ bool parse_apmsg_node(struct apmsg_node *msg, struct blob_attr *data)
        msg->freq = blob_get_int32(tb[APMSG_NODE_FREQ]);
        msg->stations = tb[APMSG_NODE_STATIONS];
        msg->ssid = blob_data(tb[APMSG_NODE_SSID]);
+       msg->bssid = blob_data(tb[APMSG_NODE_BSSID]);
 
        msg->noise = get_int32(tb[APMSG_NODE_NOISE]);
        msg->load = get_int32(tb[APMSG_NODE_LOAD]);
        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))) {
@@ -105,7 +118,7 @@ bool parse_apmsg_node(struct apmsg_node *msg, struct blob_attr *data)
                        msg->rrm_nr = NULL;
        }
 
-       msg->script_data = tb[APMSG_NODE_SCRIPT_DATA];
+       msg->node_info = tb[APMSG_NODE_NODE_INFO];
 
        return true;
 }
@@ -118,6 +131,7 @@ bool parse_apmsg_sta(struct apmsg_sta *msg, struct blob_attr *data)
                [APMSG_STA_SEEN] = { .type = BLOB_ATTR_INT32 },
                [APMSG_STA_TIMEOUT] = { .type = BLOB_ATTR_INT32 },
                [APMSG_STA_CONNECTED] = { .type = BLOB_ATTR_INT8 },
+               [APMSG_STA_LAST_CONNECTED] = { .type = BLOB_ATTR_INT32 },
        };
        struct blob_attr *tb[__APMSG_STA_MAX];
 
@@ -126,7 +140,8 @@ bool parse_apmsg_sta(struct apmsg_sta *msg, struct blob_attr *data)
            !tb[APMSG_STA_SIGNAL] ||
            !tb[APMSG_STA_SEEN] ||
            !tb[APMSG_STA_TIMEOUT] ||
-           !tb[APMSG_STA_CONNECTED])
+           !tb[APMSG_STA_CONNECTED] ||
+           !tb[APMSG_STA_LAST_CONNECTED])
                return false;
 
        if (blob_len(tb[APMSG_STA_ADDR]) != sizeof(msg->addr))
@@ -137,6 +152,7 @@ bool parse_apmsg_sta(struct apmsg_sta *msg, struct blob_attr *data)
        msg->seen = blob_get_int32(tb[APMSG_STA_SEEN]);
        msg->timeout = blob_get_int32(tb[APMSG_STA_TIMEOUT]);
        msg->connected = blob_get_int8(tb[APMSG_STA_CONNECTED]);
+       msg->last_connected = blob_get_int32(tb[APMSG_STA_LAST_CONNECTED]);
 
        return true;
 }