Skip to content

Commit

Permalink
ifdown: flush addrs and routes on device-down (bnc#885236)
Browse files Browse the repository at this point in the history
  • Loading branch information
mtomaschewski committed Jul 22, 2014
1 parent 68deae9 commit b7d4db2
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 0 deletions.
44 changes: 44 additions & 0 deletions src/ifconfig.c
Expand Up @@ -141,6 +141,10 @@ ni_system_interface_link_change(ni_netdev_t *dev, const ni_netdev_req_t *ifp_req
ni_error("unable to shut down interface %s", dev->name);
return -1;
}

/* link is down, remove all addrs and routes */
__ni_system_interface_flush_addrs(NULL, dev);
__ni_system_interface_flush_routes(NULL, dev);
}

/* TODO: still needed? */
Expand All @@ -149,6 +153,46 @@ ni_system_interface_link_change(ni_netdev_t *dev, const ni_netdev_req_t *ifp_req
return 0;
}

int
__ni_system_interface_flush_addrs(ni_netconfig_t *nc, ni_netdev_t *dev)
{
ni_address_t *ap;

if (!dev || (!nc && !(nc = ni_global_state_handle(0))))
return -1;

/* TODO: ni_rtnl_query_addr_info + del without to parse */
__ni_system_refresh_interface_addrs(nc, dev);
for (ap = dev->addrs; ap; ap = ap->next) {
__ni_rtnl_send_deladdr(dev, ap);
}
__ni_system_refresh_interface_addrs(nc, dev);
return dev->addrs == NULL ? 0 : 1;
}

int
__ni_system_interface_flush_routes(ni_netconfig_t *nc, ni_netdev_t *dev)
{
ni_route_table_t *tab;
ni_route_t *rp;
unsigned int i;

if (!dev || (!nc && !(nc = ni_global_state_handle(0))))
return -1;

/* TODO: ni_rtnl_query_route_info + del without to parse */
__ni_system_refresh_interface_routes(nc, dev);
for (tab = dev->routes; tab; tab = tab->next) {
for (i = 0; i < tab->routes.count; ++i) {
if (!(rp = tab->routes.data[i]))
continue;
__ni_rtnl_send_delroute(dev, rp);
}
}
__ni_system_refresh_interface_routes(nc, dev);
return dev->routes == NULL ? 0 : 1;
}

int
ni_system_interface_link_monitor(ni_netdev_t *dev)
{
Expand Down
2 changes: 2 additions & 0 deletions src/netinfo_priv.h
Expand Up @@ -67,6 +67,8 @@ extern int __ni_device_refresh_ipv6_link_info(ni_netconfig_t *, ni_netdev_t *);
extern int __ni_system_interface_configure(ni_netconfig_t *, ni_netdev_t *, const ni_netdev_t *);
extern int __ni_system_interface_delete(ni_netconfig_t *, const char *);
extern int __ni_system_interface_stats_refresh(ni_netconfig_t *, ni_netdev_t *);
extern int __ni_system_interface_flush_addrs(ni_netconfig_t *, ni_netdev_t *);
extern int __ni_system_interface_flush_routes(ni_netconfig_t *, ni_netdev_t *);
extern int __ni_system_ethernet_refresh(ni_netdev_t *);
extern int __ni_system_ethernet_update(ni_netdev_t *, const ni_ethernet_t *);

Expand Down

0 comments on commit b7d4db2

Please sign in to comment.