aboutsummaryrefslogtreecommitdiffstats
path: root/pingu_iface.c
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2011-07-13 20:57:12 +0200
committerNatanael Copa <ncopa@alpinelinux.org>2011-07-13 20:57:12 +0200
commit42409f7f228083dad788efd4ed3cc96d26712c6f (patch)
tree45e11b7c4bdb2a7df98fc1322f4ed977ad850d07 /pingu_iface.c
parent0a0ed0b5472cd19043799a9953ac06fd11ae7585 (diff)
downloadpingu-42409f7f228083dad788efd4ed3cc96d26712c6f.tar.bz2
pingu-42409f7f228083dad788efd4ed3cc96d26712c6f.tar.xz
pingu: try bind socket to interface every burst
It might be an interface that disappeared and came back, e.g ppp0. We also don't even try unless we have a successful binding.
Diffstat (limited to 'pingu_iface.c')
-rw-r--r--pingu_iface.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/pingu_iface.c b/pingu_iface.c
index 7b81e44..868c60e 100644
--- a/pingu_iface.c
+++ b/pingu_iface.c
@@ -27,11 +27,23 @@ static void pingu_iface_socket_cb(struct ev_loop *loop, struct ev_io *w,
if (revents & EV_READ)
pingu_ping_read_reply(loop, iface);
}
-
+
+int pingu_iface_bind_socket(struct pingu_iface *iface, int log_error)
+{
+ int r;
+ if (iface->name[0] == '\0')
+ return 0;
+ r = setsockopt(iface->fd, SOL_SOCKET, SO_BINDTODEVICE, iface->name,
+ strlen(iface->name));
+ if (r < 0 && log_error)
+ log_perror(iface->name);
+ iface->has_binding = (r == 0);
+ return r;
+}
+
static int pingu_iface_init_socket(struct ev_loop *loop,
struct pingu_iface *iface)
{
- int r;
iface->fd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (iface->fd < 0) {
log_perror("socket");
@@ -40,15 +52,7 @@ static int pingu_iface_init_socket(struct ev_loop *loop,
ev_io_init(&iface->socket_watcher, pingu_iface_socket_cb, iface->fd, EV_READ);
ev_io_start(loop, &iface->socket_watcher);
-
- if (iface->name[0] == '\0')
- return 0;
- r = setsockopt(iface->fd, SOL_SOCKET, SO_BINDTODEVICE, iface->name,
- strlen(iface->name));
- if (r < 0) {
- log_perror(iface->name);
- return -1;
- }
+ pingu_iface_bind_socket(iface, 1);
return 0;
}