From b9e2e0193bffc4d426fc8fa65e82e6ea36f997e9 Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Tue, 12 Jun 2012 15:56:23 +0200 Subject: pingu_host: bring interface down instantly if interface disapears We need execute the down hook in case interface goes down if we have gre tunnels bound to an interface. If for example ppp0 disapears (pppd restart) and comes back before pingu notices it, the gre interface will not be bound to anything. So we force the "down" event instantly if we detect that the iface is gone. --- pingu_host.c | 8 ++++++++ pingu_host.h | 1 + pingu_netlink.c | 1 + 3 files changed, 10 insertions(+) diff --git a/pingu_host.c b/pingu_host.c index be44343..f7695c4 100644 --- a/pingu_host.c +++ b/pingu_host.c @@ -139,6 +139,14 @@ int pingu_host_init(struct ev_loop *loop) return 0; } +void pingu_host_iface_deleted(struct pingu_iface *iface) +{ + struct pingu_host *host; + list_for_each_entry(host, &host_list, host_list_entry) + if (host->iface == iface) + pingu_host_set_status(host, 0); +} + void pingu_host_cleanup(void) { struct pingu_host *host, *n; diff --git a/pingu_host.h b/pingu_host.h index a1d4b38..4f4c341 100644 --- a/pingu_host.h +++ b/pingu_host.h @@ -39,6 +39,7 @@ int pingu_host_set_status(struct pingu_host *host, int status); int pingu_host_init(struct ev_loop *loop); int pingu_host_verify_status(struct ev_loop *loop, struct pingu_host *host); void pingu_host_dump_status(int fd, char *filter); +void pingu_host_iface_deleted(struct pingu_iface *iface); void pingu_host_cleanup(void); #endif diff --git a/pingu_netlink.c b/pingu_netlink.c index 1dec0c0..e3afbf6 100644 --- a/pingu_netlink.c +++ b/pingu_netlink.c @@ -560,6 +560,7 @@ static void netlink_link_del_cb(struct nlmsghdr *msg) log_info("Interface '%s' deleted", ifname); iface->index = 0; iface->has_link = 0; + pingu_host_iface_deleted(iface); } static void netlink_addr_new_cb(struct nlmsghdr *msg) -- cgit v1.2.3