diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2013-09-25 15:24:38 +0200 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2013-09-25 15:24:38 +0200 |
commit | 42da579fbb7ccacf95491032847824e76e8cfb5a (patch) | |
tree | 63ce9d947c6db8a09fc5704fb14b98bf137977a0 /src | |
parent | 8f4d1086d4cd1e3196025f8a2c1586a4cf23ae6b (diff) | |
download | pingu-42da579fbb7ccacf95491032847824e76e8cfb5a.tar.bz2 pingu-42da579fbb7ccacf95491032847824e76e8cfb5a.tar.xz |
pingu_iface: restore routes for offline ISPs on exit
When we exit we should restore main route table to its original state.
Diffstat (limited to 'src')
-rw-r--r-- | src/pingu.c | 2 | ||||
-rw-r--r-- | src/pingu_iface.c | 13 | ||||
-rw-r--r-- | src/pingu_iface.h | 3 |
3 files changed, 12 insertions, 6 deletions
diff --git a/src/pingu.c b/src/pingu.c index badd735..cfb3739 100644 --- a/src/pingu.c +++ b/src/pingu.c @@ -45,7 +45,7 @@ int usage(const char *program) "options:\n" " -a Use administration socket ADMSOCKET (default is " DEFAULT_ADM_SOCKET ")\n" - " -c Read configuration from CONFIG (default is " + " -c Read configuration from CONFIG (default is " DEFAULT_CONFIG ")\n" " -d Fork to background (damonize)\n" " -h Show this help\n" diff --git a/src/pingu_iface.c b/src/pingu_iface.c index 815b1e9..62ef63a 100644 --- a/src/pingu_iface.c +++ b/src/pingu_iface.c @@ -183,7 +183,8 @@ void pingu_iface_gw_action(struct pingu_iface *iface, * futher down the road. */ if (is_default_gw(gw) && !pingu_iface_gw_is_online(iface)) { - pingu_iface_update_routes(iface, RTM_DELROUTE); + pingu_iface_update_routes(iface, RTM_DELROUTE, + load_balanced > 1); /* avoid doing the multipath twice*/ return; } @@ -197,14 +198,15 @@ void pingu_iface_gw_action(struct pingu_iface *iface, kernel_route_multipath(RTM_NEWROUTE, &iface_list, RT_TABLE_MAIN); } -void pingu_iface_update_routes(struct pingu_iface *iface, int action) +void pingu_iface_update_routes(struct pingu_iface *iface, int action, + int do_multipath) { struct pingu_route *route; list_for_each_entry(route, &iface->route_list, route_list_entry) { if (is_default_gw(route) && iface->has_address) kernel_route_modify(action, route, RT_TABLE_MAIN); } - if (load_balanced > 1) + if (do_multipath) kernel_route_multipath(RTM_NEWROUTE, &iface_list, RT_TABLE_MAIN); } @@ -238,7 +240,7 @@ void pingu_iface_adjust_hosts_online(struct pingu_iface *iface, int adjustment) log_info("%s: went %s", iface->label ? iface->label : iface->name, statusstr); - pingu_iface_update_routes(iface, route_action); + pingu_iface_update_routes(iface, route_action, load_balanced > 1); execute_action(action); } @@ -326,6 +328,9 @@ void pingu_iface_cleanup(struct ev_loop *loop) } list_for_each_entry(iface, &iface_list, iface_list_entry) { + /* restore main route table */ + if (!pingu_iface_gw_is_online(iface)) + pingu_iface_update_routes(iface, RTM_NEWROUTE, 0); kernel_cleanup_iface_routes(iface); close(iface->fd); } diff --git a/src/pingu_iface.h b/src/pingu_iface.h index cab98fd..1a83622 100644 --- a/src/pingu_iface.h +++ b/src/pingu_iface.h @@ -57,6 +57,7 @@ void pingu_iface_gw_action(struct pingu_iface *iface, void pingu_iface_dump_status(int fd, char *filter); void pingu_iface_dump_pings(int fd, char *filter); void pingu_iface_dump_routes(int fd, char *filter); -void pingu_iface_update_routes(struct pingu_iface *iface, int action); +void pingu_iface_update_routes(struct pingu_iface *iface, int action, + int do_multipath); void pingu_iface_cleanup(struct ev_loop *loop); #endif |