34 memset(
static_cast<void *
>(&
_addr), 0,
sizeof(sockaddr_ll));
35 _addr.sll_family = AF_PACKET;
36 _addr.sll_protocol = htons(ETH_P_ALL);
37 _addr.sll_ifindex =
static_cast<int>(if_nametoindex(
_iFace.c_str()));
38 if (
_addr.sll_ifindex == 0)
40 throw std::ios_base::failure(std::string(
"Can't find interface: ") +
getErrnoString(errno));
45 memset(
static_cast<void *
>(&ifr), 0,
sizeof(ifreq));
46 memcpy(std::addressof(ifr.ifr_name),
_iFace.c_str(),
51 init(PF_PACKET, SOCK_RAW, IPPROTO_RAW);
52 if (setsockopt(
_sockFd, SOL_SOCKET, SO_BINDTODEVICE,
static_cast<void *
>(&ifr),
sizeof(ifr)) < 0)
54 throw std::ios_base::failure(std::string(
"Can't set socket options: ") +
getErrnoString(errno));
59 init(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
88 socklen_t socketLen =
sizeof(
_addr);
90 auto startTime = std::chrono::high_resolution_clock::now();
92 static_cast<int>(recvfrom(
_sockFd, data, dataLen, 0, std::bit_cast<sockaddr *>(&
_addr), &socketLen));
95 _stats.processingTime +=
static_cast<double>((std::chrono::high_resolution_clock::now() - startTime).count());
96 _stats.receivedBytes += dataLen;