diff options
-rw-r--r-- | pingu_burst.c | 7 | ||||
-rw-r--r-- | pingu_iface.c | 5 | ||||
-rw-r--r-- | pingu_iface.h | 3 | ||||
-rw-r--r-- | pingu_netlink.c | 2 |
4 files changed, 7 insertions, 10 deletions
diff --git a/pingu_burst.c b/pingu_burst.c index a9f8e83..60d30e4 100644 --- a/pingu_burst.c +++ b/pingu_burst.c @@ -19,13 +19,6 @@ void ping_burst_start(struct ev_loop *loop, struct pingu_host *host) int r; char buf[64]; - /* we bind to device every burst in case an iface disappears and - comes back. e.g ppp0 */ - if (pingu_iface_bind_socket(host->iface, host->status) < 0) { - pingu_host_set_status(host, 0); - return; - } - host->burst.active = 1; host->burst.pings_sent = 0; host->burst.pings_replied = 0; diff --git a/pingu_iface.c b/pingu_iface.c index 6905844..00cb1ca 100644 --- a/pingu_iface.c +++ b/pingu_iface.c @@ -67,7 +67,7 @@ int pingu_iface_usable(struct pingu_iface *iface) { if (iface->name[0] == '\0') return 1; - return iface->has_link && iface->has_binding; + return iface->has_link && iface->has_address && iface->has_binding; } struct pingu_iface *pingu_iface_get_by_name(const char *name) @@ -120,10 +120,13 @@ void pingu_iface_set_addr(struct pingu_iface *iface, int family, { sockaddr_init(&iface->primary_addr, family, data); if (len <= 0 || data == NULL) { + iface->has_address = 0; + iface->has_binding = 0; pingu_gateway_del_all(&iface->gateway_list); log_debug("%s: address removed", iface->name); return; } + iface->has_address = 1; log_debug("%s: new address: %s", iface->name, inet_ntoa(iface->primary_addr.sin.sin_addr)); } diff --git a/pingu_iface.h b/pingu_iface.h index 796d17a..5b09c7e 100644 --- a/pingu_iface.h +++ b/pingu_iface.h @@ -13,8 +13,9 @@ struct pingu_iface { char name[32]; int index; - int has_binding; int has_link; + int has_address; + int has_binding; int balance; int balance_weight; int fd; diff --git a/pingu_netlink.c b/pingu_netlink.c index de5a721..f3ca952 100644 --- a/pingu_netlink.c +++ b/pingu_netlink.c @@ -466,7 +466,6 @@ static void netlink_link_new_cb(struct nlmsghdr *msg) iface->index = ifi->ifi_index; iface->has_link = 1; - pingu_iface_bind_socket(iface, 1); } static void netlink_link_del_cb(struct nlmsghdr *msg) @@ -510,6 +509,7 @@ static void netlink_addr_new_cb(struct nlmsghdr *msg) pingu_iface_set_addr(iface, ifa->ifa_family, RTA_DATA(rta[IFA_LOCAL]), RTA_PAYLOAD(rta[IFA_LOCAL])); + pingu_iface_bind_socket(iface, 1); netlink_rule_replace_or_add(&talk_fd, iface); } |