]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
-n [master]
authorShawn Routhier <sar@isc.org>
Tue, 27 Aug 2013 18:09:12 +0000 (11:09 -0700)
committerShawn Routhier <sar@isc.org>
Tue, 27 Aug 2013 18:09:12 +0000 (11:09 -0700)
    [rt26311]
    Fix the issue with DDNS by checking to see if we have added a pointer
    to the ddns_cb and skipping the cache threshold check if we did.  Also
    expand and correct the cache threshold check into the delayed ack code.

RELNOTES
common/discover.c
server/dhcp.c

index 5cc71506d3c02fe29c123b7acc0cd874442ec08d..04a16b2c496e687b788752f2b5a38a3603c1fb97 100644 (file)
--- a/RELNOTES
+++ b/RELNOTES
@@ -47,6 +47,10 @@ work on other platforms. Please report any problems and suggested fixes to
   than extend or renew the lease.  This absolves the server of needing
   to perform an fsync() operation on the lease database before reply,
   which improves performance. [ISC-Bugs #22228]
+  Update this patch to support asynchronous DDNS.  If the server is
+  attempting to do DDNS on a lease it should be udpated and written to
+  disk even if that wouldn't be necessary due to the thresholding
+  [ISC-Bugs #26311]
 
 - The 'no available billing' log line now also logs the name of the last
   matching billing class tried before failing to provide a billing.
index 1d8421928ea3c2f7bfeada8fff996dae55bc7cc4..1d55317b24246130fbbab3ffb7df7bc2f9c6d2c0 100644 (file)
@@ -3,6 +3,7 @@
    Find and identify the network interfaces. */
 
 /*
+ * Copyright (c) 2013 by Internet Systems Consortium, Inc. ("ISC")
  * Copyright (c) 2004-2009,2011 by Internet Systems Consortium, Inc. ("ISC")
  * Copyright (c) 1995-2003 by Internet Software Consortium
  *
index 1e15a22903e6f7d208e21fbdf2228ff3e2d8d331..81095521a0ee183248b4c449533767de4d72a878 100644 (file)
@@ -3,7 +3,7 @@
    DHCP Protocol engine. */
 
 /*
- * Copyright (c) 2004-2012 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 2004-2013 by Internet Systems Consortium, Inc. ("ISC")
  * Copyright (c) 1995-2003 by Internet Software Consortium
  *
  * Permission to use, copy, modify, and distribute this software for any
@@ -1561,7 +1561,8 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp, hp)
        TIME remaining_time;
        struct iaddr cip;
 #if defined(DELAYED_ACK)
-       isc_boolean_t enqueue = ISC_TRUE;
+       /* By default we don't do the enqueue */
+       isc_boolean_t enqueue = ISC_FALSE;
 #endif
        int use_old_lease = 0;
 
@@ -2541,7 +2542,14 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp, hp)
                        data_string_forget(&d1, MDL);
                }
 
-               if ((thresh > 0) && (offer == DHCPACK) &&
+               /*
+                * We check on ddns_cb to see if the ddns code has
+                * updated the lt structure.  We could probably simply
+                * copy the ddns_cb pointer in that case but lets be
+                * simple and safe and update the entire lease.
+                */
+               if ((lt->ddns_cb == NULL) &&
+                   (thresh > 0) && (offer == DHCPACK) &&
                    (lease->binding_state == FTS_ACTIVE)) {
                        int limit;
                        int prev_lease = lease->ends - lease->starts;
@@ -2569,18 +2577,16 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp, hp)
                 * the same lease to another client later, and that would be
                 * a conflict.
                 */
-               if (!use_old_lease && !supersede_lease(lease, lt, commit,
+               if ((use_old_lease == 0) &&
+                   !supersede_lease(lease, lt, commit,
                                     offer == DHCPACK, offer == DHCPACK)) {
 #else /* defined(DELAYED_ACK) */
                /*
                 * If there already isn't a need for a lease commit, and we
                 * can just answer right away, set a flag to indicate this.
                 */
-               if (commit && !(lease->flags & STATIC_LEASE) &&
-                   (!offer || (offer == DHCPACK)))
+               if (commit)
                        enqueue = ISC_TRUE;
-               else
-                       enqueue = ISC_FALSE;
 
                /* Install the new information on 'lt' onto the lease at
                 * 'lease'.  We will not 'commit' this information to disk
@@ -2591,8 +2597,9 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp, hp)
                 * BOOTREPLY either); we may give the same lease out to a
                 * different client, and that would be a conflict.
                 */
-               if (!supersede_lease(lease, lt, 0, !offer || offer == DHCPACK,
-                                    0)) {
+               if ((use_old_lease == 0) &&
+                   !supersede_lease(lease, lt, 0,
+                                    !offer || offer == DHCPACK, 0)) {
 #endif
                        log_info ("%s: database update failed", msg);
                        free_lease_state (state, MDL);