aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pingu_conf.c10
-rw-r--r--pingu_iface.c30
-rw-r--r--pingu_iface.h2
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);