add support for externally managed ip addresses and routes
authorFelix Fietkau <nbd@openwrt.org>
Mon, 12 Sep 2011 09:50:03 +0000 (11:50 +0200)
committerFelix Fietkau <nbd@openwrt.org>
Mon, 12 Sep 2011 09:50:03 +0000 (11:50 +0200)
interface-ip.c
interface-ip.h

index e651d39..2e2e9d8 100644 (file)
@@ -24,13 +24,15 @@ interface_update_proto_addr(struct vlist_tree *tree,
 
        if (node_old) {
                addr = container_of(node_old, struct device_addr, node);
 
        if (node_old) {
                addr = container_of(node_old, struct device_addr, node);
-               system_del_address(dev, addr);
+               if (!(addr->flags & DEVADDR_EXTERNAL))
+                       system_del_address(dev, addr);
                free(addr);
        }
 
        if (node_new) {
                addr = container_of(node_new, struct device_addr, node);
                free(addr);
        }
 
        if (node_new) {
                addr = container_of(node_new, struct device_addr, node);
-               system_add_address(dev, addr);
+               if (!(addr->flags & DEVADDR_EXTERNAL))
+                       system_add_address(dev, addr);
        }
 }
 
        }
 }
 
@@ -48,13 +50,15 @@ interface_update_proto_route(struct vlist_tree *tree,
 
        if (node_old) {
                route = container_of(node_old, struct device_route, node);
 
        if (node_old) {
                route = container_of(node_old, struct device_route, node);
-               system_del_route(dev, route);
+               if (!(route->flags & DEVADDR_EXTERNAL))
+                       system_del_route(dev, route);
                free(route);
        }
 
        if (node_new) {
                route = container_of(node_new, struct device_route, node);
                free(route);
        }
 
        if (node_new) {
                route = container_of(node_new, struct device_route, node);
-               system_add_route(dev, route);
+               if (!(route->flags & DEVADDR_EXTERNAL))
+                       system_add_route(dev, route);
        }
 }
 
        }
 }
 
index 9266727..bf2cf73 100644 (file)
@@ -3,12 +3,15 @@
 
 enum device_addr_flags {
        /* address family for routes and addresses */
 
 enum device_addr_flags {
        /* address family for routes and addresses */
-       DEVADDR_INET4   = (0 << 0),
-       DEVADDR_INET6   = (1 << 0),
-       DEVADDR_FAMILY  = DEVADDR_INET4 | DEVADDR_INET6,
+       DEVADDR_INET4           = (0 << 0),
+       DEVADDR_INET6           = (1 << 0),
+       DEVADDR_FAMILY          = DEVADDR_INET4 | DEVADDR_INET6,
 
        /* device route (no gateway) */
 
        /* device route (no gateway) */
-       DEVADDR_DEVICE  = (1 << 1),
+       DEVADDR_DEVICE          = (1 << 1),
+
+       /* externally added address */
+       DEVADDR_EXTERNAL        = (1 << 2),
 };
 
 union if_addr {
 };
 
 union if_addr {