services: switch to vlist
authorFelix Fietkau <nbd@nbd.name>
Tue, 31 May 2022 12:06:07 +0000 (14:06 +0200)
committerFelix Fietkau <nbd@nbd.name>
Tue, 31 May 2022 12:06:08 +0000 (14:06 +0200)
preparatation for supporting service types

Signed-off-by: Felix Fietkau <nbd@nbd.name>
network.c
network.h
service.c
service.h
ubus.c

index a6259edd193250f02378e3f7563ac8eab727ef41..9e9485c7a58a166ddfa5980be543ae96133ba5b2 100644 (file)
--- a/network.c
+++ b/network.c
@@ -296,6 +296,7 @@ static int network_reload(struct network *net)
        network_pex_close(net);
        network_services_free(net);
        network_hosts_update_start(net);
+       network_services_update_start(net);
 
        switch (net->config.type) {
        case NETWORK_TYPE_FILE:
@@ -306,6 +307,7 @@ static int network_reload(struct network *net)
                break;
        }
 
+       network_services_update_done(net);
        network_hosts_update_done(net);
        uloop_timeout_set(&net->connect_timer, 10);
 
index 7e023fb7b4a5c26be1d8f59a041c9b02b2eee102..da0a28182916495e64bbb2290d9435841f0f4939 100644 (file)
--- a/network.h
+++ b/network.h
@@ -50,7 +50,7 @@ struct network {
        struct vlist_tree peers;
 
        struct avl_tree groups;
-       struct avl_tree services;
+       struct vlist_tree services;
 
        struct uloop_timeout connect_timer;
 
index 908fe3bbe59e10a5813e260800b38e3a81fb0309..f7daacdd1445a0ac26ac9b8c47dcc4efeef7c6cb 100644 (file)
--- a/service.c
+++ b/service.c
@@ -7,26 +7,20 @@
 
 enum {
        SERVICE_ATTR_TYPE,
+       SERVICE_ATTR_CONFIG,
        SERVICE_ATTR_MEMBERS,
        __SERVICE_ATTR_MAX
 };
 
 static const struct blobmsg_policy service_policy[__SERVICE_ATTR_MAX] = {
        [SERVICE_ATTR_TYPE] = { "type", BLOBMSG_TYPE_STRING },
+       [SERVICE_ATTR_CONFIG] = { "config", BLOBMSG_TYPE_TABLE },
        [SERVICE_ATTR_MEMBERS] = { "members", BLOBMSG_TYPE_ARRAY },
 };
 
-void network_services_init(struct network *net)
-{
-       avl_init(&net->services, avl_strcmp, false, NULL);
-}
-
 void network_services_free(struct network *net)
 {
-       struct network_service *s, *tmp;
-
-       avl_remove_all_elements(&net->services, s, node, tmp)
-               free(s);
+       vlist_flush_all(&net->services);
 }
 
 static int
@@ -81,10 +75,11 @@ service_add(struct network *net, struct blob_attr *data)
 {
        struct network_service *s;
        struct blob_attr *tb[__SERVICE_ATTR_MAX];
-       struct blob_attr *cur;
+       struct blob_attr *cur, *config;
        const char *name = blobmsg_name(data);
        const char *type = NULL;
        char *name_buf, *type_buf;
+       void *config_buf;
        int n_members;
 
        blobmsg_parse(service_policy, __SERVICE_ATTR_MAX, tb,
@@ -96,17 +91,22 @@ service_add(struct network *net, struct blob_attr *data)
        if (blobmsg_check_array(tb[SERVICE_ATTR_MEMBERS], BLOBMSG_TYPE_STRING) < 0)
                return;
 
+       config = tb[SERVICE_ATTR_CONFIG];
+
        n_members = service_parse_members(net, NULL, tb[SERVICE_ATTR_MEMBERS]);
        s = calloc_a(sizeof(*s) + n_members * sizeof(s->members[0]),
                     &name_buf, strlen(name) + 1,
-                    &type_buf, type ? strlen(type) + 1 : 0);
+                    &type_buf, type ? strlen(type) + 1 : 0,
+                    &config_buf, config ? blob_pad_len(config) : 0);
 
-       s->node.key = strcpy(name_buf, name);
+       strcpy(name_buf, name);
        if (type)
                s->type = strcpy(type_buf, type);
+       if (config)
+               s->config = memcpy(config_buf, config, blob_pad_len(config));
 
        service_parse_members(net, s, tb[SERVICE_ATTR_MEMBERS]);
-       avl_insert(&net->services, &s->node);
+       vlist_add(&net->services, &s->node, name_buf);
 }
 
 void network_services_add(struct network *net, struct blob_attr *data)
@@ -117,3 +117,19 @@ void network_services_add(struct network *net, struct blob_attr *data)
        blobmsg_for_each_attr(cur, data, rem)
                service_add(net, cur);
 }
+
+static void
+service_update(struct vlist_tree *tree, struct vlist_node *node_new,
+              struct vlist_node *node_old)
+{
+       struct network_service *s_old;
+
+       s_old = container_of_safe(node_old, struct network_service, node);
+       if (s_old)
+               free(s_old);
+}
+
+void network_services_init(struct network *net)
+{
+       vlist_init(&net->services, avl_strcmp, service_update);
+}
index ff652b7d9789acb1730ca43f0136ae1de58cee81..b85fbe671faaa73eb6ec8dafde4a900974fe0ff8 100644 (file)
--- a/service.h
+++ b/service.h
@@ -6,8 +6,9 @@
 #define __UNETD_SERVICE_H
 
 struct network_service {
-       struct avl_node node;
+       struct vlist_node node;
 
+       struct blob_attr *config;
        const char *type;
 
        int n_members;
@@ -18,4 +19,14 @@ void network_services_init(struct network *net);
 void network_services_free(struct network *net);
 void network_services_add(struct network *net, struct blob_attr *data);
 
+static inline void network_services_update_start(struct network *net)
+{
+       vlist_update(&net->services);
+}
+
+static inline void network_services_update_done(struct network *net)
+{
+       vlist_flush(&net->services);
+}
+
 #endif
diff --git a/ubus.c b/ubus.c
index 76c19807f8d625da271b6bda21e248449ad4d74e..a17b2f7a5ecfb9dc417cb0ad096fb9e06a0d251e 100644 (file)
--- a/ubus.c
+++ b/ubus.c
@@ -67,7 +67,7 @@ ubus_service_get_network_members(struct blob_buf *b, struct network *n,
        struct network_service *s;
        int i;
 
-       s = avl_find_element(&n->services, name, s, node);
+       s = vlist_find(&n->services, name, s, node);
        if (!s)
                return;