From cfc8a8b65d7d214a9c54da5609f1fa7caad32fc2 Mon Sep 17 00:00:00 2001
From: Janusz Dziedzic <janusz.dziedzic@iopsys.eu>
Date: Fri, 15 Sep 2023 12:54:51 +0200
Subject: [PATCH] send CSR (all prefered) when adding radio

---
 src/cntlr.c          |  2 ++
 src/cntlr_cmdu.c     |  2 +-
 src/cntlr_tlv.c      |  6 +++++-
 src/cntlr_ubus_dbg.c | 21 +++++++++++++++++++++
 4 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/src/cntlr.c b/src/cntlr.c
index a40bdec4..7297fa1a 100644
--- a/src/cntlr.c
+++ b/src/cntlr.c
@@ -1072,6 +1072,8 @@ struct netif_radio *cntlr_node_add_radio(struct controller *c, struct node *n,
 
 	allmac_insert(&c->mac_table, radio, MAC_ENTRY_RADIO, (void *)r);
 
+	cntrl_send_channel_selection(c, n->alid, radio, 0, 0, 0);
+
 	return r;
 }
 
diff --git a/src/cntlr_cmdu.c b/src/cntlr_cmdu.c
index 0731b2db..f96e3a4a 100644
--- a/src/cntlr_cmdu.c
+++ b/src/cntlr_cmdu.c
@@ -796,7 +796,7 @@ int cntrl_send_channel_selection(struct controller *c, uint8_t *agent, uint8_t *
 		return -1;
 
 	memcpy(cmdu->origin, agent, 6);
-	if (cntlr_gen_channel_pref(c, cmdu, radio, opclass, ARRAY_SIZE(chanlist), chanlist, pref)) {
+	if (cntlr_gen_channel_pref(c, cmdu, radio, opclass, channel ?  ARRAY_SIZE(chanlist) : 0, chanlist, pref)) {
 		cmdu_free(cmdu);
 		return -1;
 	}
diff --git a/src/cntlr_tlv.c b/src/cntlr_tlv.c
index a5a7eeab..27130e17 100644
--- a/src/cntlr_tlv.c
+++ b/src/cntlr_tlv.c
@@ -1501,7 +1501,7 @@ int cntlr_gen_channel_pref(struct controller *c, struct cmdu_buff *frm,
 	if (!radio->radio_el)
 		return -1;
 
-	if (!radio->radio_el->supp_opclass.num_opclass)
+	if (!radio->radio_el->supp_opclass.num_opclass && channel_nr)
 		return -1;
 
 	/* Build opclass we would like to send */
@@ -1518,6 +1518,10 @@ int cntlr_gen_channel_pref(struct controller *c, struct cmdu_buff *frm,
 	if (!t)
 		return -1;
 
+	/* Prefer all supported - don't include any opclass */
+	if (!channel_nr)
+		opclass.num_opclass = 0;
+
 	t->type = MAP_TLV_CHANNEL_PREFERENCE;
 
 	memcpy(&t->data[offset], radio_id, 6);	/* radio id */
diff --git a/src/cntlr_ubus_dbg.c b/src/cntlr_ubus_dbg.c
index f32e2ef3..1195700b 100644
--- a/src/cntlr_ubus_dbg.c
+++ b/src/cntlr_ubus_dbg.c
@@ -198,6 +198,26 @@ cntrl_dbg_get_cur_opclass_by_bssid(struct controller *c, const unsigned char *bs
 	return NULL;
 }
 
+static int cntrl_dbg_csr(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_dbg);
+	struct node *node = NULL;
+
+	list_for_each_entry(node, &c->nodelist, list) {
+		struct netif_radio *r = NULL;
+
+		list_for_each_entry(r, &node->radiolist, list) {
+			cntrl_send_channel_selection(c, node->alid, r->radio_el->macaddr, 0, 0, 0);
+		}
+	}
+
+
+	return UBUS_STATUS_OK;
+}
+
 static int cntrl_dbg_bh_topology_dump(struct ubus_context *ctx,
 				      struct ubus_object *obj,
 				      struct ubus_request_data *req,
@@ -348,6 +368,7 @@ int cntlr_publish_dbg_object(struct controller *c, const char *objname)
 		UBUS_METHOD("clear_steer_summary", cntlr_dbg_clear_steer_summary,
 			clr_steer_summary_params),
 		UBUS_METHOD_NOARG("bh_topology_dump", cntrl_dbg_bh_topology_dump),
+		UBUS_METHOD_NOARG("csr", cntrl_dbg_csr),
 #if (EASYMESH_VERSION > 2)
 		UBUS_METHOD_NOARG("list_uris", cntlr_dbg_list_uris),
 #endif
-- 
GitLab