aboutsummaryrefslogtreecommitdiffstats
path: root/src/pingu_iface.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pingu_iface.c')
-rw-r--r--src/pingu_iface.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/pingu_iface.c b/src/pingu_iface.c
index 815b1e9..62ef63a 100644
--- a/src/pingu_iface.c
+++ b/src/pingu_iface.c
@@ -183,7 +183,8 @@ void pingu_iface_gw_action(struct pingu_iface *iface,
* futher down the road.
*/
if (is_default_gw(gw) && !pingu_iface_gw_is_online(iface)) {
- pingu_iface_update_routes(iface, RTM_DELROUTE);
+ pingu_iface_update_routes(iface, RTM_DELROUTE,
+ load_balanced > 1);
/* avoid doing the multipath twice*/
return;
}
@@ -197,14 +198,15 @@ void pingu_iface_gw_action(struct pingu_iface *iface,
kernel_route_multipath(RTM_NEWROUTE, &iface_list, RT_TABLE_MAIN);
}
-void pingu_iface_update_routes(struct pingu_iface *iface, int action)
+void pingu_iface_update_routes(struct pingu_iface *iface, int action,
+ int do_multipath)
{
struct pingu_route *route;
list_for_each_entry(route, &iface->route_list, route_list_entry) {
if (is_default_gw(route) && iface->has_address)
kernel_route_modify(action, route, RT_TABLE_MAIN);
}
- if (load_balanced > 1)
+ if (do_multipath)
kernel_route_multipath(RTM_NEWROUTE, &iface_list, RT_TABLE_MAIN);
}
@@ -238,7 +240,7 @@ void pingu_iface_adjust_hosts_online(struct pingu_iface *iface, int adjustment)
log_info("%s: went %s", iface->label ? iface->label : iface->name,
statusstr);
- pingu_iface_update_routes(iface, route_action);
+ pingu_iface_update_routes(iface, route_action, load_balanced > 1);
execute_action(action);
}
@@ -326,6 +328,9 @@ void pingu_iface_cleanup(struct ev_loop *loop)
}
list_for_each_entry(iface, &iface_list, iface_list_entry) {
+ /* restore main route table */
+ if (!pingu_iface_gw_is_online(iface))
+ pingu_iface_update_routes(iface, RTM_NEWROUTE, 0);
kernel_cleanup_iface_routes(iface);
close(iface->fd);
}