From: Remi Gacogne Date: Fri, 7 Jun 2024 13:41:16 +0000 (+0200) Subject: dnsdist: Move the TCP Fast Open key to the new configuration X-Git-Tag: rec-5.2.0-alpha1~172^2~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b62bcf5e77bdddfca13c1415ecd034798cc73559;p=thirdparty%2Fpdns.git dnsdist: Move the TCP Fast Open key to the new configuration --- diff --git a/pdns/dnsdistdist/dnsdist-configuration.hh b/pdns/dnsdistdist/dnsdist-configuration.hh index 91e84a29c4..966665282f 100644 --- a/pdns/dnsdistdist/dnsdist-configuration.hh +++ b/pdns/dnsdistdist/dnsdist-configuration.hh @@ -155,6 +155,7 @@ static_assert(s_defaultPayloadSizeSelfGenAnswers < s_udpIncomingBufferSize, "The struct Configuration { std::set d_capabilitiesToRetain; + std::vector d_tcpFastOpenKey; ComboAddress d_consoleServerAddress{"127.0.0.1:5199"}; std::string d_consoleKey; #ifdef __linux__ diff --git a/pdns/dnsdistdist/dnsdist-lua.cc b/pdns/dnsdistdist/dnsdist-lua.cc index 7873ac27d6..9ccd829eae 100644 --- a/pdns/dnsdistdist/dnsdist-lua.cc +++ b/pdns/dnsdistdist/dnsdist-lua.cc @@ -2200,18 +2200,15 @@ static void setupLuaConfig(LuaContext& luaCtx, bool client, bool configCheck) }); luaCtx.writeFunction("setTCPFastOpenKey", [](const std::string& keyString) { - setLuaSideEffect(); - std::array key{}; - // NOLINTNEXTLINE(readability-container-data-pointer) - auto ret = sscanf(keyString.c_str(), "%" SCNx32 "-%" SCNx32 "-%" SCNx32 "-%" SCNx32, &key[0], &key[1], &key[2], &key[3]); - if (ret != 4) { + std::vector key(4); + auto ret = sscanf(keyString.c_str(), "%" SCNx32 "-%" SCNx32 "-%" SCNx32 "-%" SCNx32, &key.at(0), &key.at(1), &key.at(2), &key.at(3)); + if (ret < 0 || static_cast(ret) != key.size()) { g_outputBuffer = "Invalid value passed to setTCPFastOpenKey()!\n"; return; } - extern vector g_TCPFastOpenKey; - for (const auto byte : key) { - g_TCPFastOpenKey.push_back(byte); - } + dnsdist::configuration::updateImmutableConfiguration([&key](dnsdist::configuration::Configuration& config) { + config.d_tcpFastOpenKey = std::move(key); + }); }); #ifdef HAVE_NET_SNMP diff --git a/pdns/dnsdistdist/dnsdist.cc b/pdns/dnsdistdist/dnsdist.cc index 9024b16bc2..b70523bcae 100644 --- a/pdns/dnsdistdist/dnsdist.cc +++ b/pdns/dnsdistdist/dnsdist.cc @@ -105,7 +105,6 @@ shared_ptr g_defaultBPFFilter{nullptr}; std::vector> g_dynBPFFilters; std::vector> g_frontends; -std::vector g_TCPFastOpenKey; /* UDP: the grand design. Per socket we listen on for incoming queries there is one thread. Then we have a bunch of connected sockets for talking to downstream servers. We send directly to those sockets. @@ -2527,8 +2526,8 @@ static void setupLocalSocket(ClientState& clientState, const ComboAddress& addr, #ifdef TCP_FASTOPEN SSetsockopt(socket, IPPROTO_TCP, TCP_FASTOPEN, clientState.fastOpenQueueSize); #ifdef TCP_FASTOPEN_KEY - if (!g_TCPFastOpenKey.empty()) { - auto res = setsockopt(socket, IPPROTO_IP, TCP_FASTOPEN_KEY, g_TCPFastOpenKey.data(), g_TCPFastOpenKey.size() * sizeof(g_TCPFastOpenKey[0])); + if (!immutableConfig.d_tcpFastOpenKey.empty()) { + auto res = setsockopt(socket, IPPROTO_IP, TCP_FASTOPEN_KEY, immutableConfig.d_tcpFastOpenKey.data(), immutableConfig.d_tcpFastOpenKey.size() * sizeof(immutableConfig.d_tcpFastOpenKey.at(0))); if (res == -1) { throw runtime_error("setsockopt for level IPPROTO_TCP and opname TCP_FASTOPEN_KEY failed: " + stringerror()); }