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