mirror of
https://gitlab.isc.org/isc-projects/dhcp
synced 2025-09-03 15:56:00 +00:00
Add more pieces of failover support. Support new struct hardware.
This commit is contained in:
103
server/dhcp.c
103
server/dhcp.c
@@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
#ifndef lint
|
#ifndef lint
|
||||||
static char copyright[] =
|
static char copyright[] =
|
||||||
"$Id: dhcp.c,v 1.130 1999/11/23 19:08:24 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
|
"$Id: dhcp.c,v 1.131 2000/01/05 18:16:36 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
|
||||||
#endif /* not lint */
|
#endif /* not lint */
|
||||||
|
|
||||||
#include "dhcpd.h"
|
#include "dhcpd.h"
|
||||||
@@ -858,9 +858,10 @@ void nak_lease (packet, cip)
|
|||||||
dump_raw ((unsigned char *)&raw, outgoing.packet_length);
|
dump_raw ((unsigned char *)&raw, outgoing.packet_length);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
hto.htype = packet -> raw -> htype;
|
hto.hbuf [0] = packet -> raw -> htype;
|
||||||
hto.hlen = packet -> raw -> hlen;
|
hto.hlen = packet -> raw -> hlen;
|
||||||
memcpy (hto.haddr, packet -> raw -> chaddr, hto.hlen);
|
memcpy (&hto.hbuf [1], packet -> raw -> chaddr, hto.hlen);
|
||||||
|
hto.hlen++;
|
||||||
|
|
||||||
/* Set up the common stuff... */
|
/* Set up the common stuff... */
|
||||||
to.sin_family = AF_INET;
|
to.sin_family = AF_INET;
|
||||||
@@ -1078,7 +1079,7 @@ void ack_lease (packet, lease, offer, when, msg)
|
|||||||
state -> options, oc))) {
|
state -> options, oc))) {
|
||||||
do {
|
do {
|
||||||
seek = (find_lease_by_hw_addr
|
seek = (find_lease_by_hw_addr
|
||||||
(lease -> hardware_addr.haddr,
|
(lease -> hardware_addr.hbuf,
|
||||||
lease -> hardware_addr.hlen));
|
lease -> hardware_addr.hlen));
|
||||||
while (seek) {
|
while (seek) {
|
||||||
if (seek != lease &&
|
if (seek != lease &&
|
||||||
@@ -1330,6 +1331,45 @@ void ack_lease (packet, lease, offer, when, msg)
|
|||||||
lease_time = default_lease_time;
|
lease_time = default_lease_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined (FAILOVER_PROTOCOL)
|
||||||
|
/* Okay, we know the lease duration. Now check the
|
||||||
|
failover state, if any. */
|
||||||
|
if (lease -> pool -> shared_network -> failover_peer) {
|
||||||
|
dhcp_failover_state_t *peer =
|
||||||
|
lease -> pool -> failover_peer;
|
||||||
|
|
||||||
|
/* If the lease time we arrived at exceeds what
|
||||||
|
the peer has, first update the peer. */
|
||||||
|
/* XXX This may result in updates that only push
|
||||||
|
XXX the peer's expiry time for this lease up
|
||||||
|
XXX by a few seconds - think about this again
|
||||||
|
XXX later. */
|
||||||
|
if (cur_time + lease_time > lease -> tsfp) {
|
||||||
|
/* Here we're assuming that if we don't have
|
||||||
|
to update tstp, there's already an update
|
||||||
|
queued. May want to revisit this. */
|
||||||
|
if (cur_time + lease_time < lease -> tstp) {
|
||||||
|
lease -> tstp = cur_time + lease_time;
|
||||||
|
if (offer == DHCPACK)
|
||||||
|
update_partner (lease);
|
||||||
|
}
|
||||||
|
/* Now choose a lease time that is either
|
||||||
|
MCLT, for a lease that's never before been
|
||||||
|
assigned, or TSFP + MCLT for a lease that
|
||||||
|
has.
|
||||||
|
XXX Note that TSFP may be < cur_time.
|
||||||
|
XXX What do we do in this case?
|
||||||
|
XXX should the expiry timer on the lease
|
||||||
|
XXX set tsfp and tstp to zero? */
|
||||||
|
if (lease -> tsfp == 0)
|
||||||
|
lease_time = peer -> mclt;
|
||||||
|
else
|
||||||
|
lease_time = (lease -> tsfp - cur_time
|
||||||
|
+ peer -> mclt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* FAILOVER_PROTOCOL */
|
||||||
|
|
||||||
/* If the lease duration causes the time value to wrap,
|
/* If the lease duration causes the time value to wrap,
|
||||||
use the maximum expiry time. */
|
use the maximum expiry time. */
|
||||||
if (cur_time + lease_time < cur_time)
|
if (cur_time + lease_time < cur_time)
|
||||||
@@ -1430,15 +1470,16 @@ void ack_lease (packet, lease, offer, when, msg)
|
|||||||
if (lease -> flags & STATIC_LEASE) {
|
if (lease -> flags & STATIC_LEASE) {
|
||||||
/* Copy the hardware address into the static lease
|
/* Copy the hardware address into the static lease
|
||||||
structure. */
|
structure. */
|
||||||
lease -> hardware_addr.hlen = packet -> raw -> hlen;
|
lease -> hardware_addr.hlen = packet -> raw -> hlen + 1;
|
||||||
lease -> hardware_addr.htype = packet -> raw -> htype;
|
lease -> hardware_addr.hbuf [0] = packet -> raw -> htype;
|
||||||
memcpy (lease -> hardware_addr.haddr, packet -> raw -> chaddr,
|
memcpy (&lease -> hardware_addr.hbuf [1],
|
||||||
|
packet -> raw -> chaddr,
|
||||||
sizeof packet -> raw -> chaddr); /* XXX */
|
sizeof packet -> raw -> chaddr); /* XXX */
|
||||||
} else {
|
} else {
|
||||||
/* Record the hardware address, if given... */
|
/* Record the hardware address, if given... */
|
||||||
lt.hardware_addr.hlen = packet -> raw -> hlen;
|
lt.hardware_addr.hlen = packet -> raw -> hlen + 1;
|
||||||
lt.hardware_addr.htype = packet -> raw -> htype;
|
lt.hardware_addr.hbuf [0] = packet -> raw -> htype;
|
||||||
memcpy (lt.hardware_addr.haddr, packet -> raw -> chaddr,
|
memcpy (<.hardware_addr.hbuf [1], packet -> raw -> chaddr,
|
||||||
sizeof packet -> raw -> chaddr);
|
sizeof packet -> raw -> chaddr);
|
||||||
|
|
||||||
/* Install the new information about this lease in the
|
/* Install the new information about this lease in the
|
||||||
@@ -1886,9 +1927,10 @@ void dhcp_reply (lease)
|
|||||||
} else
|
} else
|
||||||
bufs |= 2; /* XXX */
|
bufs |= 2; /* XXX */
|
||||||
|
|
||||||
memcpy (raw.chaddr, lease -> hardware_addr.haddr, sizeof raw.chaddr);
|
memcpy (raw.chaddr,
|
||||||
raw.hlen = lease -> hardware_addr.hlen;
|
&lease -> hardware_addr.hbuf [1], sizeof raw.chaddr);
|
||||||
raw.htype = lease -> hardware_addr.htype;
|
raw.hlen = lease -> hardware_addr.hlen - 1;
|
||||||
|
raw.htype = lease -> hardware_addr.hbuf [0];
|
||||||
|
|
||||||
/* See if this is a Microsoft client that NUL-terminates its
|
/* See if this is a Microsoft client that NUL-terminates its
|
||||||
strings and expects us to do likewise... */
|
strings and expects us to do likewise... */
|
||||||
@@ -1934,10 +1976,10 @@ void dhcp_reply (lease)
|
|||||||
? (state -> offer == DHCPACK ? "DHCPACK" : "DHCPOFFER")
|
? (state -> offer == DHCPACK ? "DHCPACK" : "DHCPOFFER")
|
||||||
: "BOOTREPLY"),
|
: "BOOTREPLY"),
|
||||||
piaddr (lease -> ip_addr),
|
piaddr (lease -> ip_addr),
|
||||||
(lease -> hardware_addr.htype
|
(lease -> hardware_addr.hlen
|
||||||
? print_hw_addr (lease -> hardware_addr.htype,
|
? print_hw_addr (lease -> hardware_addr.hbuf [0],
|
||||||
lease -> hardware_addr.hlen,
|
lease -> hardware_addr.hlen - 1,
|
||||||
lease -> hardware_addr.haddr)
|
&lease -> hardware_addr.hbuf [1])
|
||||||
: print_hex_1 (lease -> uid_len, lease -> uid,
|
: print_hex_1 (lease -> uid_len, lease -> uid,
|
||||||
lease -> uid_len)),
|
lease -> uid_len)),
|
||||||
s ? "(" : "", s ? s : "", s ? ") " : "",
|
s ? "(" : "", s ? s : "", s ? ") " : "",
|
||||||
@@ -1946,9 +1988,8 @@ void dhcp_reply (lease)
|
|||||||
: state -> ip -> name));
|
: state -> ip -> name));
|
||||||
|
|
||||||
/* Set up the hardware address... */
|
/* Set up the hardware address... */
|
||||||
hto.htype = lease -> hardware_addr.htype;
|
|
||||||
hto.hlen = lease -> hardware_addr.hlen;
|
hto.hlen = lease -> hardware_addr.hlen;
|
||||||
memcpy (hto.haddr, lease -> hardware_addr.haddr, hto.hlen);
|
memcpy (hto.hbuf, lease -> hardware_addr.hbuf, hto.hlen);
|
||||||
|
|
||||||
to.sin_family = AF_INET;
|
to.sin_family = AF_INET;
|
||||||
#ifdef HAVE_SA_LEN
|
#ifdef HAVE_SA_LEN
|
||||||
@@ -2300,11 +2341,11 @@ struct lease *find_lease (packet, share, ours)
|
|||||||
memcmp (ip_lease -> uid, client_identifier.data,
|
memcmp (ip_lease -> uid, client_identifier.data,
|
||||||
ip_lease -> uid_len))) ||
|
ip_lease -> uid_len))) ||
|
||||||
(!ip_lease -> uid &&
|
(!ip_lease -> uid &&
|
||||||
(ip_lease -> hardware_addr.htype != packet -> raw -> htype ||
|
(ip_lease -> hardware_addr.hbuf [0] != packet -> raw -> htype ||
|
||||||
ip_lease -> hardware_addr.hlen != packet -> raw -> hlen ||
|
ip_lease -> hardware_addr.hlen != packet -> raw -> hlen + 1 ||
|
||||||
memcmp (ip_lease -> hardware_addr.haddr,
|
memcmp (&ip_lease -> hardware_addr.hbuf,
|
||||||
packet -> raw -> chaddr,
|
packet -> raw -> chaddr,
|
||||||
ip_lease -> hardware_addr.hlen))))) {
|
(unsigned)(ip_lease -> hardware_addr.hlen - 1)))))) {
|
||||||
#if defined (DEBUG_FIND_LEASE)
|
#if defined (DEBUG_FIND_LEASE)
|
||||||
if (ip_lease)
|
if (ip_lease)
|
||||||
log_info ("rejecting lease for requested address.");
|
log_info ("rejecting lease for requested address.");
|
||||||
@@ -2607,6 +2648,20 @@ struct lease *allocate_lease (packet, pool, ok)
|
|||||||
|
|
||||||
lease = pool -> last_lease;
|
lease = pool -> last_lease;
|
||||||
|
|
||||||
|
#if defined (FAILOVER_PROTOCOL)
|
||||||
|
/* XXX Do we need code here to ignore PEER_IS_OWNER and just check
|
||||||
|
XXX tstp if we're in, e.g., PARTNER_DOWN? Where do we deal with
|
||||||
|
XXX CONFLICT_DETECTED, et al? */
|
||||||
|
/* Skip to the most expired lease in the pool that is not owned by a
|
||||||
|
failover peer. */
|
||||||
|
if (lease -> pool && lease -> pool -> failover_peer) {
|
||||||
|
while ((lease -> flags & PEER_IS_OWNER) &&
|
||||||
|
(lease -> ends <=
|
||||||
|
cur_time + lease -> pool -> failover_peer -> mclt))
|
||||||
|
lease = lease -> prev;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* If there are no leases in the pool that have
|
/* If there are no leases in the pool that have
|
||||||
expired, try the next one. */
|
expired, try the next one. */
|
||||||
if (!lease || lease -> ends > cur_time)
|
if (!lease || lease -> ends > cur_time)
|
||||||
@@ -2614,6 +2669,8 @@ struct lease *allocate_lease (packet, pool, ok)
|
|||||||
|
|
||||||
/* If we find an abandoned lease, and no other lease qualifies
|
/* If we find an abandoned lease, and no other lease qualifies
|
||||||
better, take it. */
|
better, take it. */
|
||||||
|
/* XXX what if there are non-abandoned leases that are younger
|
||||||
|
XXX than this? Shouldn't we hunt for those here? */
|
||||||
if ((lease -> flags & ABANDONED_LEASE)) {
|
if ((lease -> flags & ABANDONED_LEASE)) {
|
||||||
/* If we already have a non-abandoned lease that we didn't
|
/* If we already have a non-abandoned lease that we didn't
|
||||||
love, but that's okay, don't reclaim the abandoned lease. */
|
love, but that's okay, don't reclaim the abandoned lease. */
|
||||||
|
Reference in New Issue
Block a user