]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Log whether we are using XSK, and which mode (native or emulated)
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 19 Jan 2024 08:53:48 +0000 (09:53 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 23 Jan 2024 11:54:28 +0000 (12:54 +0100)
pdns/dnsdist-lua.cc
pdns/dnsdist.cc
pdns/xsk.cc
pdns/xsk.hh

index 724af95c67c87b53a657d992d4de64e612799fe6..8d931a4c1fe3ebd4da9fa6e130284c85090aa4a6 100644 (file)
@@ -630,9 +630,6 @@ static void setupLuaConfig(LuaContext& luaCtx, bool client, bool configCheck)
 
                          // create but don't connect the socket in client or check-config modes
                          auto ret = std::make_shared<DownstreamState>(std::move(config), std::move(tlsCtx), !(client || configCheck));
-                         if (!(client || configCheck)) {
-                           infolog("Added downstream server %s", ret->d_config.remote.toStringWithPort());
-                         }
 #ifdef HAVE_XSK
                          std::shared_ptr<XskSocket> xskSocket;
                          if (getOptionalValue<std::shared_ptr<XskSocket>>(vars, "xskSocket", xskSocket) > 0) {
@@ -652,6 +649,14 @@ static void setupLuaConfig(LuaContext& luaCtx, bool client, bool configCheck)
                              }
                              memcpy(ret->d_config.destMACAddr.data(), mac.data(), ret->d_config.destMACAddr.size());
                            }
+                           infolog("Added downstream server %s via XSK in %s mode", ret->d_config.remote.toStringWithPort(), xskSocket->getXDPMode());
+                         }
+                         else if (!(client || configCheck)) {
+                           infolog("Added downstream server %s", ret->d_config.remote.toStringWithPort());
+                         }
+#else /* HAVE_XSK */
+                         if (!(client || configCheck)) {
+                           infolog("Added downstream server %s", ret->d_config.remote.toStringWithPort());
                          }
 #endif /* HAVE_XSK */
                          if (autoUpgrade && ret->getProtocol() != dnsdist::Protocol::DoT && ret->getProtocol() != dnsdist::Protocol::DoH) {
@@ -794,6 +799,7 @@ static void setupLuaConfig(LuaContext& luaCtx, bool client, bool configCheck)
         udpCS->xskInfo->sharedEmptyFrameOffset = socket->sharedEmptyFrameOffset;
         socket->addWorker(udpCS->xskInfo);
         socket->addWorkerRoute(udpCS->xskInfo, loc);
+        vinfolog("Enabling XSK in %s mode for incoming UDP packets to %s", socket->getXDPMode(), loc.toStringWithPort());
       }
 #endif /* HAVE_XSK */
       g_frontends.push_back(std::move(udpCS));
@@ -847,6 +853,7 @@ static void setupLuaConfig(LuaContext& luaCtx, bool client, bool configCheck)
         udpCS->xskInfo->sharedEmptyFrameOffset = socket->sharedEmptyFrameOffset;
         socket->addWorker(udpCS->xskInfo);
         socket->addWorkerRoute(udpCS->xskInfo, loc);
+        vinfolog("Enabling XSK in %s mode for incoming UDP packets to %s", socket->getXDPMode(), loc.toStringWithPort());
       }
 #endif /* HAVE_XSK */
       g_frontends.push_back(std::move(udpCS));
index f58442b034daf9d0c3c3b8ca529f13a22f7d6193..6f4bca6c6804d18cf6ea69813d7c25454bf6c11b 100644 (file)
@@ -2624,6 +2624,11 @@ static void setupLocalSocket(ClientState& clientState, const ComboAddress& addr,
     else if (clientState.dnscryptCtx != nullptr) {
       infolog("Listening on %s for DNSCrypt", addr.toStringWithPort());
     }
+#ifdef HAVE_XSK
+    else if (clientState.xskInfo != nullptr) {
+      infolog("Listening on %s (XSK-enabled)", addr.toStringWithPort());
+    }
+#endif
     else {
       infolog("Listening on %s", addr.toStringWithPort());
     }
index 3c4f8d3b7b22d5b3e48be2083ff8df9177235bc3..0eaf08110614d53bff7c56d78d9251f9d6f3543c 100644 (file)
@@ -470,6 +470,28 @@ std::string XskSocket::getMetrics() const
   return ret.str();
 }
 
+[[nodiscard]] std::string XskSocket::getXDPMode() const
+{
+  unsigned int itfIdx = if_nametoindex(ifName.c_str());
+  if (itfIdx == 0) {
+    return {};
+  }
+  struct bpf_xdp_query_opts info = { .sz = sizeof(info) };
+  int ret = bpf_xdp_query(itfIdx, 0, &info);
+  if (ret != 0) {
+    return {};
+  }
+  switch (info.attach_mode) {
+  case XDP_ATTACHED_DRV:
+  case XDP_ATTACHED_HW:
+    return "native";
+  case XDP_ATTACHED_SKB:
+    return "emulated";
+  default:
+    return "unknown";
+  }
+}
+
 void XskSocket::markAsFree(const XskPacket& packet)
 {
   auto offset = frameOffset(packet);
index 4ea36e38b36af5bddaef6c670bb37bb5672ccdc8..3b16717989f9c4f36897cb58663f89345219ece9 100644 (file)
@@ -148,6 +148,7 @@ public:
   void addWorkerRoute(const std::shared_ptr<XskWorker>& worker, const ComboAddress& dest);
   void removeWorkerRoute(const ComboAddress& dest);
   [[nodiscard]] std::string getMetrics() const;
+  [[nodiscard]] std::string getXDPMode() const;
   void markAsFree(const XskPacket& packet);
   [[nodiscard]] const std::shared_ptr<XskWorker>& getWorkerByDescriptor(int desc) const
   {