diff options
author | someone <sickmind@lavabit.com> | 2012-02-22 13:46:45 -0800 |
---|---|---|
committer | Sam Roberts <vieuxtech@gmail.com> | 2012-03-01 08:48:37 -0800 |
commit | f371f9f88b339090ce286e0d79bb5fac2e54219b (patch) | |
tree | 7ae375ac934ce081d46c6848a3ce29e24b3c1b3b | |
parent | 008de3721a3729f49e1bc7dd093bf925567aa64d (diff) | |
download | libnet-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.c | 9 |
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); |