summaryrefslogtreecommitdiffhomepage
path: root/interface-ip.c
diff options
context:
space:
mode:
Diffstat (limited to 'interface-ip.c')
-rw-r--r--interface-ip.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/interface-ip.c b/interface-ip.c
index 62d15fd..6659f8b 100644
--- a/interface-ip.c
+++ b/interface-ip.c
@@ -1154,9 +1154,11 @@ void interface_ip_set_enabled(struct interface_ip_settings *ip, bool enabled)
struct device_addr *addr;
struct device_route *route;
struct device *dev;
+ struct interface *iface;
ip->enabled = enabled;
- dev = ip->iface->l3_dev.dev;
+ iface = ip->iface;
+ dev = iface->l3_dev.dev;
if (!dev)
return;
@@ -1164,10 +1166,14 @@ void interface_ip_set_enabled(struct interface_ip_settings *ip, bool enabled)
if (addr->enabled == enabled)
continue;
- if (enabled)
+ if (enabled) {
system_add_address(dev, addr);
- else
+ if ((addr->flags & DEVADDR_OFFLINK) || iface->metric)
+ interface_handle_subnet_route(iface, addr, true);
+ } else {
+ interface_handle_subnet_route(iface, addr, false);
system_del_address(dev, addr);
+ }
addr->enabled = enabled;
}