preparatation for supporting service types
Signed-off-by: Felix Fietkau <nbd@nbd.name>
network_pex_close(net);
network_services_free(net);
network_hosts_update_start(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:
switch (net->config.type) {
case NETWORK_TYPE_FILE:
+ network_services_update_done(net);
network_hosts_update_done(net);
uloop_timeout_set(&net->connect_timer, 10);
network_hosts_update_done(net);
uloop_timeout_set(&net->connect_timer, 10);
struct vlist_tree peers;
struct avl_tree groups;
struct vlist_tree peers;
struct avl_tree groups;
- struct avl_tree services;
+ struct vlist_tree services;
struct uloop_timeout connect_timer;
struct uloop_timeout connect_timer;
enum {
SERVICE_ATTR_TYPE,
enum {
SERVICE_ATTR_TYPE,
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_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 },
};
[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)
{
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);
{
struct network_service *s;
struct blob_attr *tb[__SERVICE_ATTR_MAX];
{
struct network_service *s;
struct blob_attr *tb[__SERVICE_ATTR_MAX];
+ struct blob_attr *cur, *config;
const char *name = blobmsg_name(data);
const char *type = NULL;
char *name_buf, *type_buf;
const char *name = blobmsg_name(data);
const char *type = NULL;
char *name_buf, *type_buf;
int n_members;
blobmsg_parse(service_policy, __SERVICE_ATTR_MAX, tb,
int n_members;
blobmsg_parse(service_policy, __SERVICE_ATTR_MAX, tb,
if (blobmsg_check_array(tb[SERVICE_ATTR_MEMBERS], BLOBMSG_TYPE_STRING) < 0)
return;
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,
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 (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]);
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)
}
void network_services_add(struct network *net, struct blob_attr *data)
blobmsg_for_each_attr(cur, data, rem)
service_add(net, cur);
}
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);
+}
#define __UNETD_SERVICE_H
struct network_service {
#define __UNETD_SERVICE_H
struct network_service {
+ struct vlist_node node;
+ struct blob_attr *config;
const char *type;
int n_members;
const char *type;
int n_members;
void network_services_free(struct network *net);
void network_services_add(struct network *net, struct blob_attr *data);
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);
+}
+
struct network_service *s;
int i;
struct network_service *s;
int i;
- s = avl_find_element(&n->services, name, s, node);
+ s = vlist_find(&n->services, name, s, node);