diff options
-rw-r--r-- | pingu_conf.c | 10 | ||||
-rw-r--r-- | pingu_iface.c | 30 | ||||
-rw-r--r-- | pingu_iface.h | 2 |
3 files changed, 22 insertions, 20 deletions
diff --git a/pingu_conf.c b/pingu_conf.c index 9a63aaf..30dec9a 100644 --- a/pingu_conf.c +++ b/pingu_conf.c @@ -131,16 +131,16 @@ static int pingu_conf_read_iface(struct pingu_conf *conf, char *ifname) if (strcmp(key, "route-table") == 0) { pingu_iface_set_route_table(iface, atoi(value)); } else if (strcmp(key, "load-balance") == 0) { - iface->balance = 1; + int weight = 0; if (value != NULL) { - iface->balance_weight = atoi(value); - if (iface->balance_weight <= 0 || iface->balance_weight > 256) { + weight = atoi(value); + if (weight <= 0 || weight > 256) { log_error("Invalid load-balance weight %i on line %i", - iface->balance_weight, - conf->lineno); + weight, conf->lineno); return -1; } } + pingu_iface_set_balance(iface, weight); } else { log_error("Unknown keyword '%s' on line %i", key, conf->lineno); diff --git a/pingu_iface.c b/pingu_iface.c index c7388b0..6816041 100644 --- a/pingu_iface.c +++ b/pingu_iface.c @@ -26,6 +26,9 @@ static struct list_head iface_list = LIST_INITIALIZER(iface_list); #define PINGU_ROUTE_TABLE_MAX 253 unsigned char used_route_table[256]; +/* do we have any load-balance at all? */ +static int load_balanced = 0; + static void pingu_iface_socket_cb(struct ev_loop *loop, struct ev_io *w, int revents) { @@ -136,6 +139,13 @@ void pingu_iface_set_addr(struct pingu_iface *iface, int family, inet_ntoa(iface->primary_addr.sin.sin_addr)); } +void pingu_iface_set_balance(struct pingu_iface *iface, int balance_weight) +{ + load_balanced++; + iface->balance = 1; + iface->balance_weight = balance_weight; +} + #if 0 void pingu_gateway_dump(struct pingu_iface *iface) { @@ -162,7 +172,7 @@ void pingu_iface_gw_action(struct pingu_iface *iface, log_debug("%s: removed route", iface->name); break; } - if (is_default_gw(gw)) + if (load_balanced > 1 && is_default_gw(gw)) kernel_route_multipath(RTM_NEWROUTE, &iface_list, RT_TABLE_MAIN); } @@ -173,7 +183,8 @@ void pingu_iface_update_routes(struct pingu_iface *iface, int action) if (is_default_gw(route) && iface->has_address) kernel_route_modify(action, route, iface, RT_TABLE_MAIN); } - kernel_route_multipath(RTM_NEWROUTE, &iface_list, RT_TABLE_MAIN); + if (load_balanced > 1) + kernel_route_multipath(RTM_NEWROUTE, &iface_list, RT_TABLE_MAIN); } int pingu_iface_set_route_table(struct pingu_iface *iface, int table) @@ -198,17 +209,6 @@ 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; @@ -218,6 +218,8 @@ int pingu_iface_init(struct ev_loop *loop) if (pingu_iface_init_socket(loop, iface) == -1) return -1; } + if (load_balanced == 1) + log_warning("Only a single interface was configured with load-balance"); return 0; } @@ -225,7 +227,7 @@ void pingu_iface_cleanup(void) { struct pingu_iface *iface; /* remove loadbalance route */ - if (pingu_iface_count_balanced() > 1) { + if (load_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)); diff --git a/pingu_iface.h b/pingu_iface.h index 7d3ad4c..53e240e 100644 --- a/pingu_iface.h +++ b/pingu_iface.h @@ -36,10 +36,10 @@ int pingu_iface_bind_socket(struct pingu_iface *iface, int log_error); int pingu_iface_usable(struct pingu_iface *iface); int pingu_iface_init(struct ev_loop *loop); +void pingu_iface_set_balance(struct pingu_iface *iface, int balance_weight); void pingu_iface_set_addr(struct pingu_iface *iface, int family, void *data, int len); int pingu_iface_set_route_table(struct pingu_iface *iface, int table); - void pingu_iface_gw_action(struct pingu_iface *iface, struct pingu_gateway *gw, int action); void pingu_iface_update_routes(struct pingu_iface *iface, int action); |