2
0
mirror of https://gitlab.isc.org/isc-projects/dhcp synced 2025-08-30 05:47:45 +00:00

Don't be so eager to respond to DHCPREQUEST messages with failover.

This commit is contained in:
Ted Lemon 2000-05-03 06:29:15 +00:00
parent 26b44cabef
commit f39c1b92aa

View File

@ -43,7 +43,7 @@
#ifndef lint
static char copyright[] =
"$Id: dhcp.c,v 1.145 2000/05/02 00:00:08 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
"$Id: dhcp.c,v 1.146 2000/05/03 06:29:15 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
@ -154,21 +154,11 @@ void dhcpdiscover (packet, ms_nulltp)
}
#if defined (FAILOVER_PROTOCOL)
log_info ("lease -> pool = %lx\n", (unsigned long)lease -> pool);
if (lease -> pool) {
log_info ("lease -> pool -> failover_peer = %lx\n",
(unsigned long)(lease -> pool -> failover_peer));
if (lease -> pool -> failover_peer)
log_info ("lease -> pool -> failover_peer -> hba =%lx",
(unsigned long)(lease -> pool
-> failover_peer -> hba));
}
/* Do load balancing if configured. */
if (lease -> pool &&
lease -> pool -> failover_peer &&
lease -> pool -> failover_peer -> hba) {
lease -> pool -> failover_peer -> hba &&
lease -> pool -> failover_peer -> my_state == normal) {
if (!load_balance_mine (packet,
lease -> pool -> failover_peer))
return;
@ -329,6 +319,35 @@ void dhcprequest (packet, ms_nulltp)
}
}
#if defined (FAILOVER_PROTOCOL)
/* If we found a lease, but it belongs to a failover peer, and
the client is in the SELECTING state, ignore the request -
it's not ours. */
if (lease && (lease -> flags & PEER_IS_OWNER) &&
lookup_option (&dhcp_universe, packet -> options,
DHO_DHCP_SERVER_IDENTIFIER)) {
log_info ("%s: ignored (not for me)", msgbuf);
return;
}
/* If we found a lease, but it belongs to a failover peer, and
we are communicating with that peer, drop it. This really
shouldn't happen - if the peer is up, it should have renewed
the client while the client was in the RENEWING state. However,
there are cases where the client won't be able to get unicast
packets to its server, but will be able to get broadcast packets
to its server, so for now I'm taking that possibility into
account, although this should be revisited later. Oh, also if
the client comes up in the REBINDING state, we'll see it here,
and shouldn't respond until its server has had a chance at it. */
if (lease && (lease -> flags & PEER_IS_OWNER) &&
lease -> pool && lease -> pool -> failover_peer &&
lease -> pool -> failover_peer -> my_state == normal) {
log_info ("%s: ignored (not for me)", msgbuf);
return;
}
#endif /* FAILOVER_PROTOCOL */
/* If the address the client asked for is ours, but it wasn't
available for the client, NAK it. */
if (!lease && ours) {