From: Shawn Routhier Date: Tue, 27 Aug 2013 18:09:12 +0000 (-0700) Subject: -n [master] X-Git-Tag: v4_3_0a1~28 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8cd88e202bd734e40e006808311fb6688e9f0b47;p=thirdparty%2Fdhcp.git -n [master] [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. --- diff --git a/RELNOTES b/RELNOTES index 5cc71506d..04a16b2c4 100644 --- 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. diff --git a/common/discover.c b/common/discover.c index 1d8421928..1d55317b2 100644 --- a/common/discover.c +++ b/common/discover.c @@ -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 * diff --git a/server/dhcp.c b/server/dhcp.c index 1e15a2290..81095521a 100644 --- a/server/dhcp.c +++ b/server/dhcp.c @@ -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);