2
0
mirror of https://gitlab.isc.org/isc-projects/dhcp synced 2025-08-31 06:15:55 +00:00

- Delete on_expiry events when lease is released, regardless of whether

there's a release event.
- If the lease being superseded is the next in a pool to expire, clean that
  up before superseding.
- Also, if the next lease to expire in a pool expires at the same time as
  the current lease, make sure that both expire, not just one.
This commit is contained in:
Ted Lemon
1999-11-12 17:21:28 +00:00
parent ffdcd1275a
commit ccbdce1467

View File

@@ -22,7 +22,7 @@
#ifndef lint
static char copyright[] =
"$Id: mdb.c,v 1.18 1999/11/07 20:38:01 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
"$Id: mdb.c,v 1.19 1999/11/12 17:21:28 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
@@ -673,7 +673,7 @@ int subnet_inner_than (subnet, scan, warnp)
break;
strcpy (n1buf, piaddr (subnet -> net));
if (warnp)
log_error ("%ssubnet %s/%d conflicts with subnet %s/%d",
log_error ("%ssubnet %s/%d overlaps subnet %s/%d",
"Warning: ", n1buf, 32 - i,
piaddr (scan -> net), 32 - j);
if (i < j)
@@ -945,6 +945,25 @@ int supersede_lease (comp, lease, commit)
if (comp -> pool -> last_lease == comp) {
comp -> pool -> last_lease = comp -> prev;
}
/* If there's an expiry event on this lease, get rid of it
(we may wind up putting it back, but we can't count on
that here without too much additional complexity). */
if (comp -> pool -> next_expiry == comp) {
for (lp = comp -> pool -> next_expiry; lp; lp = lp -> prev)
if (lp -> on_expiry)
break;
if (lp && lp -> on_expiry) {
comp -> pool -> next_expiry = comp;
if (commit)
add_timeout (lp -> ends,
pool_timer, lp -> pool);
} else {
comp -> pool -> next_expiry = (struct lease *)0;
if (commit)
cancel_timeout (pool_timer, comp -> pool);
}
}
/* Find the last insertion point... */
if (comp == comp -> pool -> insertion_point ||
@@ -1044,7 +1063,24 @@ int supersede_lease (comp, lease, commit)
add_timeout (comp -> ends,
pool_timer,
comp -> pool);
}
} else if (comp -> ends ==
comp -> pool -> next_expiry -> ends) {
/* If there are other leases that expire at
the same time as comp, we need to make
sure that we have the one that appears
last on the list that needs an expiry
event - otherwise we'll miss expiry
events until the server restarts. */
struct lease *foo;
struct lease *install = comp;
for (foo = comp;
foo -> ends == comp -> ends;
foo = foo -> next) {
if (foo -> on_expiry)
install = foo;
}
comp -> pool -> next_expiry = install;
}
}
}
}
@@ -1075,12 +1111,6 @@ void release_lease (lease, packet)
executable_statement_dereference (&lease -> on_release,
"dhcprelease");
/* We do either the on_release or the on_expiry events, but
not both (it's possible that they could be the same,
in any case). */
if (lease -> on_expiry)
executable_statement_dereference (&lease -> on_expiry,
"dhcprelease");
if (lease -> ddns_fwd_name) {
dfree (lease -> ddns_fwd_name, "pool_timer");
lease -> ddns_fwd_name = (char *)0;
@@ -1091,6 +1121,13 @@ void release_lease (lease, packet)
}
}
/* We do either the on_release or the on_expiry events, but
not both (it's possible that they could be the same,
in any case). */
if (lease -> on_expiry)
executable_statement_dereference (&lease -> on_expiry,
"dhcprelease");
if (lease -> ends > cur_time) {
lt = *lease;