From: Felix Fietkau Date: Sat, 3 Mar 2012 23:02:38 +0000 (+0100) Subject: simplify vlist, move avl key handling to vlist_add() X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=c6e1778d4429032087b36fb0dde2ae2fecf53b4a;p=oweals%2Fnetifd.git simplify vlist, move avl key handling to vlist_add() --- diff --git a/interface-ip.c b/interface-ip.c index 7f10120..612fd5f 100644 --- a/interface-ip.c +++ b/interface-ip.c @@ -95,7 +95,7 @@ interface_ip_add_route(struct interface *iface, struct blob_attr *attr, bool v6) if ((cur = tb[ROUTE_MTU]) != NULL) route->mtu = blobmsg_get_u32(cur); - vlist_add(&ip->route, &route->node); + vlist_add(&ip->route, &route->node, &route->mask); return; error: @@ -420,8 +420,6 @@ interface_ip_init(struct interface_ip_settings *ip, struct interface *iface) ip->enabled = true; vlist_simple_init(&ip->dns_search, struct dns_search_domain, node); vlist_simple_init(&ip->dns_servers, struct dns_server, node); - vlist_init(&ip->route, route_cmp, interface_update_proto_route, - struct device_route, node, mask); - vlist_init(&ip->addr, addr_cmp, interface_update_proto_addr, - struct device_addr, node, mask); + vlist_init(&ip->route, route_cmp, interface_update_proto_route); + vlist_init(&ip->addr, addr_cmp, interface_update_proto_addr); } diff --git a/interface.c b/interface.c index 6e3feeb..4d9aa8a 100644 --- a/interface.c +++ b/interface.c @@ -349,7 +349,7 @@ interface_add(struct interface *iface, struct blob_attr *config) iface->ifname = blobmsg_data(cur); iface->config = config; - vlist_add(&interfaces, &iface->node); + vlist_add(&interfaces, &iface->node, iface->name); } int @@ -553,8 +553,7 @@ interface_update(struct vlist_tree *tree, struct vlist_node *node_new, static void __init interface_init_list(void) { - vlist_init(&interfaces, avl_strcmp, interface_update, - struct interface, node, name); + vlist_init(&interfaces, avl_strcmp, interface_update); interfaces.keep_old = true; interfaces.no_delete = true; } diff --git a/proto.c b/proto.c index 1747658..56870b1 100644 --- a/proto.c +++ b/proto.c @@ -142,7 +142,7 @@ parse_addr(struct interface *iface, const char *str, bool v6, int mask, if (ext) addr->flags |= DEVADDR_EXTERNAL; - vlist_add(&iface->proto_ip.addr, &addr->node); + vlist_add(&iface->proto_ip.addr, &addr->node, &addr->mask); return true; } @@ -184,7 +184,7 @@ parse_gateway_option(struct interface *iface, struct blob_attr *attr, bool v6) route->mask = 0; route->flags = DEVADDR_DEVICE | (v6 ? DEVADDR_INET6 : DEVADDR_INET4); - vlist_add(&iface->proto_ip.route, &route->node); + vlist_add(&iface->proto_ip.route, &route->node, &route->mask); return true; } diff --git a/utils.c b/utils.c index 0b13f86..629cdb2 100644 --- a/utils.c +++ b/utils.c @@ -9,10 +9,8 @@ avl_strcmp(const void *k1, const void *k2, void *ptr) } void -__vlist_init(struct vlist_tree *tree, avl_tree_comp cmp, - vlist_update_cb update, int offset) +vlist_init(struct vlist_tree *tree, avl_tree_comp cmp, vlist_update_cb update) { - tree->key_offset = offset; tree->update = update; tree->version = 1; @@ -28,11 +26,10 @@ vlist_delete(struct vlist_tree *tree, struct vlist_node *node) } void -vlist_add(struct vlist_tree *tree, struct vlist_node *node) +vlist_add(struct vlist_tree *tree, struct vlist_node *node, void *key) { struct vlist_node *old_node = NULL; struct avl_node *anode; - void *key = (char *) node + tree->key_offset; node->avl.key = key; node->version = tree->version; diff --git a/utils.h b/utils.h index 2866280..99b1c0d 100644 --- a/utils.h +++ b/utils.h @@ -26,7 +26,6 @@ struct vlist_tree { struct avl_tree avl; vlist_update_cb update; - int key_offset; bool keep_old; bool no_delete; @@ -38,10 +37,7 @@ struct vlist_node { int version; }; -void __vlist_init(struct vlist_tree *tree, avl_tree_comp cmp, vlist_update_cb update, int offset); - -#define vlist_init(tree, cmp, update, type, node, key) \ - __vlist_init(tree, cmp, update, offsetof(type, key) - offsetof(type, node)) +void vlist_init(struct vlist_tree *tree, avl_tree_comp cmp, vlist_update_cb update); #define vlist_find(tree, name, element, node_member) \ avl_find_element(&(tree)->avl, name, element, node_member.avl) @@ -51,7 +47,7 @@ static inline void vlist_update(struct vlist_tree *tree) tree->version++; } -void vlist_add(struct vlist_tree *tree, struct vlist_node *node); +void vlist_add(struct vlist_tree *tree, struct vlist_node *node, void *key); void vlist_delete(struct vlist_tree *tree, struct vlist_node *node); void vlist_flush(struct vlist_tree *tree); void vlist_flush_all(struct vlist_tree *tree);