// 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) {
}
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) {
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));
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));
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());
}
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);
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
{