From: Remi Gacogne Date: Mon, 18 Sep 2023 12:22:07 +0000 (+0200) Subject: dnsdist: Small cleanup of the XSK code X-Git-Tag: dnsdist-1.9.0-rc1^2~40 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ce2e13280ae62de8f93602738bac12968ee313fa;p=thirdparty%2Fpdns.git dnsdist: Small cleanup of the XSK code --- diff --git a/pdns/dnsdist-lua-bindings.cc b/pdns/dnsdist-lua-bindings.cc index 6a3644d672..5a6d8f4e95 100644 --- a/pdns/dnsdist-lua-bindings.cc +++ b/pdns/dnsdist-lua-bindings.cc @@ -759,7 +759,7 @@ void setupLuaBindings(LuaContext& luaCtx, bool client, bool configCheck) } extern std::vector> g_xsk; auto socket = std::make_shared(frameNums, ifName, queue_id, path, poolName); - g_xsk.push_back(socket); + g_xsk.push_back(socket); return socket; }); luaCtx.registerFunction::*)()const>("getMetrics", [](const std::shared_ptr& xsk) { diff --git a/pdns/dnsdist.hh b/pdns/dnsdist.hh index 34d4600dac..9b5d33e38c 100644 --- a/pdns/dnsdist.hh +++ b/pdns/dnsdist.hh @@ -986,7 +986,7 @@ public: throw runtime_error("invalid source addr"); } xsk->addWorker(xskInfo, d_config.sourceAddr, getProtocol() != dnsdist::Protocol::DoUDP); - memcpy(d_config.sourceMACAddr, xsk->source, sizeof(MACAddr)); + d_config.sourceMACAddr = xsk->source; xskInfo->sharedEmptyFrameOffset = xsk->sharedEmptyFrameOffset; } #endif /* HAVE_XSK */ diff --git a/pdns/dnsdistdist/dnsdist-healthchecks.hh b/pdns/dnsdistdist/dnsdist-healthchecks.hh index 4f1940643e..2c5fc6015c 100644 --- a/pdns/dnsdistdist/dnsdist-healthchecks.hh +++ b/pdns/dnsdistdist/dnsdist-healthchecks.hh @@ -67,4 +67,3 @@ struct HealthCheckData PacketBuffer getHealthCheckPacket(const std::shared_ptr& ds, FDMultiplexer* mplexer, std::shared_ptr& data); void setHealthCheckTime(const std::shared_ptr& ds, const std::shared_ptr& data); bool handleResponse(std::shared_ptr& data); - diff --git a/pdns/iputils.hh b/pdns/iputils.hh index 7d8b2e4c2d..6bcac3256b 100644 --- a/pdns/iputils.hh +++ b/pdns/iputils.hh @@ -83,7 +83,6 @@ #undef IP_PKTINFO #endif -using MACAddr = uint8_t[6]; union ComboAddress { struct sockaddr_in sin4; struct sockaddr_in6 sin6; diff --git a/pdns/xsk.cc b/pdns/xsk.cc index f8c73d8c88..c57f97f367 100644 --- a/pdns/xsk.cc +++ b/pdns/xsk.cc @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -781,14 +782,22 @@ void XskWorker::notifyWorker() noexcept } void XskSocket::getMACFromIfName() { - ifreq ifr; - auto fd = ::socket(AF_INET, SOCK_DGRAM, 0); + ifreq ifr{}; + auto fd = FDWrapper(::socket(AF_INET, SOCK_DGRAM, 0)); + if (fd < 0) { + throw std::runtime_error("Error creating a socket to get the MAC address of interface " + ifName); + } + + if (ifName.size() >= IFNAMSIZ) { + throw std::runtime_error("Unable to get MAC address for interface " + ifName + ": name too long"); + } + strncpy(ifr.ifr_name, ifName.c_str(), ifName.length() + 1); - if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) { - throw runtime_error("Error getting MAC addr"); + if (ioctl(fd.getHandle(), SIOCGIFHWADDR, &ifr) < 0 || ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) { + throw std::runtime_error("Error getting MAC address for interface " + ifName); } - memcpy(source, ifr.ifr_hwaddr.sa_data, sizeof(source)); - close(fd); + static_assert(sizeof(ifr.ifr_hwaddr.sa_data) >= std::tuple_size{}, "The size of an ARPHRD_ETHER MAC address is smaller than expected"); + memcpy(source.data(), ifr.ifr_hwaddr.sa_data, source.size()); } [[nodiscard]] int XskSocket::timeDifference(const timespec& t1, const timespec& t2) noexcept { diff --git a/pdns/xsk.hh b/pdns/xsk.hh index 026417d6f3..b4e10c6eee 100644 --- a/pdns/xsk.hh +++ b/pdns/xsk.hh @@ -52,6 +52,8 @@ class XskPacket; class XskWorker; class XskSocket; +using MACAddr = std::array; + #ifdef HAVE_XSK using XskPacketPtr = std::unique_ptr;