From f371f9f88b339090ce286e0d79bb5fac2e54219b Mon Sep 17 00:00:00 2001 From: someone Date: Wed, 22 Feb 2012 13:46:45 -0800 Subject: Use SO_BINDTODEVICE to force packets out opened device. SO_BINDTODEVICE is used because the kernel may send our packets to a wrong interface, especially those with link-local addresses. There is no such problem with ipv4 as far as I know. Also, use AF_INET6 instead of PF_INET6 becaue PF_ may not exist. --- libnet/src/libnet_raw.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/libnet/src/libnet_raw.c b/libnet/src/libnet_raw.c index f370139..93e4958 100644 --- a/libnet/src/libnet_raw.c +++ b/libnet/src/libnet_raw.c @@ -218,7 +218,7 @@ libnet_open_raw6(libnet_t *l) return (-1); } - l->fd = socket(PF_INET6, SOCK_RAW, IPPROTO_RAW); + l->fd = socket(AF_INET6, SOCK_RAW, IPPROTO_RAW); if (l->fd == -1) { snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, @@ -235,6 +235,13 @@ libnet_open_raw6(libnet_t *l) strerror(errno)); goto bad; } + if(l->device != NULL) + if(setsockopt(l->fd, SOL_SOCKET, SO_BINDTODEVICE, l->device, strlen(l->device)) == -1) { + snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, + "%s(): set SO_BINDTODEVICE failed: %s\n", __func__, strerror(errno)); + goto bad; + } + #endif /* __linux__ */ return (l->fd); -- cgit v1.2.1