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);
- system_add_address(dev, addr);
+ if (!(addr->flags & DEVADDR_EXTERNAL))
+ system_add_address(dev, addr);
}
}
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);
- system_add_route(dev, route);
+ if (!(route->flags & DEVADDR_EXTERNAL))
+ system_add_route(dev, route);
}
}
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) */
- DEVADDR_DEVICE = (1 << 1),
+ DEVADDR_DEVICE = (1 << 1),
+
+ /* externally added address */
+ DEVADDR_EXTERNAL = (1 << 2),
};
union if_addr {