aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pingu_burst.c7
-rw-r--r--pingu_iface.c5
-rw-r--r--pingu_iface.h3
-rw-r--r--pingu_netlink.c2
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);
}