aboutsummaryrefslogtreecommitdiffstats
path: root/pingu_iface.c
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2011-10-07 16:10:10 +0200
committerNatanael Copa <ncopa@alpinelinux.org>2011-10-07 16:10:10 +0200
commit2b4edba3ad8431f8bd8b7218e9f8a5a5e4ee18ac (patch)
tree6561f793b675ae209e6936d8bf9f25f5749df9d1 /pingu_iface.c
parentf8b192af8b6611c3832df3024cbabaafffb47591 (diff)
downloadpingu-2b4edba3ad8431f8bd8b7218e9f8a5a5e4ee18ac.tar.bz2
pingu-2b4edba3ad8431f8bd8b7218e9f8a5a5e4ee18ac.tar.xz
pingu_iface: support binding multiple ping hosts to same iface
Add config option for executing actions when interface gateway goes up/down. Add config option for required hosts up per interface (defaults to 1)
Diffstat (limited to 'pingu_iface.c')
-rw-r--r--pingu_iface.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/pingu_iface.c b/pingu_iface.c
index 5ae0317..820546d 100644
--- a/pingu_iface.c
+++ b/pingu_iface.c
@@ -145,7 +145,7 @@ void pingu_iface_set_balance(struct pingu_iface *iface, int balance_weight)
iface->balance = 1;
iface->balance_weight = balance_weight;
}
-
+
#if 0
void pingu_route_dump(struct pingu_iface *iface)
{
@@ -187,6 +187,40 @@ void pingu_iface_update_routes(struct pingu_iface *iface, int action)
kernel_route_multipath(RTM_NEWROUTE, &iface_list, RT_TABLE_MAIN);
}
+int pingu_iface_gw_is_online(struct pingu_iface *iface)
+{
+ return iface->hosts_online >= iface->required_hosts_online;
+}
+
+/* check if we should bring up/down this ISP */
+void pingu_iface_adjust_hosts_online(struct pingu_iface *iface, int adjustment)
+{
+ int old_status, new_status, route_action;
+ char *action, *statusstr;
+
+ old_status = pingu_iface_gw_is_online(iface);
+ iface->hosts_online += adjustment;
+ new_status = pingu_iface_gw_is_online(iface);
+
+ if (old_status == new_status)
+ return;
+
+ if (new_status) {
+ statusstr = "ONLINE";
+ route_action = RTM_NEWROUTE;
+ action = iface->gw_up_action;
+ } else {
+ statusstr = "OFFLINE";
+ route_action = RTM_DELROUTE;
+ action = iface->gw_down_action;
+ }
+
+ log_info("%s: went %s", iface->label ? iface->label : iface->name,
+ statusstr);
+ pingu_iface_update_routes(iface, route_action);
+ execute_action(action);
+}
+
int pingu_iface_set_route_table(struct pingu_iface *iface, int table)
{
static int initialized = 0;