From: Remi Gacogne Date: Wed, 30 Mar 2016 14:48:30 +0000 (+0200) Subject: protobuf: add an "originalRequestorSubnet" field X-Git-Tag: dnsdist-1.0.0-beta1~51^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e824728afec3dc996646db830153a768198fe919;p=pdns protobuf: add an "originalRequestorSubnet" field --- diff --git a/pdns/dnsmessage.proto b/pdns/dnsmessage.proto index dde51d0eb..a5edca63b 100644 --- a/pdns/dnsmessage.proto +++ b/pdns/dnsmessage.proto @@ -45,4 +45,5 @@ message PBDNSMessage { } optional DNSResponse response = 13; + optional bytes originalRequestorSubnet = 14; } diff --git a/pdns/pdns_recursor.cc b/pdns/pdns_recursor.cc index 1a5bd84ac..1b129ad85 100644 --- a/pdns/pdns_recursor.cc +++ b/pdns/pdns_recursor.cc @@ -199,6 +199,7 @@ struct DNSComboWriter { ComboAddress d_remote, d_local; #ifdef HAVE_PROTOBUF boost::uuids::uuid d_uuid; + Netmask ednssubnet; #endif bool d_tcp; int d_socket; @@ -629,6 +630,16 @@ static void protobufFillMessageFromDC(PBDNSMessage& message, const DNSComboWrite else if (dc->d_remote.sin4.sin_family == AF_INET6) { message.set_from(&dc->d_remote.sin6.sin6_addr.s6_addr, sizeof(dc->d_remote.sin6.sin6_addr.s6_addr)); } + if (!dc->ednssubnet.empty()) { + const ComboAddress ca = dc->ednssubnet.getNetwork(); + if (ca.sin4.sin_family == AF_INET) { + message.set_originalrequestorsubnet(&ca.sin4.sin_addr.s_addr, sizeof(ca.sin4.sin_addr.s_addr)); + } + else if (ca.sin4.sin_family == AF_INET6) { + message.set_originalrequestorsubnet(&ca.sin6.sin6_addr.s6_addr, sizeof(ca.sin6.sin6_addr.s6_addr)); + } + } + struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); message.set_timesec(ts.tv_sec); @@ -1316,6 +1327,7 @@ string* doProcessUDPQuestion(const std::string& question, const ComboAddress& fr string response; const struct dnsheader* dh = (struct dnsheader*)question.c_str(); unsigned int ctag=0; + Netmask ednssubnet; try { uint32_t age; #ifdef MALLOC_TRACE @@ -1334,7 +1346,6 @@ string* doProcessUDPQuestion(const std::string& question, const ComboAddress& fr uint16_t qtype=0; try { DNSName qname; - Netmask ednssubnet; getQNameAndSubnet(question, &qname, &qtype, &ednssubnet); @@ -1413,6 +1424,7 @@ string* doProcessUDPQuestion(const std::string& question, const ComboAddress& fr dc->d_tcp=false; #ifdef HAVE_PROTOBUF dc->d_uuid = (*t_uuidGenerator)(); + dc->ednssubnet = ednssubnet; #endif MT->makeThread(startDoResolve, (void*) dc); // deletes dc