diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2011-10-07 16:10:10 +0200 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2011-10-07 16:10:10 +0200 |
commit | 2b4edba3ad8431f8bd8b7218e9f8a5a5e4ee18ac (patch) | |
tree | 6561f793b675ae209e6936d8bf9f25f5749df9d1 /pingu_iface.c | |
parent | f8b192af8b6611c3832df3024cbabaafffb47591 (diff) | |
download | pingu-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.c | 36 |
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; |