Parcourir la source

[master Merge branch 'trac3362'

b10-dhcp-ddns now checks for NXRRSET on DNS removal, rather than NXDOMAIN
Thomas Markwalder il y a 11 ans
Parent
commit
d3c971ea33
2 fichiers modifiés avec 21 ajouts et 16 suppressions
  1. 15 10
      src/bin/d2/nc_remove.cc
  2. 6 6
      src/bin/d2/tests/nc_remove_unittests.cc

+ 15 - 10
src/bin/d2/nc_remove.cc

@@ -214,9 +214,11 @@ NameRemoveTransaction::removingFwdAddrsHandler() {
         switch (getDnsUpdateStatus()) {
         case DNSClient::SUCCESS: {
             // We successfully received a response packet from the server.
+            // The RCODE will be based on a value-dependent RRset search,
+            // see RFC 2136 section 3.2.3/3.2.4.
             const dns::Rcode& rcode = getDnsUpdateResponse()->getRcode();
             if ((rcode == dns::Rcode::NOERROR()) ||
-                (rcode == dns::Rcode::NXDOMAIN())) {
+                (rcode == dns::Rcode::NXRRSET())) {
                 // We were able to remove it or it wasn't there, now we
                 // need to remove any other RRs for this FQDN.
                 transition(REMOVING_FWD_RRS_ST, UPDATE_OK_EVT);
@@ -318,14 +320,14 @@ NameRemoveTransaction::removingFwdRRsHandler() {
         switch (getDnsUpdateStatus()) {
         case DNSClient::SUCCESS: {
             // We successfully received a response packet from the server.
+            // The RCODE will be based on a value-dependent RRset search,
+            // see RFC 2136 section 3.2.3/3.2.4.
             const dns::Rcode& rcode = getDnsUpdateResponse()->getRcode();
-            // @todo Not sure if NXDOMAIN is ok here, but I think so.
-            // A Rcode of NXDOMAIN would mean there are no RRs for the FQDN,
-            // which is fine.  We were asked to delete them, they are not there
-            // so all is well.
             if ((rcode == dns::Rcode::NOERROR()) ||
-                (rcode == dns::Rcode::NXDOMAIN())) {
-                // We were able to remove the forward mapping. Mark it as done.
+                (rcode == dns::Rcode::NXRRSET())) {
+                // We were able to remove them or they were not there (
+                // Rcode of NXRRSET means there are no matching RRsets).
+                // In either case, we consider it success and mark it as done.
                 setForwardChangeCompleted(true);
 
                 // If request calls for reverse update then do that next,
@@ -471,11 +473,14 @@ NameRemoveTransaction::removingRevPtrsHandler() {
         switch (getDnsUpdateStatus()) {
         case DNSClient::SUCCESS: {
             // We successfully received a response packet from the server.
+            // The RCODE will be based on a value-dependent RRset search,
+            // see RFC 2136 section 3.2.3/3.2.4.
             const dns::Rcode& rcode = getDnsUpdateResponse()->getRcode();
             if ((rcode == dns::Rcode::NOERROR()) ||
-                (rcode == dns::Rcode::NXDOMAIN())) {
-                // We were able to update the reverse mapping. Mark it as done.
-                // @todo For now we are also treating NXDOMAIN as success.
+                (rcode == dns::Rcode::NXRRSET())) {
+                // We were able to remove the reverse mapping or they were
+                // not there (Rcode of NXRRSET means there are no matching
+                // RRsets). In either case, mark it as done.
                 setReverseChangeCompleted(true);
                 transition(PROCESS_TRANS_OK_ST, UPDATE_OK_EVT);
             } else {

+ 6 - 6
src/bin/d2/tests/nc_remove_unittests.cc

@@ -603,8 +603,8 @@ TEST_F(NameRemoveTransactionTest, removingFwdAddrsHandler_FqdnNotInUse) {
     // Run removingFwdAddrsHandler to construct and send the request.
     EXPECT_NO_THROW(name_remove->removingFwdAddrsHandler());
 
-    // Simulate receiving a FQDN not in use response.
-    name_remove->fakeResponse(DNSClient::SUCCESS, dns::Rcode::NXDOMAIN());
+    // Simulate receiving a RRSET does not exist.
+    name_remove->fakeResponse(DNSClient::SUCCESS, dns::Rcode::NXRRSET());
 
     // Run removingFwdAddrsHandler again to process the response.
     EXPECT_NO_THROW(name_remove->removingFwdAddrsHandler());
@@ -963,8 +963,8 @@ TEST_F(NameRemoveTransactionTest, removingFwdRRsHandler_FqdnNotInUse) {
     // Run removingFwdRRsHandler to construct and send the request.
     EXPECT_NO_THROW(name_remove->removingFwdRRsHandler());
 
-    // Simulate receiving a FQDN not in use response.
-    name_remove->fakeResponse(DNSClient::SUCCESS, dns::Rcode::NXDOMAIN());
+    // Simulate receiving a RRSET does not exist response.
+    name_remove->fakeResponse(DNSClient::SUCCESS, dns::Rcode::NXRRSET());
 
     // Run removingFwdRRsHandler again to process the response.
     EXPECT_NO_THROW(name_remove->removingFwdRRsHandler());
@@ -1340,8 +1340,8 @@ TEST_F(NameRemoveTransactionTest, removingRevPtrsHandler_FqdnNotInUse) {
     EXPECT_EQ(StateModel::NOP_EVT,
               name_remove->getNextEvent());
 
-    // Simulate receiving a FQDN not in use response.
-    name_remove->fakeResponse(DNSClient::SUCCESS, dns::Rcode::NXDOMAIN());
+    // Simulate receiving a RRSET does not exist.
+    name_remove->fakeResponse(DNSClient::SUCCESS, dns::Rcode::NXRRSET());
 
     // Run removingRevPtrsHandler again to process the response.
     EXPECT_NO_THROW(name_remove->removingRevPtrsHandler());