summaryrefslogtreecommitdiffhomepage
path: root/interface-ip.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2011-09-07 14:37:18 +0200
committerFelix Fietkau <nbd@openwrt.org>2011-09-07 14:37:18 +0200
commit69b2dcb92b8402b9c6df4d6a041a890fe6468e18 (patch)
treec0acc6b30947ac7c8499d6d2f402abf837c9008c /interface-ip.c
parent3fa53680c85a6e029a3e7b4d673bffee4795fa52 (diff)
add code for versioned lists and use it to manage addresses and routes
Diffstat (limited to 'interface-ip.c')
-rw-r--r--interface-ip.c85
1 files changed, 41 insertions, 44 deletions
diff --git a/interface-ip.c b/interface-ip.c
index b86acb5..baa8b0e 100644
--- a/interface-ip.c
+++ b/interface-ip.c
@@ -10,63 +10,60 @@
#include "ubus.h"
#include "system.h"
-int interface_add_address(struct interface *iface, struct device_addr *addr)
+static void
+interface_update_proto_addr(struct vlist_tree *tree,
+ struct vlist_node *node_new,
+ struct vlist_node *node_old)
{
- int family;
+ struct interface *iface;
+ struct device *dev;
+ struct device_addr *addr;
- if (addr->flags & DEVADDR_INET6)
- family = AF_INET6;
- else
- family = AF_INET;
+ iface = container_of(tree, struct interface, proto_addr);
+ dev = iface->l3_iface->dev;
- list_add_tail(&addr->list, &iface->address);
- return system_add_address(iface->l3_iface->dev, addr);
-}
-
-void interface_del_address(struct interface *iface, struct device_addr *addr)
-{
- int family;
-
- if (addr->flags & DEVADDR_INET6)
- family = AF_INET6;
- else
- family = AF_INET;
+ if (node_old) {
+ addr = container_of(node_old, struct device_addr, node);
+ system_del_address(dev, addr);
+ free(addr);
+ }
- list_del(&addr->list);
- system_del_address(iface->l3_iface->dev, addr);
- free(addr);
+ if (node_new) {
+ addr = container_of(node_new, struct device_addr, node);
+ system_add_address(dev, addr);
+ }
}
-void interface_del_ctx_addr(struct interface *iface, void *ctx)
+static void
+interface_update_proto_route(struct vlist_tree *tree,
+ struct vlist_node *node_new,
+ struct vlist_node *node_old)
{
- struct device_addr *addr, *tmp;
+ struct interface *iface;
+ struct device *dev;
+ struct device_route *route;
- list_for_each_entry_safe(addr, tmp, &iface->address, list) {
- if (ctx && addr->ctx != ctx)
- continue;
+ iface = container_of(tree, struct interface, proto_route);
+ dev = iface->l3_iface->dev;
- interface_del_address(iface, addr);
+ if (node_old) {
+ route = container_of(node_old, struct device_route, node);
+ system_del_route(dev, route);
+ free(route);
}
-}
-int interface_add_route(struct interface *iface, struct device_route *route)
-{
- list_add_tail(&route->list, &iface->routes);
- return system_add_route(iface->l3_iface->dev, route);
+ if (node_new) {
+ route = container_of(node_new, struct device_route, node);
+ system_add_route(dev, route);
+ }
}
-void interface_del_route(struct interface *iface, struct device_route *route)
+void
+interface_ip_init(struct interface *iface)
{
- list_del(&route->list);
- system_del_route(iface->l3_iface->dev, route);
- if (!route->keep)
- free(route);
+ vlist_init(&iface->proto_route, interface_update_proto_route,
+ struct device_route, node, mask, addr);
+ vlist_init(&iface->proto_addr, interface_update_proto_addr,
+ struct device_addr, node, mask, addr);
}
-void interface_del_all_routes(struct interface *iface)
-{
- struct device_route *route, *tmp;
-
- list_for_each_entry_safe(route, tmp, &iface->routes, list)
- interface_del_route(iface, route);
-}