diff --git a/ChangeLog b/ChangeLog index 2a48f63af4..e918c15347 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,6 @@ xxx. [bug] dvv - resolver: EDNS fallback on FORMERR + resolver: If an upstream server responds with FORMERR to an EDNS query, + try querying it without EDNS. (Trac #1386, git TBD) 342. [bug] stephen diff --git a/src/lib/resolve/recursive_query.cc b/src/lib/resolve/recursive_query.cc index 3b339436ba..a00f17fc34 100644 --- a/src/lib/resolve/recursive_query.cc +++ b/src/lib/resolve/recursive_query.cc @@ -558,11 +558,9 @@ private: // see if it's a FORMERR and a potential EDNS problem if (incoming.getRcode() == Rcode::FORMERR()) { if (protocol_ == IOFetch::UDP && edns_) { - // try EDNS over TCP - send(IOFetch::TCP, true); - return (false); - } else if (protocol_ == IOFetch::TCP && edns_) { - // try UDP, no EDNS + // TODO: in case we absolutely need EDNS (i.e. for DNSSEC + // aware queries), we might want to try TCP before we give + // up. For now, just try UDP, no EDNS send(IOFetch::UDP, false); return (false); } diff --git a/src/lib/resolve/tests/recursive_query_unittest_3.cc b/src/lib/resolve/tests/recursive_query_unittest_3.cc index bcf472cdee..3602b03744 100644 --- a/src/lib/resolve/tests/recursive_query_unittest_3.cc +++ b/src/lib/resolve/tests/recursive_query_unittest_3.cc @@ -101,8 +101,7 @@ public: enum QueryStatus { NONE = 0, ///< Default EDNS_UDP = 1, ///< EDNS query over UDP - EDNS_TCP = 2, ///< EDNS query over TCP - NON_EDNS_UDP = 3, ///< Non-EDNS query over UDP + NON_EDNS_UDP = 2, ///< Non-EDNS query over UDP COMPLETE = 6 ///< Query is complete }; @@ -225,7 +224,7 @@ public: EXPECT_TRUE(query.getEDNS()); // Return FORMERROR setFORMERR(message); - expected_ = EDNS_TCP; + expected_ = NON_EDNS_UDP; break; case NON_EDNS_UDP: @@ -346,14 +345,7 @@ public: // Set up state-dependent bits: switch (expected_) { - case EDNS_TCP: - EXPECT_TRUE(query.getEDNS()); - // Return FORMERROR - setFORMERR(message); - expected_ = NON_EDNS_UDP; - break; - - default: + default: FAIL() << "TcpReceiveHandler called with unknown state"; }