serv.first = idx++;
}
*servers = std::make_shared<const ServerPolicy::NumberedServerVector>(std::move(newServers));
+
+ if ((*servers)->size() == 1) {
+ d_tcpOnly = server->isTCPOnly();
+ }
+ else if (d_tcpOnly && !server->isTCPOnly()) {
+ d_tcpOnly = false;
+ }
}
void ServerPool::removeServer(shared_ptr<DownstreamState>& server)
auto newServers = std::make_shared<ServerPolicy::NumberedServerVector>(*(*servers));
size_t idx = 1;
bool found = false;
+ bool tcpOnly = true;
for (auto it = newServers->begin(); it != newServers->end();) {
if (found) {
/* we need to renumber the servers placed
idx++;
it++;
}
+ tcpOnly = tcpOnly && it->second->isTCPOnly();
}
+ d_tcpOnly = tcpOnly;
*servers = std::move(newServers);
}
if (selectedBackend && selectedBackend->isTCPOnly()) {
willBeForwardedOverUDP = false;
}
+ else if (!selectedBackend) {
+ willBeForwardedOverUDP = !serverPool->isTCPOnly();
+ }
uint32_t allowExpired = selectedBackend ? 0 : dnsdist::configuration::getCurrentRuntimeConfiguration().d_staleCacheEntriesTTL;
const std::shared_ptr<const ServerPolicy::NumberedServerVector> getServers();
void addServer(shared_ptr<DownstreamState>& server);
void removeServer(shared_ptr<DownstreamState>& server);
+ bool isTCPOnly() const
+ {
+ return d_tcpOnly;
+ }
private:
SharedLockGuarded<std::shared_ptr<const ServerPolicy::NumberedServerVector>> d_servers;
bool d_useECS{false};
+ bool d_tcpOnly{false};
};
enum ednsHeaderFlags