36 memset(
static_cast<void *
>(&
_addr), 0,
sizeof(sockaddr_ll));
37 _addr.sll_family = AF_PACKET;
38 _addr.sll_protocol = htons(ETH_P_ALL);
39 _addr.sll_ifindex =
static_cast<int>(if_nametoindex(
_iFace.c_str()));
40 if (
_addr.sll_ifindex == 0)
42 throw std::ios_base::failure(std::string(
"Can't find interface: ") +
getErrnoString(errno));
47 memset(
static_cast<void *
>(&ifr), 0,
sizeof(ifreq));
48 const auto maxIfaceNameLen =
static_cast<size_t>(IFNAMSIZ - 1);
49 const size_t ifaceNameLen =
_iFace.size() < maxIfaceNameLen ?
_iFace.size() : maxIfaceNameLen;
50 auto *
const ifaceNameBegin = std::begin(ifr.ifr_name);
51 std::copy_n(
_iFace.begin(), ifaceNameLen, ifaceNameBegin);
52 *std::next(ifaceNameBegin,
static_cast<std::ptrdiff_t
>(ifaceNameLen)) =
'\0';
56 init(PF_PACKET, SOCK_RAW, IPPROTO_RAW);
57 if (setsockopt(
_sockFd, SOL_SOCKET, SO_BINDTODEVICE,
static_cast<void *
>(&ifr),
sizeof(ifr)) < 0)
59 throw std::ios_base::failure(std::string(
"Can't set socket options: ") +
getErrnoString(errno));
64 init(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));