From c7c550c3bc01e969af9243b6bd7db5f4a69d85e5 Mon Sep 17 00:00:00 2001 From: Jakob Olsson <jakob.olsson@iopsys.eu> Date: Thu, 3 Mar 2022 13:39:12 +0100 Subject: [PATCH] agent: maintain radio autoconfig state when reloading radios --- src/agent.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/agent.c b/src/agent.c index d414b5b59..fc2e12c82 100644 --- a/src/agent.c +++ b/src/agent.c @@ -4477,14 +4477,16 @@ void parse_scanresults(struct ubus_request *req, int type, struct blob_attr *msg static void _enumerate_wifi_objects(struct ubus_request *req, int type, struct blob_attr *msg) { - trace("%s: --->\n", __func__); - + struct radio_apcfg_state { + char name[16]; + enum autocfg_state state; + } apcfg_state[WIFI_DEVICE_MAX_NUM] = {0}; struct agent *a = (struct agent *)req->priv; struct json_object *json_msg; struct json_object *radio_array; char *json_str; - int i, j, k, len; + int i, j, k, len, prev_len = 0; json_str = blobmsg_format_json(msg, true); if (!json_str) @@ -4504,6 +4506,14 @@ static void _enumerate_wifi_objects(struct ubus_request *req, int type, trace("%s: num_radios(len) = %d\n", __func__, len); if (len) { + /* store current radio apcfg states */ + for (i = 0; i < a->num_radios; i++) { + strncpy(apcfg_state[i].name, a->radios[i].name, + IFNAMSIZ - 1); + apcfg_state[i].state = a->radios[i].state; + } + prev_len = a->num_radios; + /* clears radio apcfg states */ agent_free_radios(a); clear_fhlist(a); a->num_radios = len; @@ -4527,6 +4537,14 @@ static void _enumerate_wifi_objects(struct ubus_request *req, int type, strncpy(a->ifs[i].radio, radio_name, 15); strncpy(a->radios[i].name, radio_name, 15); + for (j = 0; j < prev_len; j++) { + /* write back apcfg state if any */ + if (!strncmp(apcfg_state[j].name, a->radios[i].name, + IFNAMSIZ - 1)) { + a->radios[i].state = apcfg_state[j].state; + } + } + list_for_each_entry(r_cfg, &a->cfg.radiolist, list) { if (strncmp(r_cfg->name, a->radios[i].name, 15)) continue; @@ -6011,6 +6029,7 @@ int wifiagent_get_status(struct ubus_context *ctx, blobmsg_add_u32(&bb, "channel", re->current_channel); blobmsg_add_u32(&bb, "bandwidth", re->current_bandwidth); blobmsg_add_u32(&bb, "opclass", re->current_opclass); + blobmsg_add_u32(&bb, "autocfg_state", re->state); blobmsg_close_table(&bb, t); } blobmsg_close_array(&bb, a); -- GitLab