aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pingu_iface.c21
1 files changed, 19 insertions, 2 deletions
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);
}
}