static DnstapMessage::ProtocolType ProtocolToDNSTap(dnsdist::Protocol protocol)
{
- DnstapMessage::ProtocolType result;
- switch (protocol) {
- default:
- case dnsdist::Protocol::DoUDP:
- case dnsdist::Protocol::DNSCryptUDP:
- result = DnstapMessage::ProtocolType::DoUDP;
- break;
- case dnsdist::Protocol::DoTCP:
- case dnsdist::Protocol::DNSCryptTCP:
- result = DnstapMessage::ProtocolType::DoTCP;
- break;
- case dnsdist::Protocol::DoT:
- result = DnstapMessage::ProtocolType::DoT;
- break;
- case dnsdist::Protocol::DoH:
- result = DnstapMessage::ProtocolType::DoH;
- break;
- }
- return result;
+ if (protocol == dnsdist::Protocol::DoUDP || protocol == dnsdist::Protocol::DNSCryptUDP) {
+ return DnstapMessage::ProtocolType::DoUDP;
+ }
+ else if (protocol == dnsdist::Protocol::DoTCP || protocol == dnsdist::Protocol::DNSCryptTCP) {
+ return DnstapMessage::ProtocolType::DoTCP;
+ }
+ else if (protocol == dnsdist::Protocol::DoT) {
+ return DnstapMessage::ProtocolType::DoT;
+ }
+ else if (protocol == dnsdist::Protocol::DoH) {
+ return DnstapMessage::ProtocolType::DoH;
+ }
+ throw std::runtime_error("Unhandled protocol for dnstap: " + protocol.toPrettyString());
}
class DnstapLogAction : public DNSAction, public boost::noncopyable
*/
#include <algorithm>
+#include <stdexcept>
#include "dnsdist-protocols.hh"
"DNS over TLS",
"DNS over HTTPS"};
-Protocol::Protocol(uint8_t protocol) :
+Protocol::Protocol(Protocol::typeenum protocol) :
d_protocol(protocol)
{
+ if (protocol >= names.size()) {
+ throw std::runtime_error("Unknown protocol: '" + std::to_string(protocol) + "'");
+ }
}
-Protocol& Protocol::operator=(const char* s)
-{
- std::string str(s);
- d_protocol = Protocol::fromString(str);
- return *this;
-}
-Protocol& Protocol::operator=(const std::string& s)
+Protocol::Protocol(const std::string& s)
{
- d_protocol = Protocol::fromString(s);
+ const auto& it = std::find(names.begin(), names.end(), s);
+ if (it == names.end()) {
+ throw std::runtime_error("Unknown protocol name: '" + s + "'");
+ }
- return *this;
+ auto index = std::distance(names.begin(), it);
+ d_protocol = static_cast<Protocol::typeenum>(index);
}
-Protocol::operator uint8_t() const
+
+bool Protocol::operator==(Protocol::typeenum type) const
{
- return d_protocol;
+ return d_protocol == type;
}
+
const std::string& Protocol::toString() const
{
- return names.at(static_cast<int>(d_protocol));
+ return names.at(static_cast<uint8_t>(d_protocol));
}
+
const std::string& Protocol::toPrettyString() const
{
- return prettyNames.at(static_cast<int>(d_protocol));
+ return prettyNames.at(static_cast<uint8_t>(d_protocol));
}
-uint8_t Protocol::fromString(const std::string& s)
-{
- const auto& it = std::find(names.begin(), names.end(), s);
- if (it != names.end()) {
- return std::distance(names.begin(), it);
- }
- return 0;
-}
}
class Protocol
{
public:
- Protocol(uint8_t protocol = 0);
- Protocol& operator=(const char*);
- Protocol& operator=(const std::string&);
- operator uint8_t() const;
- const std::string& toString() const;
- const std::string& toPrettyString() const;
-
enum typeenum : uint8_t
{
DoUDP,
DoH
};
+ Protocol(typeenum protocol = DoUDP);
+ explicit Protocol(const std::string& protocol);
+
+ bool operator==(typeenum) const;
+
+ const std::string& toString() const;
+ const std::string& toPrettyString() const;
+
private:
- static uint8_t fromString(const std::string& s);
- uint8_t d_protocol;
+ typeenum d_protocol;
};
}
ComboAddress from(parts.at(idx++));
ComboAddress to;
- dnsdist::Protocol protocol;
-
- protocol = parts.at(idx++);
+ dnsdist::Protocol protocol(parts.at(idx++));
if (isResponse) {
to = ComboAddress(parts.at(idx++));
}
uint16_t size;
uint16_t qtype;
// incoming protocol
- uint8_t protocol;
+ dnsdist::Protocol protocol;
};
struct Response
{
unsigned int size;
uint16_t qtype;
// outgoing protocol
- uint8_t protocol;
+ dnsdist::Protocol protocol;
};
struct Shard
return d_nbResponseEntries;
}
- void insertQuery(const struct timespec& when, const ComboAddress& requestor, const DNSName& name, uint16_t qtype, uint16_t size, const struct dnsheader& dh, uint8_t protocol)
+ void insertQuery(const struct timespec& when, const ComboAddress& requestor, const DNSName& name, uint16_t qtype, uint16_t size, const struct dnsheader& dh, dnsdist::Protocol protocol)
{
for (size_t idx = 0; idx < d_nbLockTries; idx++) {
auto& shard = getOneShard();
insertQueryLocked(*lock, when, requestor, name, qtype, size, dh, protocol);
}
- void insertResponse(const struct timespec& when, const ComboAddress& requestor, const DNSName& name, uint16_t qtype, unsigned int usec, unsigned int size, const struct dnsheader& dh, const ComboAddress& backend, uint8_t protocol)
+ void insertResponse(const struct timespec& when, const ComboAddress& requestor, const DNSName& name, uint16_t qtype, unsigned int usec, unsigned int size, const struct dnsheader& dh, const ComboAddress& backend, dnsdist::Protocol protocol)
{
for (size_t idx = 0; idx < d_nbLockTries; idx++) {
auto& shard = getOneShard();
return d_shards[getShardId()];
}
- void insertQueryLocked(boost::circular_buffer<Query>& ring, const struct timespec& when, const ComboAddress& requestor, const DNSName& name, uint16_t qtype, uint16_t size, const struct dnsheader& dh, uint8_t protocol)
+ void insertQueryLocked(boost::circular_buffer<Query>& ring, const struct timespec& when, const ComboAddress& requestor, const DNSName& name, uint16_t qtype, uint16_t size, const struct dnsheader& dh, dnsdist::Protocol protocol)
{
if (!ring.full()) {
d_nbQueryEntries++;
ring.push_back({requestor, name, when, dh, size, qtype, protocol});
}
- void insertResponseLocked(boost::circular_buffer<Response>& ring, const struct timespec& when, const ComboAddress& requestor, const DNSName& name, uint16_t qtype, unsigned int usec, unsigned int size, const struct dnsheader& dh, const ComboAddress& backend, uint8_t protocol)
+ void insertResponseLocked(boost::circular_buffer<Response>& ring, const struct timespec& when, const ComboAddress& requestor, const DNSName& name, uint16_t qtype, unsigned int usec, unsigned int size, const struct dnsheader& dh, const ComboAddress& backend, dnsdist::Protocol protocol)
{
if (!ring.full()) {
d_nbResponseEntries++;
(*state->mplexer.lock())->getAvailableFDs(ready, 1000);
}
-void handleResponseSent(const IDState& ids, double udiff, const ComboAddress& client, const ComboAddress& backend, unsigned int size, const dnsheader& cleartextDH, uint8_t protocol)
+void handleResponseSent(const IDState& ids, double udiff, const ComboAddress& client, const ComboAddress& backend, unsigned int size, const dnsheader& cleartextDH, dnsdist::Protocol protocol)
{
struct timespec ts;
gettime(&ts);
int pickBackendSocketForSending(std::shared_ptr<DownstreamState>& state);
ssize_t udpClientSendRequestToBackend(const std::shared_ptr<DownstreamState>& ss, const int sd, const PacketBuffer& request, bool healthCheck = false);
-void handleResponseSent(const IDState& ids, double udiff, const ComboAddress& client, const ComboAddress& backend, unsigned int size, const dnsheader& cleartextDH, uint8_t protocol);
+void handleResponseSent(const IDState& ids, double udiff, const ComboAddress& client, const ComboAddress& backend, unsigned int size, const dnsheader& cleartextDH, dnsdist::Protocol protocol);
void carbonDumpThread();
ComboAddress backend("192.0.2.42");
uint16_t qtype = QType::AAAA;
uint16_t size = 42;
- uint8_t protocol = dnsdist::Protocol::DoUDP;
- uint8_t outgoingProtocol = dnsdist::Protocol::DoUDP;
+ dnsdist::Protocol protocol = dnsdist::Protocol::DoUDP;
+ dnsdist::Protocol outgoingProtocol = dnsdist::Protocol::DoUDP;
unsigned int responseTime = 0;
struct timespec now;
gettime(&now);
ComboAddress backend("192.0.2.42");
uint16_t qtype = QType::AAAA;
uint16_t size = 42;
- uint8_t protocol = dnsdist::Protocol::DoUDP;
- uint8_t outgoingProtocol = dnsdist::Protocol::DoUDP;
+ dnsdist::Protocol protocol = dnsdist::Protocol::DoUDP;
+ dnsdist::Protocol outgoingProtocol = dnsdist::Protocol::DoUDP;
unsigned int responseTime = 0;
struct timespec now;
gettime(&now);
ComboAddress requestor2("192.0.2.2");
uint16_t qtype = QType::AAAA;
uint16_t size = 42;
- uint8_t protocol = dnsdist::Protocol::DoUDP;
+ dnsdist::Protocol protocol = dnsdist::Protocol::DoUDP;
struct timespec now;
gettime(&now);
NetmaskTree<DynBlock> emptyNMG;
ComboAddress backend("192.0.2.42");
uint16_t qtype = QType::AAAA;
uint16_t size = 42;
- uint8_t outgoingProtocol = dnsdist::Protocol::DoUDP;
+ dnsdist::Protocol outgoingProtocol = dnsdist::Protocol::DoUDP;
unsigned int responseTime = 100 * 1000; /* 100ms */
struct timespec now;
gettime(&now);
ComboAddress backend("192.0.2.42");
uint16_t qtype = QType::AAAA;
uint16_t size = 42;
- uint8_t outgoingProtocol = dnsdist::Protocol::DoUDP;
+ dnsdist::Protocol outgoingProtocol = dnsdist::Protocol::DoUDP;
unsigned int responseTime = 100 * 1000; /* 100ms */
struct timespec now;
gettime(&now);
ComboAddress backend("192.0.2.42");
uint16_t qtype = QType::AAAA;
uint16_t size = 100;
- uint8_t outgoingProtocol = dnsdist::Protocol::DoUDP;
+ dnsdist::Protocol outgoingProtocol = dnsdist::Protocol::DoUDP;
unsigned int responseTime = 100 * 1000; /* 100ms */
struct timespec now;
gettime(&now);
ComboAddress requestor2("192.0.2.2");
uint16_t qtype = QType::AAAA;
uint16_t size = 42;
- uint8_t protocol = dnsdist::Protocol::DoUDP;
+ dnsdist::Protocol protocol = dnsdist::Protocol::DoUDP;
struct timespec now;
gettime(&now);
NetmaskTree<DynBlock> emptyNMG;
ComboAddress requestor2("192.0.2.42");
uint16_t qtype = QType::AAAA;
uint16_t size = 42;
- uint8_t protocol = dnsdist::Protocol::DoUDP;
+ dnsdist::Protocol protocol = dnsdist::Protocol::DoUDP;
struct timespec now;
gettime(&now);
NetmaskTree<DynBlock> emptyNMG;
DNSName qname("rings.powerdns.com.");
uint16_t qtype = QType::AAAA;
uint16_t size = 42;
- uint8_t protocol = dnsdist::Protocol::DoUDP;
- uint8_t outgoingProtocol = dnsdist::Protocol::DoUDP;
+ dnsdist::Protocol protocol = dnsdist::Protocol::DoUDP;
+ dnsdist::Protocol outgoingProtocol = dnsdist::Protocol::DoUDP;
struct timespec now;
gettime(&now);
NetmaskTree<DynBlock> emptyNMG;
ComboAddress requestor2("192.0.2.2");
uint16_t qtype = QType::AAAA;
uint16_t size = 42;
- uint8_t protocol = dnsdist::Protocol::DoUDP;
- uint8_t outgoingProtocol = dnsdist::Protocol::DoUDP;
+ dnsdist::Protocol protocol = dnsdist::Protocol::DoUDP;
+ dnsdist::Protocol outgoingProtocol = dnsdist::Protocol::DoUDP;
struct timespec now;
gettime(&now);
unsigned int latency = 100;
uint16_t qtype = QType::AAAA;
uint16_t size = 42;
- uint8_t protocol = dnsdist::Protocol::DoUDP;
- uint8_t outgoingProtocol = dnsdist::Protocol::DoUDP;
+ dnsdist::Protocol protocol = dnsdist::Protocol::DoUDP;
+ dnsdist::Protocol outgoingProtocol = dnsdist::Protocol::DoUDP;
Rings rings(numberOfEntries, numberOfShards, lockAttempts, true);
Rings::Query query({requestor, qname, now, dh, size, qtype, protocol});
return 0;
}
-void handleResponseSent(const IDState& ids, double udiff, const ComboAddress& client, const ComboAddress& backend, unsigned int size, const dnsheader& cleartextDH, uint8_t protocol)
+void handleResponseSent(const IDState& ids, double udiff, const ComboAddress& client, const ComboAddress& backend, unsigned int size, const dnsheader& cleartextDH, dnsdist::Protocol protocol)
{
}