]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Small cleanup of the XSK code
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 18 Sep 2023 12:22:07 +0000 (14:22 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 23 Jan 2024 11:54:17 +0000 (12:54 +0100)
pdns/dnsdist-lua-bindings.cc
pdns/dnsdist.hh
pdns/dnsdistdist/dnsdist-healthchecks.hh
pdns/iputils.hh
pdns/xsk.cc
pdns/xsk.hh

index 6a3644d672f0b6f05d983972aab810fa367f4e58..5a6d8f4e95d87fa18fcbecdae0712ca714288b86 100644 (file)
@@ -759,7 +759,7 @@ void setupLuaBindings(LuaContext& luaCtx, bool client, bool configCheck)
     }
     extern std::vector<std::shared_ptr<XskSocket>> g_xsk;
     auto socket = std::make_shared<XskSocket>(frameNums, ifName, queue_id, path, poolName);
-    g_xsk.push_back(socket); 
+    g_xsk.push_back(socket);
     return socket;
   });
   luaCtx.registerFunction<std::string(std::shared_ptr<XskSocket>::*)()const>("getMetrics", [](const std::shared_ptr<XskSocket>& xsk) {
index 34d4600dac1d0d91dcc66939ccdb8ad9147d4802..9b5d33e38c5958b01dcc1f094a5e21317a93d3da 100644 (file)
@@ -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 */
index 4f1940643e33da74c5a209e775fbc5952bf9a9b7..2c5fc6015c80ab7fc47fe5fcb6d309b255630888 100644 (file)
@@ -67,4 +67,3 @@ struct HealthCheckData
 PacketBuffer getHealthCheckPacket(const std::shared_ptr<DownstreamState>& ds, FDMultiplexer* mplexer, std::shared_ptr<HealthCheckData>& data);
 void setHealthCheckTime(const std::shared_ptr<DownstreamState>& ds, const std::shared_ptr<HealthCheckData>& data);
 bool handleResponse(std::shared_ptr<HealthCheckData>& data);
-
index 7d8b2e4c2d6ab27b152cef74604f45da93da7b12..6bcac3256bfb05a4d9672c7c1395fabb8964d295 100644 (file)
@@ -83,7 +83,6 @@
 #undef IP_PKTINFO
 #endif
 
-using MACAddr = uint8_t[6];
 union ComboAddress {
   struct sockaddr_in sin4;
   struct sockaddr_in6 sin6;
index f8c73d8c8815ba1611b25136913dedaa4c55f0b8..c57f97f3679e5f2238a714652f6e67d34f9aee92 100644 (file)
@@ -42,6 +42,7 @@
 #include <linux/tcp.h>
 #include <linux/udp.h>
 #include <net/if.h>
+#include <net/if_arp.h>
 #include <netinet/in.h>
 #include <poll.h>
 #include <stdexcept>
@@ -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<decltype(source)>{}, "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
 {
index 026417d6f34099f26cb7a8cd8706314c30083b7e..b4e10c6eeeffa014633dd1e0813363df80bc5580 100644 (file)
@@ -52,6 +52,8 @@ class XskPacket;
 class XskWorker;
 class XskSocket;
 
+using MACAddr = std::array<uint8_t,6>;
+
 #ifdef HAVE_XSK
 using XskPacketPtr = std::unique_ptr<XskPacket>;