summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsomeone <sickmind@lavabit.com>2012-02-22 13:46:45 -0800
committerSam Roberts <vieuxtech@gmail.com>2012-03-01 08:48:37 -0800
commitf371f9f88b339090ce286e0d79bb5fac2e54219b (patch)
tree7ae375ac934ce081d46c6848a3ce29e24b3c1b3b
parent008de3721a3729f49e1bc7dd093bf925567aa64d (diff)
downloadlibnet-f371f9f88b339090ce286e0d79bb5fac2e54219b.tar.gz
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.
-rw-r--r--libnet/src/libnet_raw.c9
1 files changed, 8 insertions, 1 deletions
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);