From d2cf915ff8f18b8a02323d9a78e8f07d94a6481e Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Wed, 7 Sep 2011 14:03:01 +0200 Subject: pingu_iface: cleanup load-balance route on exit --- pingu_iface.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'pingu_iface.c') diff --git a/pingu_iface.c b/pingu_iface.c index 6c5ae2e..60b9fa5 100644 --- a/pingu_iface.c +++ b/pingu_iface.c @@ -196,6 +196,17 @@ int pingu_iface_set_route_table(struct pingu_iface *iface, int table) return table; } +static int pingu_iface_count_balanced(void) +{ + struct pingu_iface *iface; + int count = 0; + list_for_each_entry(iface, &iface_list, iface_list_entry) { + if (iface->balance && (iface->index != 0) && !list_empty(&iface->gateway_list)) + count++; + } + return count; +} + int pingu_iface_init(struct ev_loop *loop) { struct pingu_iface *iface; @@ -211,9 +222,15 @@ int pingu_iface_init(struct ev_loop *loop) void pingu_iface_cleanup(void) { struct pingu_iface *iface; + /* remove loadbalance route */ + if (pingu_iface_count_balanced() > 1) { + int err = kernel_route_multipath(RTM_DELROUTE, &iface_list, RT_TABLE_MAIN); + if (err > 0) + log_error("Failed to delete load-balance route: %s", strerror(err)); + } + list_for_each_entry(iface, &iface_list, iface_list_entry) { - if (iface->has_route_rule) - kernel_cleanup_iface_routes(iface); + kernel_cleanup_iface_routes(iface); close(iface->fd); } } -- cgit v1.2.3