aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2013-09-25 15:24:38 +0200
committerNatanael Copa <ncopa@alpinelinux.org>2013-09-25 15:24:38 +0200
commit42da579fbb7ccacf95491032847824e76e8cfb5a (patch)
tree63ce9d947c6db8a09fc5704fb14b98bf137977a0 /src
parent8f4d1086d4cd1e3196025f8a2c1586a4cf23ae6b (diff)
downloadpingu-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.c2
-rw-r--r--src/pingu_iface.c13
-rw-r--r--src/pingu_iface.h3
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