From: slowr Date: Fri, 4 Jun 2021 18:46:21 +0000 (+0200) Subject: poc for making dnsdist ixfr-axfr aware X-Git-Tag: dnsdist-1.7.0-alpha1~124^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=078c474d31cf5e13a1278ff9cef7909592fd723e;p=thirdparty%2Fpdns.git poc for making dnsdist ixfr-axfr aware --- diff --git a/pdns/dnsdist-tcp.cc b/pdns/dnsdist-tcp.cc index aa27cb2a51..69ecb90b43 100644 --- a/pdns/dnsdist-tcp.cc +++ b/pdns/dnsdist-tcp.cc @@ -435,6 +435,9 @@ void IncomingTCPConnectionState::resetForNewQuery() d_buffer.resize(sizeof(uint16_t)); d_currentPos = 0; d_querySize = 0; + d_xfrMasterSerial = 0; + d_xfrSerialCount = 0; + d_xfrMasterSerialCount = 0; d_state = State::waitingForQuery; } diff --git a/pdns/dnsdistdist/dnsdist-tcp-downstream.cc b/pdns/dnsdistdist/dnsdist-tcp-downstream.cc index 94387e53b9..f6163439ae 100644 --- a/pdns/dnsdistdist/dnsdist-tcp-downstream.cc +++ b/pdns/dnsdistdist/dnsdist-tcp-downstream.cc @@ -501,7 +501,24 @@ IOState TCPConnectionToBackend::handleResponse(std::shared_ptrgetRawContent(); auto serial = getSerialFromRawSOAContent(raw); - cerr << "Got serial: " << serial << endl; + + ++d_clientConn->d_xfrSerialCount; + if (d_clientConn->d_xfrMasterSerial == 0) { + // store the first SOA in our client's connection metadata + ++d_clientConn->d_xfrMasterSerialCount; + d_clientConn->d_xfrMasterSerial = serial; + } else if (d_clientConn->d_xfrMasterSerial == serial) { + ++d_clientConn->d_xfrMasterSerialCount; + // figure out if it's end when receiving master's SOA again + if (d_clientConn->d_xfrSerialCount == 2) { + // if there are only two SOA records marks a finished AXFR + done = true; + } + if (d_clientConn->d_xfrMasterSerialCount == 3) { + // receiving master's SOA 3 times marks a finished IXFR + done = true; + } + } } } } diff --git a/pdns/dnsdistdist/dnsdist-tcp-upstream.hh b/pdns/dnsdistdist/dnsdist-tcp-upstream.hh index ae971b070e..b54b3eb630 100644 --- a/pdns/dnsdistdist/dnsdist-tcp-upstream.hh +++ b/pdns/dnsdistdist/dnsdist-tcp-upstream.hh @@ -209,4 +209,7 @@ public: bool d_proxyProtocolPayloadHasTLV{false}; bool d_lastIOBlocked{false}; bool d_hadErrors{false}; + uint32_t d_xfrMasterSerial{0}; + uint32_t d_xfrSerialCount{0}; + uint8_t d_xfrMasterSerialCount{0}; };