Browse Source

[3035] Implemented function to enqueue new NameChangeRequests.

Marcin Siodelski 11 years ago
parent
commit
4924ba4190
3 changed files with 61 additions and 2 deletions
  1. 17 0
      src/bin/dhcp4/dhcp4_messages.mes
  2. 34 2
      src/bin/dhcp4/dhcp4_srv.cc
  3. 10 0
      src/bin/dhcp4/dhcp4_srv.h

+ 17 - 0
src/bin/dhcp4/dhcp4_messages.mes

@@ -134,6 +134,13 @@ specified client after receiving a REQUEST message from it.  There are many
 possible reasons for such a failure. Additional messages will indicate the
 reason.
 
+% DHCP4_NCR_CREATION_FAILED failed to generate name change requests for DNS: %1
+This message indicates that server was unable to generate so called
+NameChangeRequests which should be sent to the b10-dhcp_ddns module to create
+new DNS records for the lease being acquired or to update existing records
+for the renewed lease. The reason for the failure is printed in the logged
+message.
+
 % DHCP4_NO_SOCKETS_OPEN no interface configured to listen to DHCP traffic
 This warning message is issued when current server configuration specifies
 no interfaces that server should listen on, or specified interfaces are not
@@ -211,6 +218,16 @@ failure is given in the message.
 % DHCP4_QUERY_DATA received packet type %1, data is <%2>
 A debug message listing the data received from the client.
 
+% DHCP4_QUEUE_ADDITION_NCR name change request for adding new DNS entry queued: %1
+A debug message which is logged when the NameChangeRequest to add new DNS
+entries for the particular lease has been queued. The parameter of this log
+carries the details of the NameChangeRequest.
+
+% DHCP4_QUEUE_REMOVAL_NCR name change request for removing a DNS entry queued: %1
+A debug message which is logged when the NameChangeRequest to remove existing
+DNS entry for the particular lease has been queued. The parameter of this log
+carries the details of the NameChangeRequest.
+
 % DHCP4_RELEASE address %1 belonging to client-id %2, hwaddr %3 was released properly.
 This debug message indicates that an address was released properly. It
 is a normal operation during client shutdown.

+ 34 - 2
src/bin/dhcp4/dhcp4_srv.cc

@@ -884,7 +884,7 @@ Dhcpv4Srv::createNameChangeRequests(const Lease4Ptr& lease,
                                       old_lease->hostname_,
                                       old_lease->addr_.toText(),
                                       dhcid, 0, old_lease->valid_lft_);
-                name_change_reqs_.push(ncr);
+                queueNameChangeRequest(ncr);
 
             // If FQDN data from both leases match, there is no need to update.
             } else if ((lease->hostname_ == old_lease->hostname_) &&
@@ -905,11 +905,28 @@ Dhcpv4Srv::createNameChangeRequests(const Lease4Ptr& lease,
                               lease->fqdn_fwd_, lease->fqdn_rev_,
                               lease->hostname_, lease->addr_.toText(),
                               dhcid, 0, lease->valid_lft_);
-        name_change_reqs_.push(ncr);
+        queueNameChangeRequest(ncr);
     }
 }
 
 void
+Dhcpv4Srv::
+queueNameChangeRequest(const isc::dhcp_ddns::NameChangeRequest& ncr) {
+    if (ncr.getChangeType() == isc::dhcp_ddns::CHG_ADD) {
+        LOG_DEBUG(dhcp4_logger, DBG_DHCP4_DETAIL_DATA,
+                  DHCP4_QUEUE_ADDITION_NCR)
+            .arg(ncr.toText());
+
+    } else {
+        LOG_DEBUG(dhcp4_logger, DBG_DHCP4_DETAIL_DATA,
+                  DHCP4_QUEUE_REMOVAL_NCR)
+            .arg(ncr.toText());
+
+    }
+    name_change_reqs_.push(ncr);
+}
+
+void
 Dhcpv4Srv::assignLease(const Pkt4Ptr& question, Pkt4Ptr& answer) {
 
     // We need to select a subnet the client is connected in.
@@ -999,6 +1016,21 @@ Dhcpv4Srv::assignLease(const Pkt4Ptr& question, Pkt4Ptr& answer) {
         // @todo: send renew timer option (T1, option 58)
         // @todo: send rebind timer option (T2, option 59)
 
+        // @todo Currently the NameChangeRequests are always generated if
+        // real (not fake) allocation is being performed. Should we have
+        // control switch to enable/disable NameChangeRequest creation?
+        // Perhaps we need a way to detect whether the b10-dhcp-ddns module
+        // is up an running?
+        if (!fake_allocation) {
+            try {
+                createNameChangeRequests(lease, old_lease);
+            } catch (const Exception& ex) {
+                LOG_ERROR(dhcp4_logger, DHCP4_NCR_CREATION_FAILED)
+                    .arg(ex.what());
+            }
+
+        }
+
     } else {
         // Allocation engine did not allocate a lease. The engine logged
         // cause of that failure. The only thing left is to insert

+ 10 - 0
src/bin/dhcp4/dhcp4_srv.h

@@ -329,6 +329,16 @@ protected:
     void createNameChangeRequests(const Lease4Ptr& lease,
                                   const Lease4Ptr& old_lease);
 
+    /// @brief Adds the NameChangeRequest to the queue for processing.
+    ///
+    /// This function adds the @c isc::dhcp_ddns::NameChangeRequest to the
+    /// queue and emits the debug message which indicates whether the request
+    /// being added is to remove DNS entry or add a new entry. This function
+    /// is exception free.
+    ///
+    /// @param ncr An isc::dhcp_ddns::NameChangeRequest object being added.
+    void queueNameChangeRequest(const isc::dhcp_ddns::NameChangeRequest& ncr);
+
     /// @brief Attempts to renew received addresses
     ///
     /// Attempts to renew existing lease. This typically includes finding a lease that