From f65d5c0e147b43cf5133b126b03082078ba95bbe Mon Sep 17 00:00:00 2001 From: Daniel Adolfsson Date: Sun, 18 Sep 2011 01:51:47 +0200 Subject: [PATCH] Switch from setsockopt(SO_BINDTODEVICE) to bind() for _pfd --- src/iface.cc | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/iface.cc b/src/iface.cc index 07baf9a..070ea5d 100644 --- a/src/iface.cc +++ b/src/iface.cc @@ -98,13 +98,20 @@ strong_ptr iface::open_pfd(const std::string& name) // Bind to the specified interface. - struct ifreq ifr; + struct sockaddr_ll lladdr; - memset(&ifr, 0, sizeof(ifr)); - strncpy(ifr.ifr_name, name.c_str(), IFNAMSIZ - 1); - ifr.ifr_name[IFNAMSIZ - 1] = '\0'; + memset(&lladdr, 0, sizeof(struct sockaddr_ll)); + lladdr.sll_family = AF_PACKET; + lladdr.sll_protocol = htons(ETH_P_IPV6); - if(setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr)) < 0) + if(!(lladdr.sll_ifindex = if_nametoindex(name.c_str()))) + { + close(fd); + ERR("Failed to bind to interface '%s'", name.c_str()); + return strong_ptr(); + } + + if(bind(fd, (struct sockaddr *)&lladdr, sizeof(struct sockaddr_ll)) < 0) { close(fd); ERR("Failed to bind to interface '%s'", name.c_str());