From 30a6f482c002ce59caf775e95a61654090933342 Mon Sep 17 00:00:00 2001
From: Jakob Olsson <jakob.olsson@iopsys.eu>
Date: Thu, 27 May 2021 14:28:44 +0200
Subject: [PATCH] map-controller: subscribe to i1905.map when object comes up

---
 src/core/cntlr.c | 53 ++++++++++++++++++------------------------------
 src/core/cntlr.h |  2 ++
 2 files changed, 22 insertions(+), 33 deletions(-)

diff --git a/src/core/cntlr.c b/src/core/cntlr.c
index ff7519e6..65035dd1 100644
--- a/src/core/cntlr.c
+++ b/src/core/cntlr.c
@@ -47,11 +47,15 @@
 #include "cntlr_map.h"
 #include "cntlr_cmdu_generator.h"
 
+#define map_plugin	"i1905.map"
+
+
 extern bool waitext;
 
 static int update_fronthaul_bsslist(struct node *n, struct netif_fhbss *fh);
 static void node_getbssinfo(void *cntlr, void *resp, int len, void *cookie);
 static int enumerate_topology_indirect(struct controller *c);
+static void mapclient_subscribe_for_cmdus(struct controller *c);
 
 void stop_cntlr(struct controller *c)
 {
@@ -1747,33 +1751,11 @@ static void cntlr_ubusx_event_handler(struct ubus_context *ctx,
 
 	path = blobmsg_data(attr);
 
-	/* is event of our interest? */
-	p = strstr(path, "wifi.agent");
-	if (p != NULL) {
-		snprintf(node, p - path, "%s", path);
-		if (add) {
-			struct in_addr ipn;
-			int rv;
-
-			info("To add: %s/wifi.agent\n",
-					node[0] ? node : "local");
-			topology_add_node(c, node);
-			watchlist_del_node(c, node);
-
-			rv = inet_aton(node, &ipn);
-			if (!rv)
-				return;
-
-			get_node_oui(c, &ipn);
-			get_node_mobid(c, &ipn);
-		} else {
-			info("To del: %s/wifi.agent\n",
-					node[0] ? node : "local");
-			watchlist_add_node(c, node);
-			topology_del_node(c, node);
+	if (add) {
+		if (!strncmp(path, map_plugin, strlen(map_plugin))) {
+			/* TODO: how to handle failure? */
+			mapclient_subscribe_for_cmdus(c);
 		}
-
-		perform_tasks_topology_change(c);
 	}
 }
 
@@ -2114,14 +2096,15 @@ static void parse_almac(struct ubus_request *req, int type,
 		dbg("almac = " MACFMT "\n", MAC2STR(c->almac));
 	}
 }
-#define map_plugin	"i1905.map"
-
 
 static void mapclient_sub_remove_cb(struct ubus_context *ctx,
 				    struct ubus_subscriber *sub,
 				    uint32_t obj)
 {
+	struct controller *c = container_of(sub, struct controller, sub);
+
 	trace("Object 0x%x no longer present\n", obj);
+	c->subscribed = false;
 }
 
 static int mapclient_sub_cb(struct ubus_context *ctx, struct ubus_object *obj,
@@ -2129,16 +2112,15 @@ static int mapclient_sub_cb(struct ubus_context *ctx, struct ubus_object *obj,
 			    struct blob_attr *msg)
 {
 	struct ubus_subscriber *s = container_of(obj, struct ubus_subscriber, obj);
-	struct controller *priv = container_of(s, struct controller, sub);
+	struct controller *c = container_of(s, struct controller, sub);
 	char *str;
 
 	str = blobmsg_format_json(msg, true);
 	trace("Received notification '%s': %s\n", type, str);
 
-	cntlr_ieee1905_cmdu_event_handler(priv, msg);
+	cntlr_ieee1905_cmdu_event_handler(c, msg);
 
 	free(str);
-
 	return 0;
 }
 
@@ -2151,15 +2133,20 @@ static int mapclient_subscribe(struct controller *a, uint32_t oid)
 	a->sub.remove_cb = mapclient_sub_remove_cb;
 
 	ret = ubus_register_subscriber(a->ubus_ctx, &a->sub);
-	if (ret)
+	if (ret) {
 		trace("Failed to register sub: %s\n", ubus_strerror(ret));
+		return -1;
+	}
 
 
 	/* now subscribe to events from map plugin over passed oid */
 	ret = ubus_subscribe(a->ubus_ctx, &a->sub, oid);
-	if (ret)
+	if (ret) {
 		trace("Failed to subscribe: %s\n", ubus_strerror(ret));
+		return -1;
+	}
 
+	a->subscribed = true;
 	return 0;
 }
 
diff --git a/src/core/cntlr.h b/src/core/cntlr.h
index 0928aa4e..be85eb83 100644
--- a/src/core/cntlr.h
+++ b/src/core/cntlr.h
@@ -150,8 +150,10 @@ struct controller {
 	uint16_t mid_5g;
 	uint16_t mid_2g;
 
+	/* i1905.map registration */
 	uint32_t map_oid;
 	struct ubus_subscriber sub;
+	bool subscribed;
 };
 
 #define COMM_HANDLE(c)	(((struct controller *)(c))->ubus_ctx)
-- 
GitLab