mirror of
https://gitlab.isc.org/isc-projects/dhcp
synced 2025-09-04 16:25:21 +00:00
Implement pool request and response so that secondary can operate.
This commit is contained in:
@@ -10,7 +10,7 @@ NNAAMMEE
|
||||
SSYYNNOOPPSSIISS
|
||||
ddhhcclliieenntt [ --pp _p_o_r_t ] [ --dd ] [ --DD ] [ --qq ] [ --cc ] [ --llff
|
||||
_l_e_a_s_e_-_f_i_l_e ] [ --ppff _p_i_d_-_f_i_l_e ] [ --ccff _c_o_n_f_i_g_-_f_i_l_e ] [ --ss
|
||||
server ] [ _i_f_0 [ _._._._i_f_N ] ]
|
||||
server ] [ --ww ] [ _i_f_0 [ _._._._i_f_N ] ]
|
||||
|
||||
DDEESSCCRRIIPPTTIIOONN
|
||||
The Internet Software Consortium DHCP Client, dhclient,
|
||||
@@ -160,6 +160,17 @@ dhclient(8) dhclient(8)
|
||||
//vvaarr//ddbb or //vvaarr//rruunn has not yet been mounted when the DHCP
|
||||
client is started.
|
||||
|
||||
The DHCP client normally exits if it isn't able to iden<65>
|
||||
tify any network interfaces to configure. On laptop com<6F>
|
||||
puters and other computers with hot-swappable I/O buses,
|
||||
it is possible that a broadcast interface may be added
|
||||
after system startup. The --ww flag can be used to cause
|
||||
the client not to exit when it doesn't find any such
|
||||
interfaces. The ddhhccppccccpp ((88)) program can then be used to
|
||||
notify the client when a network interface has been added
|
||||
or removed, so that the client can configure an IP address
|
||||
on that interface.
|
||||
|
||||
CCOONNFFIIGGUURRAATTIIOONN
|
||||
The syntax of the dhclient.conf(8) file is discussed
|
||||
seperately.
|
||||
@@ -179,17 +190,6 @@ AAUUTTHHOORR
|
||||
Software Consortium, see hhttttpp::////wwwwww..vviixx..ccoomm//iisscc.. To learn
|
||||
more about Vixie Enterprises, see hhttttpp::////wwwwww..vviixx..ccoomm..
|
||||
|
||||
This client was substantially modified and enhanced by
|
||||
Elliot Poger for use on Linux while he was working on the
|
||||
MosquitoNet project at Stanford.
|
||||
|
||||
The current version owes much to Elliot's Linux enhance<63>
|
||||
ments, but was substantially reorganized and partially
|
||||
rewritten by Ted Lemon so as to use the same networking
|
||||
framework that the Internet Software Consortium DHCP
|
||||
server uses. Much system-specific configuration code was
|
||||
moved into a shell script so that as support for more
|
||||
operating systems is added, it will not be necessary to
|
||||
|
||||
|
||||
|
||||
@@ -202,6 +202,17 @@ AAUUTTHHOORR
|
||||
dhclient(8) dhclient(8)
|
||||
|
||||
|
||||
This client was substantially modified and enhanced by
|
||||
Elliot Poger for use on Linux while he was working on the
|
||||
MosquitoNet project at Stanford.
|
||||
|
||||
The current version owes much to Elliot's Linux enhance<63>
|
||||
ments, but was substantially reorganized and partially
|
||||
rewritten by Ted Lemon so as to use the same networking
|
||||
framework that the Internet Software Consortium DHCP
|
||||
server uses. Much system-specific configuration code was
|
||||
moved into a shell script so that as support for more
|
||||
operating systems is added, it will not be necessary to
|
||||
port and maintain system-specific configuration code to
|
||||
these operating systems - instead, the shell script can
|
||||
invoke the native tools to accomplish the same purpose.
|
||||
@@ -236,17 +247,6 @@ dhclient(8) dhclient(8)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@@ -43,7 +43,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"$Id: conflex.c,v 1.73 2000/05/03 05:56:28 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
|
||||
"$Id: conflex.c,v 1.74 2000/05/04 18:57:57 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
@@ -562,6 +562,8 @@ static enum dhcp_token intern (atom, dfv)
|
||||
return CONCAT;
|
||||
if (!strcasecmp (atom + 1, "ommunications-interrupted"))
|
||||
return COMMUNICATIONS_INTERRUPTED;
|
||||
if (!strcasecmp (atom + 1, "ltt"))
|
||||
return CLTT;
|
||||
break;
|
||||
case 'd':
|
||||
if (!strcasecmp (atom + 1, "ns-update"))
|
||||
|
@@ -94,10 +94,10 @@ dhcpd-options(5) dhcpd-options(5)
|
||||
assume that all subnets of the IP network to which the
|
||||
client is connected use the same MTU as the subnet of
|
||||
that network to which the client is directly connected.
|
||||
A value of 1 indicates that all subnets share the same
|
||||
MTU. A value of 0 means that the client should assume
|
||||
that some subnets of the directly connected network may
|
||||
have smaller MTUs.
|
||||
A value of true indicates that all subnets share the
|
||||
same MTU. A value of false means that the client
|
||||
should assume that some subnets of the directly con<EFBFBD>
|
||||
nected network may have smaller MTUs.
|
||||
|
||||
ooppttiioonn aarrpp--ccaacchhee--ttiimmeeoouutt _u_i_n_t_3_2;;
|
||||
|
||||
@@ -240,9 +240,9 @@ dhcpd-options(5) dhcpd-options(5)
|
||||
This option specifies whether or not the client should
|
||||
use Ethernet Version 2 (RFC 894) or IEEE 802.3 (RFC
|
||||
1042) encapsulation if the interface is an Ethernet. A
|
||||
value of 0 indicates that the client should use RFC 894
|
||||
encapsulation. A value of 1 means that the client
|
||||
should use RFC 1042 encapsulation.
|
||||
value of false indicates that the client should use RFC
|
||||
894 encapsulation. A value of true means that the
|
||||
client should use RFC 1042 encapsulation.
|
||||
|
||||
ooppttiioonn iieenn111166--nnaammee--sseerrvveerrss _i_p_-_a_d_d_r_e_s_s [,, _i_p_-_a_d_d_r_e_s_s... ];
|
||||
|
||||
@@ -276,9 +276,9 @@ dhcpd-options(5) dhcpd-options(5)
|
||||
ooppttiioonn iipp--ffoorrwwaarrddiinngg _f_l_a_g;;
|
||||
|
||||
This option specifies whether the client should config<69>
|
||||
ure its IP layer for packet forwarding. A value of 0
|
||||
means disable IP forwarding, and a value of 1 means
|
||||
enable IP forwarding.
|
||||
ure its IP layer for packet forwarding. A value of
|
||||
false means disable IP forwarding, and a value of true
|
||||
means enable IP forwarding.
|
||||
|
||||
ooppttiioonn iirrcc--sseerrvveerr _i_p_-_a_d_d_r_e_s_s [,, _i_p_-_a_d_d_r_e_s_s... ];;
|
||||
|
||||
@@ -302,8 +302,8 @@ dhcpd-options(5) dhcpd-options(5)
|
||||
|
||||
This option specifies whether or not the client should
|
||||
respond to subnet mask requests using ICMP. A value of
|
||||
0 indicates that the client should not respond. A
|
||||
value of 1 means that the client should respond.
|
||||
false indicates that the client should not respond. A
|
||||
value of true means that the client should respond.
|
||||
|
||||
ooppttiioonn mmaaxx--ddggrraamm--rreeaasssseemmbbllyy _u_i_n_t_1_6;;
|
||||
|
||||
@@ -466,7 +466,7 @@ dhcpd-options(5) dhcpd-options(5)
|
||||
dhcpd-options(5) dhcpd-options(5)
|
||||
|
||||
|
||||
forwarding of such datagrams, and a value of 1 means
|
||||
forwarding of such datagrams, and a value of true means
|
||||
allow forwarding.
|
||||
|
||||
ooppttiioonn nnttpp--sseerrvveerrss _i_p_-_a_d_d_r_e_s_s [,, _i_p_-_a_d_d_r_e_s_s... ];;
|
||||
@@ -492,10 +492,10 @@ dhcpd-options(5) dhcpd-options(5)
|
||||
ooppttiioonn ppeerrffoorrmm--mmaasskk--ddiissccoovveerryy _f_l_a_g;;
|
||||
|
||||
This option specifies whether or not the client should
|
||||
perform subnet mask discovery using ICMP. A value of 0
|
||||
indicates that the client should not perform mask dis<69>
|
||||
covery. A value of 1 means that the client should per<65>
|
||||
form mask discovery.
|
||||
perform subnet mask discovery using ICMP. A value of
|
||||
false indicates that the client should not perform mask
|
||||
discovery. A value of true means that the client
|
||||
should perform mask discovery.
|
||||
|
||||
ooppttiioonn ppoolliiccyy--ffiilltteerr _i_p_-_a_d_d_r_e_s_s _i_p_-_a_d_d_r_e_s_s
|
||||
[,, _i_p_-_a_d_d_r_e_s_s _i_p_-_a_d_d_r_e_s_s...];;
|
||||
@@ -547,10 +547,10 @@ dhcpd-options(5) dhcpd-options(5)
|
||||
|
||||
This option specifies whether or not the client should
|
||||
solicit routers using the Router Discovery mechanism
|
||||
defined in RFC 1256. A value of 0 indicates that the
|
||||
client should not perform router discovery. A value of
|
||||
1 means that the client should perform router discov<6F>
|
||||
ery.
|
||||
defined in RFC 1256. A value of false indicates that
|
||||
the client should not perform router discovery. A
|
||||
value of true means that the client should perform
|
||||
router discovery.
|
||||
|
||||
ooppttiioonn rroouutteerr--ssoolliicciittaattiioonn--aaddddrreessss _i_p_-_a_d_d_r_e_s_s;;
|
||||
|
||||
@@ -638,9 +638,9 @@ dhcpd-options(5) dhcpd-options(5)
|
||||
This option specifies the whether or not the client
|
||||
should send TCP keepalive messages with a octet of
|
||||
garbage for compatibility with older implementations.
|
||||
A value of 0 indicates that a garbage octet should not
|
||||
be sent. A value of 1 indicates that a garbage octet
|
||||
should be sent.
|
||||
A value of false indicates that a garbage octet should
|
||||
not be sent. A value of true indicates that a garbage
|
||||
octet should be sent.
|
||||
|
||||
ooppttiioonn ttccpp--kkeeeeppaalliivvee--iinntteerrvvaall _u_i_n_t_3_2;;
|
||||
|
||||
@@ -690,7 +690,8 @@ dhcpd-options(5) dhcpd-options(5)
|
||||
negotiate the use of trailers (RFC 893 [14]) when using
|
||||
the ARP protocol. A value of 0 indicates that the
|
||||
client should not attempt to use trailers. A value of
|
||||
1 means that the client should attempt to use trailers.
|
||||
true means that the client should attempt to use trail<EFBFBD>
|
||||
ers.
|
||||
|
||||
ooppttiioonn uuaapp--sseerrvveerrss _t_e_x_t;;
|
||||
|
||||
@@ -720,7 +721,6 @@ dhcpd-options(5) dhcpd-options(5)
|
||||
|
||||
|
||||
|
||||
|
||||
11
|
||||
|
||||
|
||||
|
@@ -271,7 +271,8 @@ struct lease {
|
||||
# define ON_UPDATE_QUEUE 64
|
||||
# define ON_ACK_QUEUE 128
|
||||
# define EPHEMERAL_FLAGS (BOOTP_LEASE | MS_NULL_TERMINATION | \
|
||||
ABANDONED_LEASE | PEER_IS_OWNER)
|
||||
ABANDONED_LEASE | PEER_IS_OWNER | \
|
||||
ON_ACK_QUEUE | ON_UPDATE_QUEUE)
|
||||
|
||||
struct lease_state *state;
|
||||
|
||||
@@ -1943,6 +1944,8 @@ isc_result_t dhcp_class_create (omapi_object_t **,
|
||||
|
||||
/* mdb.c */
|
||||
|
||||
extern struct subnet *subnets;
|
||||
extern struct shared_network *shared_networks;
|
||||
extern struct hash_table *host_hw_addr_hash;
|
||||
extern struct hash_table *host_uid_hash;
|
||||
extern struct hash_table *host_name_hash;
|
||||
@@ -1976,7 +1979,7 @@ void new_shared_network_interface PROTO ((struct parse *,
|
||||
int subnet_inner_than PROTO ((struct subnet *, struct subnet *, int));
|
||||
void enter_subnet PROTO ((struct subnet *));
|
||||
void enter_lease PROTO ((struct lease *));
|
||||
int supersede_lease PROTO ((struct lease *, struct lease *, int));
|
||||
int supersede_lease PROTO ((struct lease *, struct lease *, int, int));
|
||||
void release_lease PROTO ((struct lease *, struct packet *));
|
||||
void abandon_lease PROTO ((struct lease *, const char *));
|
||||
void dissociate_lease PROTO ((struct lease *));
|
||||
@@ -2055,6 +2058,9 @@ isc_result_t dhcp_failover_state_transition (dhcp_failover_state_t *,
|
||||
const char *);
|
||||
isc_result_t dhcp_failover_set_state (dhcp_failover_state_t *,
|
||||
enum failover_state);
|
||||
int dhcp_failover_pool_rebalance (dhcp_failover_state_t *);
|
||||
int dhcp_failover_pool_check (struct pool *);
|
||||
int dhcp_failover_state_pool_check (dhcp_failover_state_t *);
|
||||
isc_result_t dhcp_failover_send_updates (dhcp_failover_state_t *);
|
||||
int dhcp_failover_queue_update (struct lease *);
|
||||
void dhcp_failover_ack_queue_remove (dhcp_failover_state_t *, struct lease *);
|
||||
@@ -2084,6 +2090,10 @@ isc_result_t dhcp_failover_state_remove PROTO ((omapi_object_t *,
|
||||
int dhcp_failover_state_match (dhcp_failover_state_t *, u_int8_t *, unsigned);
|
||||
const char *dhcp_failover_reject_reason_print (int);
|
||||
const char *dhcp_failover_state_name_print (enum failover_state);
|
||||
failover_option_t *dhcp_failover_option_printf PROTO ((unsigned, char *,
|
||||
unsigned *,
|
||||
unsigned,
|
||||
const char *, ...));
|
||||
failover_option_t *dhcp_failover_make_option PROTO ((unsigned, char *,
|
||||
unsigned *,
|
||||
unsigned, ...));
|
||||
@@ -2096,9 +2106,14 @@ isc_result_t dhcp_failover_send_disconnect PROTO ((omapi_object_t *,
|
||||
int, const char *));
|
||||
isc_result_t dhcp_failover_send_bind_update (dhcp_failover_state_t *,
|
||||
struct lease *);
|
||||
isc_result_t dhcp_failover_process_bindupdate (dhcp_failover_state_t *,
|
||||
isc_result_t dhcp_failover_send_bind_ack (dhcp_failover_state_t *,
|
||||
struct lease *, failover_message_t *,
|
||||
int, const char *);
|
||||
isc_result_t dhcp_failover_send_poolreq (dhcp_failover_state_t *);
|
||||
isc_result_t dhcp_failover_send_poolresp (dhcp_failover_state_t *, int);
|
||||
isc_result_t dhcp_failover_process_bind_update (dhcp_failover_state_t *,
|
||||
failover_message_t *);
|
||||
isc_result_t dhcp_failover_process_bindack (dhcp_failover_state_t *,
|
||||
isc_result_t dhcp_failover_process_bind_ack (dhcp_failover_state_t *,
|
||||
failover_message_t *);
|
||||
void failover_print PROTO ((char *, unsigned *, unsigned, const char *));
|
||||
void update_partner PROTO ((struct lease *));
|
||||
|
@@ -266,7 +266,8 @@ enum dhcp_token {
|
||||
ADDRESS = 464,
|
||||
POTENTIAL_CONFLICT_NIC = 465,
|
||||
STATE = 466,
|
||||
UNKNOWN_STATE = 567
|
||||
UNKNOWN_STATE = 567,
|
||||
CLTT = 568
|
||||
};
|
||||
|
||||
#define is_identifier(x) ((x) >= FIRST_TOKEN && \
|
||||
|
@@ -156,6 +156,15 @@ typedef struct {
|
||||
#define FTR_HBA_CONFLICT 19
|
||||
#define FTR_UNKNOWN 254
|
||||
|
||||
/* Lease states: */
|
||||
#define FTS_FREE 1
|
||||
#define FTS_ACTIVE 2
|
||||
#define FTS_EXPIRED 3
|
||||
#define FTS_RELEASED 4
|
||||
#define FTS_ABANDONED 5
|
||||
#define FTS_RESET 6
|
||||
#define FTS_BACKUP 7
|
||||
|
||||
#define DHCP_FAILOVER_MAX_MESSAGE_SIZE 2048
|
||||
|
||||
typedef struct {
|
||||
|
@@ -50,41 +50,42 @@
|
||||
/* Define this if you want exhaustive (and very slow) checking of the
|
||||
malloc pool for corruption. */
|
||||
|
||||
/* #define DEBUG_MALLOC_POOL */
|
||||
#define DEBUG_MALLOC_POOL
|
||||
|
||||
/* Define this if you want to maintain a history of the last N operations
|
||||
that changed reference counts on objects. This can be used to debug
|
||||
cases where an object is dereferenced too often, or not often enough. */
|
||||
|
||||
/* #define DEBUG_RC_HISTORY */
|
||||
#define DEBUG_RC_HISTORY
|
||||
|
||||
/* Define this if you want to see the history every cycle. */
|
||||
|
||||
/* #define DEBUG_RC_HISTORY_EXHAUSTIVELY */
|
||||
|
||||
/* This is the number of history entries to maintain - by default, 256. */
|
||||
|
||||
/* #define RC_HISTORY_MAX 1024 */
|
||||
#define RC_HISTORY_MAX 1024
|
||||
|
||||
/* Define this if you want dhcpd to dump core when a non-fatal memory
|
||||
allocation error is detected (i.e., something that would cause a
|
||||
memory leak rather than a memory smash). */
|
||||
|
||||
/* #define POINTER_DEBUG */
|
||||
#define POINTER_DEBUG
|
||||
|
||||
/* Define this if you want debugging output for DHCP failover protocol
|
||||
messages. */
|
||||
|
||||
/* #define DEBUG_FAILOVER_MESSAGES */
|
||||
#define DEBUG_FAILOVER_MESSAGES
|
||||
|
||||
/* Define this if you want debugging output for DHCP failover protocol
|
||||
lease assignment timing. */
|
||||
|
||||
/* #define DEBUG_FAILOVER_TIMING */
|
||||
#define DEBUG_FAILOVER_TIMING
|
||||
|
||||
/* Define this if you want DHCP failover protocol support in the DHCP
|
||||
server. */
|
||||
|
||||
/* #define FAILOVER_PROTOCOL */
|
||||
#define FAILOVER_PROTOCOL
|
||||
|
||||
/* Define this if you want the dhcpd.pid file to go somewhere other than
|
||||
the default (which varies from system to system, but is usually either
|
||||
@@ -152,8 +153,3 @@
|
||||
/* Define this to change the logging facility used by dhcpd. */
|
||||
|
||||
/* #define DHCPD_LOG_FACILITY LOG_DAEMON */
|
||||
|
||||
/* Define this to support the failover protocol. This probably won't work
|
||||
right now. */
|
||||
|
||||
/* #define FAILOVER_PROTOCOL */
|
||||
|
@@ -43,7 +43,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"$Id: confpars.c,v 1.108 2000/05/03 06:19:29 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
|
||||
"$Id: confpars.c,v 1.109 2000/05/04 18:58:11 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
@@ -2140,6 +2140,7 @@ struct lease *parse_lease_declaration (cfile)
|
||||
case TIMESTAMP:
|
||||
case TSTP:
|
||||
case TSFP:
|
||||
case CLTT:
|
||||
t = parse_date (cfile);
|
||||
switch (token) {
|
||||
case STARTS:
|
||||
@@ -2167,6 +2168,11 @@ struct lease *parse_lease_declaration (cfile)
|
||||
lease.tsfp = t;
|
||||
break;
|
||||
|
||||
case CLTT:
|
||||
seenbit = 524288;
|
||||
lease.cltt = t;
|
||||
break;
|
||||
|
||||
default: /* for gcc, we'll never get here. */
|
||||
break;
|
||||
}
|
||||
|
27
server/db.c
27
server/db.c
@@ -43,7 +43,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"$Id: db.c,v 1.48 2000/05/03 06:23:05 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
|
||||
"$Id: db.c,v 1.49 2000/05/04 18:58:12 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
@@ -69,7 +69,7 @@ int write_lease (lease)
|
||||
if (counting)
|
||||
++count;
|
||||
errno = 0;
|
||||
fprintf (db_file, "lease %s {\n", piaddr (lease -> ip_addr));
|
||||
fprintf (db_file, "lease %s {", piaddr (lease -> ip_addr));
|
||||
if (errno) {
|
||||
++errors;
|
||||
}
|
||||
@@ -77,6 +77,7 @@ int write_lease (lease)
|
||||
/* Note: the following is not a Y2K bug - it's a Y1.9K bug. Until
|
||||
somebody invents a time machine, I think we can safely disregard
|
||||
it. */
|
||||
if (lease -> starts) {
|
||||
if (lease -> starts != MAX_TIME) {
|
||||
t = gmtime (&lease -> starts);
|
||||
sprintf (tbuf, "%d %d/%02d/%02d %02d:%02d:%02d;",
|
||||
@@ -86,11 +87,13 @@ int write_lease (lease)
|
||||
} else
|
||||
strcpy (tbuf, "never;");
|
||||
errno = 0;
|
||||
fprintf (db_file, " starts %s\n", tbuf);
|
||||
fprintf (db_file, "\n starts %s", tbuf);
|
||||
if (errno) {
|
||||
++errors;
|
||||
}
|
||||
}
|
||||
|
||||
if (lease -> ends) {
|
||||
if (lease -> ends != MAX_TIME) {
|
||||
t = gmtime (&lease -> ends);
|
||||
sprintf (tbuf, "%d %d/%02d/%02d %02d:%02d:%02d;",
|
||||
@@ -100,10 +103,11 @@ int write_lease (lease)
|
||||
} else
|
||||
strcpy (tbuf, "never;");
|
||||
errno = 0;
|
||||
fprintf (db_file, " ends %s", tbuf);
|
||||
fprintf (db_file, "\n ends %s", tbuf);
|
||||
if (errno) {
|
||||
++errors;
|
||||
}
|
||||
}
|
||||
|
||||
if (lease -> tstp) {
|
||||
t = gmtime (&lease -> tstp);
|
||||
@@ -127,6 +131,17 @@ int write_lease (lease)
|
||||
++errors;
|
||||
}
|
||||
}
|
||||
if (lease -> cltt) {
|
||||
t = gmtime (&lease -> cltt);
|
||||
errno = 0;
|
||||
fprintf (db_file, "\n cltt %d %d/%02d/%02d %02d:%02d:%02d;",
|
||||
t -> tm_wday, t -> tm_year + 1900,
|
||||
t -> tm_mon + 1, t -> tm_mday,
|
||||
t -> tm_hour, t -> tm_min, t -> tm_sec);
|
||||
if (errno) {
|
||||
++errors;
|
||||
}
|
||||
}
|
||||
|
||||
if (lease -> flags & PEER_IS_OWNER) {
|
||||
errno = 0;
|
||||
@@ -503,7 +518,7 @@ int write_failover_state (dhcp_failover_state_t *state)
|
||||
int errors = 0;
|
||||
|
||||
errno = 0;
|
||||
fprintf (db_file, "failover peer \"%s\" state {", state -> name);
|
||||
fprintf (db_file, "\nfailover peer \"%s\" state {", state -> name);
|
||||
if (errno)
|
||||
++errors;
|
||||
|
||||
@@ -527,7 +542,7 @@ int write_failover_state (dhcp_failover_state_t *state)
|
||||
t -> tm_hour, t -> tm_min, t -> tm_sec);
|
||||
if (errno)
|
||||
++errors;
|
||||
fprintf (db_file, "\n}\n\n");
|
||||
fprintf (db_file, "\n}\n");
|
||||
if (errno)
|
||||
++errors;
|
||||
|
||||
|
@@ -43,7 +43,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"$Id: dhcp.c,v 1.147 2000/05/03 23:03:50 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
|
||||
"$Id: dhcp.c,v 1.148 2000/05/04 18:58:13 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
@@ -172,6 +172,10 @@ void dhcpdiscover (packet, ms_nulltp)
|
||||
packet -> shared_network -> name);
|
||||
return;
|
||||
}
|
||||
#if defined (FAILOVER_PROTOCOL)
|
||||
if (lease -> pool && lease -> pool -> failover_peer)
|
||||
dhcp_failover_pool_check (lease -> pool);
|
||||
#endif
|
||||
allocatedp = 1;
|
||||
}
|
||||
|
||||
@@ -1493,7 +1497,7 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp)
|
||||
#if defined (FAILOVER_PROTOCOL)
|
||||
/* Okay, we know the lease duration. Now check the
|
||||
failover state, if any. */
|
||||
if (lease -> pool -> shared_network -> failover_peer) {
|
||||
if (lease -> pool -> failover_peer) {
|
||||
dhcp_failover_state_t *peer =
|
||||
lease -> pool -> failover_peer;
|
||||
|
||||
@@ -1507,11 +1511,9 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp)
|
||||
/* 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);
|
||||
}
|
||||
if (cur_time + lease_time > lease -> tstp)
|
||||
lt.tstp = cur_time + lease_time;
|
||||
|
||||
/* 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
|
||||
@@ -1526,6 +1528,7 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp)
|
||||
lease_time = (lease -> tsfp - cur_time
|
||||
+ peer -> mclt);
|
||||
}
|
||||
lt.cltt = cur_time;
|
||||
}
|
||||
#endif /* FAILOVER_PROTOCOL */
|
||||
|
||||
@@ -1608,7 +1611,7 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp)
|
||||
if (ms_nulltp)
|
||||
lease -> flags |= MS_NULL_TERMINATION;
|
||||
else
|
||||
lease -> flags &= MS_NULL_TERMINATION;
|
||||
lease -> flags &= ~MS_NULL_TERMINATION;
|
||||
|
||||
/* If there are statements to execute when the lease is
|
||||
committed, execute them. */
|
||||
@@ -1646,7 +1649,8 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp)
|
||||
and we can't write the lease, don't ACK it (or BOOTREPLY
|
||||
it) either. */
|
||||
|
||||
if (!(supersede_lease (lease, <, !offer || offer == DHCPACK)
|
||||
if (!(supersede_lease (lease, <, !offer || offer == DHCPACK,
|
||||
offer == DHCPACK)
|
||||
|| (offer && offer != DHCPACK))) {
|
||||
log_info ("%s: database update failed", msg);
|
||||
free_lease_state (state, MDL);
|
||||
|
@@ -43,7 +43,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"$Id: failover.c,v 1.12 2000/05/03 23:07:54 mellon Exp $ Copyright (c) 1999-2000 The Internet Software Consortium. All rights reserved.\n";
|
||||
"$Id: failover.c,v 1.13 2000/05/04 18:58:15 mellon Exp $ Copyright (c) 1999-2000 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
@@ -1147,9 +1147,15 @@ isc_result_t dhcp_failover_state_signal (omapi_object_t *o,
|
||||
omapi_disconnect (link -> outer, 1);
|
||||
return ISC_R_SUCCESS;
|
||||
} else if (link -> imsg -> type == FTM_BNDUPD) {
|
||||
dhcp_failover_process_bindupdate (state, link -> imsg);
|
||||
dhcp_failover_process_bind_update (state,
|
||||
link -> imsg);
|
||||
} else if (link -> imsg -> type == FTM_BNDACK) {
|
||||
dhcp_failover_process_bindack (state, link -> imsg);
|
||||
dhcp_failover_process_bind_ack (state, link -> imsg);
|
||||
} else if (link -> imsg -> type == FTM_POOLREQ) {
|
||||
dhcp_failover_pool_rebalance (state);
|
||||
} else if (link -> imsg -> type == FTM_POOLRESP) {
|
||||
log_info ("pool response: %d leases",
|
||||
link -> imsg -> addresses_transferred);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1336,6 +1342,7 @@ isc_result_t dhcp_failover_set_state (dhcp_failover_state_t *state,
|
||||
state -> update_queue_head) {
|
||||
dhcp_failover_send_updates (state);
|
||||
}
|
||||
dhcp_failover_state_pool_check (state);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -1344,11 +1351,110 @@ isc_result_t dhcp_failover_set_state (dhcp_failover_state_t *state,
|
||||
return ISC_R_SUCCESS;
|
||||
}
|
||||
|
||||
int dhcp_failover_pool_rebalance (dhcp_failover_state_t *state)
|
||||
{
|
||||
int lts;
|
||||
int leases_queued = 0;
|
||||
struct lease *lp;
|
||||
struct shared_network *s;
|
||||
struct pool *p;
|
||||
|
||||
if (state -> my_state != normal || state -> i_am == secondary)
|
||||
return 0;
|
||||
|
||||
for (s = shared_networks; s; s = s -> next) {
|
||||
for (p = s -> pools; p; p = p -> next) {
|
||||
if (p -> failover_peer != state)
|
||||
continue;
|
||||
log_info ("pool %lx total %d local free %d peer free %d",
|
||||
(unsigned long)p, p -> lease_count,
|
||||
p -> local_leases, p -> peer_leases);
|
||||
|
||||
lts = ((p -> local_leases +
|
||||
p -> peer_leases) / 2) - p -> peer_leases;
|
||||
if (lts > 1) {
|
||||
struct lease lt;
|
||||
|
||||
leases_queued += lts;
|
||||
for (lp = p -> last_lease; lp && lts;
|
||||
lp = lp -> prev) {
|
||||
if (!(lp -> flags & PEER_IS_OWNER)) {
|
||||
lp -> flags |= PEER_IS_OWNER;
|
||||
lp -> tstp = cur_time;
|
||||
if (!write_lease (lp) ||
|
||||
!commit_leases () ||
|
||||
!dhcp_failover_queue_update (lp)) {
|
||||
log_info ("%s lease %s on giveaway",
|
||||
"unable to commit",
|
||||
piaddr (lp -> ip_addr));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (lts > 1) {
|
||||
log_info ("lease imbalance - lts = %d", lts);
|
||||
leases_queued -= lts;
|
||||
}
|
||||
}
|
||||
}
|
||||
dhcp_failover_send_poolresp (state, leases_queued);
|
||||
return leases_queued;
|
||||
}
|
||||
|
||||
int dhcp_failover_pool_check (struct pool *pool)
|
||||
{
|
||||
int lts;
|
||||
struct lease *lp;
|
||||
|
||||
if (!pool -> failover_peer ||
|
||||
pool -> failover_peer -> i_am == primary ||
|
||||
pool -> failover_peer -> my_state != normal)
|
||||
return 0;
|
||||
|
||||
log_info ("pool %lx total %d local free %d peer free %d",
|
||||
(unsigned long)pool, pool -> lease_count,
|
||||
pool -> local_leases, pool -> peer_leases);
|
||||
|
||||
lts = ((pool -> local_leases +
|
||||
pool -> peer_leases) / 2) - pool -> local_leases;
|
||||
if (lts > 1) {
|
||||
/* XXX What about multiple pools? */
|
||||
dhcp_failover_send_poolreq (pool -> failover_peer);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dhcp_failover_state_pool_check (dhcp_failover_state_t *state)
|
||||
{
|
||||
struct lease *lp;
|
||||
struct shared_network *s;
|
||||
struct pool *p;
|
||||
|
||||
for (s = shared_networks; s; s = s -> next) {
|
||||
for (p = s -> pools; p; p = p -> next) {
|
||||
if (p -> failover_peer != state)
|
||||
continue;
|
||||
/* Only need to request rebalance on one pool. */
|
||||
if (dhcp_failover_pool_check (p))
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
isc_result_t dhcp_failover_send_updates (dhcp_failover_state_t *state)
|
||||
{
|
||||
struct lease *lp = (struct lease *)0;
|
||||
isc_result_t status;
|
||||
|
||||
/* Can't update peer if we're not talking to it! */
|
||||
if (state -> my_state != normal &&
|
||||
state -> my_state != recover &&
|
||||
state -> my_state != potential_conflict)
|
||||
return ISC_R_SUCCESS;
|
||||
|
||||
while (state -> max_flying_updates > state -> cur_unacked_updates &&
|
||||
state -> update_queue_head) {
|
||||
/* Grab the head of the update queue. */
|
||||
@@ -1359,7 +1465,7 @@ isc_result_t dhcp_failover_send_updates (dhcp_failover_state_t *state)
|
||||
/* Send the update to the peer. */
|
||||
status = dhcp_failover_send_bind_update (state, lp);
|
||||
if (status != ISC_R_SUCCESS) {
|
||||
omapi_object_dereference ((omapi_object_t **)lp, MDL);
|
||||
omapi_object_dereference ((omapi_object_t **)&lp, MDL);
|
||||
return status;
|
||||
}
|
||||
lp -> flags &= ~ON_UPDATE_QUEUE;
|
||||
@@ -1374,7 +1480,7 @@ isc_result_t dhcp_failover_send_updates (dhcp_failover_state_t *state)
|
||||
(omapi_object_t *)
|
||||
lp -> next_pending, MDL);
|
||||
omapi_object_dereference ((omapi_object_t **)
|
||||
lp -> next_pending, MDL);
|
||||
&lp -> next_pending, MDL);
|
||||
} else {
|
||||
omapi_object_dereference ((omapi_object_t **)
|
||||
&state -> update_queue_tail,
|
||||
@@ -1398,7 +1504,7 @@ isc_result_t dhcp_failover_send_updates (dhcp_failover_state_t *state)
|
||||
&state -> ack_queue_tail,
|
||||
(omapi_object_t *)lp, MDL);
|
||||
lp -> flags |= ON_ACK_QUEUE;
|
||||
omapi_object_dereference ((omapi_object_t **)lp, MDL);
|
||||
omapi_object_dereference ((omapi_object_t **)&lp, MDL);
|
||||
|
||||
/* Count the object as an unacked update. */
|
||||
state -> cur_unacked_updates++;
|
||||
@@ -1478,15 +1584,15 @@ void dhcp_failover_ack_queue_remove (dhcp_failover_state_t *state,
|
||||
&lp -> next_pending, MDL);
|
||||
if (lease -> next_pending)
|
||||
omapi_object_reference ((omapi_object_t **)
|
||||
lp -> next_pending,
|
||||
&lp -> next_pending,
|
||||
(omapi_object_t *)
|
||||
lease -> next_pending, MDL);
|
||||
else {
|
||||
omapi_object_dereference ((omapi_object_t **)
|
||||
state -> ack_queue_tail,
|
||||
&state -> ack_queue_tail,
|
||||
MDL);
|
||||
omapi_object_reference ((omapi_object_t **)
|
||||
state -> ack_queue_tail,
|
||||
&state -> ack_queue_tail,
|
||||
(omapi_object_t *)lp, MDL);
|
||||
}
|
||||
}
|
||||
@@ -2080,6 +2186,28 @@ const char *dhcp_failover_state_name_print (enum failover_state state)
|
||||
}
|
||||
}
|
||||
|
||||
failover_option_t *dhcp_failover_option_printf (unsigned code,
|
||||
char *obuf,
|
||||
unsigned *obufix,
|
||||
unsigned obufmax,
|
||||
const char *fmt, ...) {
|
||||
va_list va;
|
||||
char tbuf [256];
|
||||
|
||||
va_start (va, fmt);
|
||||
#if defined (HAVE_SNPRINTF)
|
||||
/* Presumably if we have snprintf, we also have
|
||||
vsnprintf. */
|
||||
vsnprintf (tbuf, sizeof tbuf, fmt, va);
|
||||
#else
|
||||
vsprintf (tbuf, fmt, va);
|
||||
#endif
|
||||
va_end (va);
|
||||
|
||||
return dhcp_failover_make_option (code, obuf, obufix, obufmax,
|
||||
strlen (tbuf), tbuf);
|
||||
}
|
||||
|
||||
failover_option_t *dhcp_failover_make_option (unsigned code,
|
||||
char *obuf, unsigned *obufix,
|
||||
unsigned obufmax, ...)
|
||||
@@ -2092,10 +2220,11 @@ failover_option_t *dhcp_failover_make_option (unsigned code,
|
||||
u_int8_t *iaddr;
|
||||
unsigned ilen;
|
||||
u_int8_t *bval;
|
||||
char *fmt;
|
||||
char *txt;
|
||||
#if defined (DEBUG_FAILOVER_MESSAGES)
|
||||
char tbuf [256];
|
||||
#endif
|
||||
|
||||
/* Note that the failover_option structure is used differently on
|
||||
input than on output - on input, count is an element count, and
|
||||
on output it's the number of bytes total in the option, including
|
||||
@@ -2133,21 +2262,14 @@ failover_option_t *dhcp_failover_make_option (unsigned code,
|
||||
|
||||
case FT_TEXT_OR_BYTES:
|
||||
case FT_TEXT:
|
||||
fmt = va_arg (va, char *);
|
||||
#if defined (HAVE_SNPRINTF)
|
||||
/* Presumably if we have snprintf, we also have
|
||||
vsnprintf. */
|
||||
vsnprintf (tbuf, sizeof tbuf, fmt, va);
|
||||
#else
|
||||
vsprintf (tbuf, fmt, va);
|
||||
#endif
|
||||
size = strlen (tbuf);
|
||||
count = size;
|
||||
txt = va_arg (va, char *);
|
||||
size = count;
|
||||
break;
|
||||
|
||||
case FT_IPADDR:
|
||||
ilen = va_arg (va, unsigned);
|
||||
size = count * ilen;
|
||||
break;
|
||||
|
||||
case FT_UINT32:
|
||||
size = count * 4;
|
||||
@@ -2248,11 +2370,10 @@ failover_option_t *dhcp_failover_make_option (unsigned code,
|
||||
case FT_TEXT_OR_BYTES:
|
||||
case FT_TEXT:
|
||||
#if defined (DEBUG_FAILOVER_MESSAGES)
|
||||
failover_print (obuf, obufix, obufmax, " \"");
|
||||
sprintf (tbuf, "\"%s\"", txt);
|
||||
failover_print (obuf, obufix, obufmax, tbuf);
|
||||
failover_print (obuf, obufix, obufmax, "\"");
|
||||
#endif
|
||||
memcpy (&option.data [4], tbuf, count);
|
||||
memcpy (&option.data [4], txt, count);
|
||||
break;
|
||||
|
||||
case FT_DDNS:
|
||||
@@ -2427,7 +2548,7 @@ isc_result_t dhcp_failover_send_connect (omapi_object_t *l)
|
||||
state -> max_flying_updates),
|
||||
dhcp_failover_make_option (FTO_RECEIVE_TIMER, FMA,
|
||||
state -> max_response_delay),
|
||||
dhcp_failover_make_option (FTO_VENDOR_CLASS, FMA,
|
||||
dhcp_failover_option_printf (FTO_VENDOR_CLASS, FMA,
|
||||
"isc-%s", DHCP_VERSION),
|
||||
dhcp_failover_make_option (FTO_PROTOCOL_VERSION, FMA,
|
||||
DHCP_FAILOVER_VERSION),
|
||||
@@ -2481,7 +2602,7 @@ isc_result_t dhcp_failover_send_connectack (omapi_object_t *l, int reason)
|
||||
state -> max_flying_updates),
|
||||
dhcp_failover_make_option (FTO_RECEIVE_TIMER, FMA,
|
||||
state -> max_response_delay),
|
||||
dhcp_failover_make_option (FTO_VENDOR_CLASS, FMA,
|
||||
dhcp_failover_option_printf (FTO_VENDOR_CLASS, FMA,
|
||||
"isc-%s", DHCP_VERSION),
|
||||
dhcp_failover_make_option (FTO_PROTOCOL_VERSION, FMA,
|
||||
DHCP_FAILOVER_VERSION),
|
||||
@@ -2528,18 +2649,18 @@ isc_result_t dhcp_failover_send_disconnect (omapi_object_t *l,
|
||||
if (!l -> outer || l -> outer -> type != omapi_type_connection)
|
||||
return ISC_R_INVALIDARG;
|
||||
|
||||
if (!message && reason)
|
||||
message = dhcp_failover_reject_reason_print (reason);
|
||||
|
||||
status = (dhcp_failover_put_message
|
||||
(link, l -> outer,
|
||||
FTM_DISCONNECT,
|
||||
dhcp_failover_make_option (FTO_REJECT_REASON,
|
||||
FMA, reason),
|
||||
(message
|
||||
? dhcp_failover_make_option (FTO_MESSAGE, FMA, message)
|
||||
: (reason
|
||||
? (dhcp_failover_make_option
|
||||
(FTO_MESSAGE,
|
||||
FMA, dhcp_failover_reject_reason_print (reason)))
|
||||
: &skip_failover_option)),
|
||||
? dhcp_failover_make_option (FTO_MESSAGE, FMA,
|
||||
strlen (message), message)
|
||||
: &skip_failover_option),
|
||||
(failover_option_t *)0));
|
||||
|
||||
#if defined (DEBUG_FAILOVER_MESSAGES)
|
||||
@@ -2563,6 +2684,7 @@ isc_result_t dhcp_failover_send_bind_update (dhcp_failover_state_t *state,
|
||||
#if defined (DEBUG_FAILOVER_MESSAGES)
|
||||
char obuf [64];
|
||||
unsigned obufix = 0;
|
||||
int binding_status;
|
||||
|
||||
# define FMA obuf, &obufix, sizeof obuf
|
||||
failover_print (FMA, "(bndupd");
|
||||
@@ -2578,6 +2700,27 @@ isc_result_t dhcp_failover_send_bind_update (dhcp_failover_state_t *state,
|
||||
if (!link -> outer || link -> outer -> type != omapi_type_connection)
|
||||
return ISC_R_INVALIDARG;
|
||||
|
||||
/* Kludge up the binding status. */
|
||||
if (lease -> flags & ABANDONED)
|
||||
binding_status = FTS_ABANDONED;
|
||||
else if (lease -> tsfp <= cur_time) {
|
||||
if (lease -> flags & PEER_IS_OWNER) {
|
||||
if (state -> i_am == primary)
|
||||
binding_status = FTS_BACKUP;
|
||||
else
|
||||
binding_status = FTS_FREE;
|
||||
} else {
|
||||
if (state -> i_am == primary)
|
||||
binding_status = FTS_FREE;
|
||||
else
|
||||
binding_status = FTS_BACKUP;
|
||||
}
|
||||
} else if (lease -> ends <= cur_time) {
|
||||
binding_status = FTS_EXPIRED;
|
||||
} else
|
||||
binding_status = FTS_ACTIVE;
|
||||
|
||||
/* Send the update. */
|
||||
status = (dhcp_failover_put_message
|
||||
(link, link -> outer,
|
||||
FTM_BNDUPD,
|
||||
@@ -2585,15 +2728,17 @@ isc_result_t dhcp_failover_send_bind_update (dhcp_failover_state_t *state,
|
||||
lease -> ip_addr.len,
|
||||
lease -> ip_addr.iabuf),
|
||||
dhcp_failover_make_option (FTO_BINDING_STATUS, FMA,
|
||||
0 /* ??? */),
|
||||
binding_status),
|
||||
lease -> uid_len
|
||||
? dhcp_failover_make_option (FTO_CLIENT_IDENTIFIER, FMA,
|
||||
lease -> uid_len,
|
||||
lease -> uid)
|
||||
: &skip_failover_option,
|
||||
dhcp_failover_make_option (FTO_CHADDR, FMA,
|
||||
lease -> hardware_addr.hlen
|
||||
? dhcp_failover_make_option (FTO_CHADDR, FMA,
|
||||
lease -> hardware_addr.hlen,
|
||||
lease -> hardware_addr.hbuf),
|
||||
lease -> hardware_addr.hbuf)
|
||||
: &skip_failover_option,
|
||||
dhcp_failover_make_option (FTO_LEASE_EXPIRY, FMA,
|
||||
lease -> ends),
|
||||
dhcp_failover_make_option (FTO_POTENTIAL_EXPIRY, FMA,
|
||||
@@ -2618,15 +2763,314 @@ isc_result_t dhcp_failover_send_bind_update (dhcp_failover_state_t *state,
|
||||
return status;
|
||||
}
|
||||
|
||||
isc_result_t dhcp_failover_process_bindupdate (dhcp_failover_state_t *state,
|
||||
failover_message_t *msg) {
|
||||
log_info ("failover: bind update.");
|
||||
/* Send a Bind ACK message. */
|
||||
|
||||
isc_result_t dhcp_failover_send_bind_ack (dhcp_failover_state_t *state,
|
||||
struct lease *lease,
|
||||
failover_message_t *msg,
|
||||
int reason, const char *message)
|
||||
{
|
||||
dhcp_failover_link_t *link;
|
||||
isc_result_t status;
|
||||
#if defined (DEBUG_FAILOVER_MESSAGES)
|
||||
char obuf [64];
|
||||
unsigned obufix = 0;
|
||||
int binding_status;
|
||||
|
||||
# define FMA obuf, &obufix, sizeof obuf
|
||||
failover_print (FMA, "(bndack");
|
||||
#else
|
||||
# define FMA (unsigned char *)0, (unsigned *)0, 0
|
||||
#endif
|
||||
|
||||
if (!state -> link_to_peer ||
|
||||
state -> link_to_peer -> type != dhcp_type_failover_link)
|
||||
return ISC_R_INVALIDARG;
|
||||
link = (dhcp_failover_link_t *)state -> link_to_peer;
|
||||
|
||||
if (!link -> outer || link -> outer -> type != omapi_type_connection)
|
||||
return ISC_R_INVALIDARG;
|
||||
|
||||
/* Kludge up the binding status. */
|
||||
if (lease -> flags & ABANDONED)
|
||||
binding_status = FTS_ABANDONED;
|
||||
else if (lease -> tsfp <= cur_time) {
|
||||
if (lease -> flags & PEER_IS_OWNER) {
|
||||
if (state -> i_am == primary)
|
||||
binding_status = FTS_BACKUP;
|
||||
else
|
||||
binding_status = FTS_FREE;
|
||||
} else {
|
||||
if (state -> i_am == primary)
|
||||
binding_status = FTS_FREE;
|
||||
else
|
||||
binding_status = FTS_BACKUP;
|
||||
}
|
||||
} else if (lease -> ends <= cur_time) {
|
||||
binding_status = FTS_EXPIRED;
|
||||
} else
|
||||
binding_status = FTS_ACTIVE;
|
||||
|
||||
if (!message && reason)
|
||||
message = dhcp_failover_reject_reason_print (reason);
|
||||
|
||||
/* Send the update. */
|
||||
status = (dhcp_failover_put_message
|
||||
(link, link -> outer,
|
||||
FTM_BNDACK,
|
||||
dhcp_failover_make_option (FTO_ASSIGNED_IP_ADDRESS, FMA,
|
||||
lease -> ip_addr.len,
|
||||
lease -> ip_addr.iabuf),
|
||||
dhcp_failover_make_option (FTO_BINDING_STATUS, FMA,
|
||||
binding_status),
|
||||
lease -> uid_len
|
||||
? dhcp_failover_make_option (FTO_CLIENT_IDENTIFIER, FMA,
|
||||
lease -> uid_len,
|
||||
lease -> uid)
|
||||
: &skip_failover_option,
|
||||
lease -> hardware_addr.hlen
|
||||
? dhcp_failover_make_option (FTO_CHADDR, FMA,
|
||||
lease -> hardware_addr.hlen,
|
||||
lease -> hardware_addr.hbuf)
|
||||
: &skip_failover_option,
|
||||
dhcp_failover_make_option (FTO_LEASE_EXPIRY, FMA,
|
||||
msg -> expiry),
|
||||
dhcp_failover_make_option (FTO_POTENTIAL_EXPIRY, FMA,
|
||||
msg -> potential_expiry),
|
||||
dhcp_failover_make_option (FTO_STOS, FMA,
|
||||
msg -> stos),
|
||||
dhcp_failover_make_option (FTO_CLTT, FMA,
|
||||
msg -> client_ltt),
|
||||
reason
|
||||
? dhcp_failover_make_option (FTO_REJECT_REASON,
|
||||
FMA, reason)
|
||||
: &skip_failover_option,
|
||||
(message
|
||||
? dhcp_failover_make_option (FTO_MESSAGE, FMA,
|
||||
strlen (message), message)
|
||||
: &skip_failover_option),
|
||||
&skip_failover_option, /* XXX DDNS */
|
||||
&skip_failover_option, /* XXX request options */
|
||||
&skip_failover_option, /* XXX reply options */
|
||||
(failover_option_t *)0));
|
||||
|
||||
#if defined (DEBUG_FAILOVER_MESSAGES)
|
||||
if (status != ISC_R_SUCCESS)
|
||||
failover_print (FMA, " (failed)");
|
||||
failover_print (FMA, ")");
|
||||
if (obufix) {
|
||||
log_debug ("%s", obuf);
|
||||
}
|
||||
#endif
|
||||
return status;
|
||||
}
|
||||
|
||||
isc_result_t dhcp_failover_send_poolreq (dhcp_failover_state_t *state)
|
||||
{
|
||||
dhcp_failover_link_t *link;
|
||||
isc_result_t status;
|
||||
#if defined (DEBUG_FAILOVER_MESSAGES)
|
||||
char obuf [64];
|
||||
unsigned obufix = 0;
|
||||
|
||||
# define FMA obuf, &obufix, sizeof obuf
|
||||
failover_print (FMA, "(poolreq");
|
||||
#else
|
||||
# define FMA (unsigned char *)0, (unsigned *)0, 0
|
||||
#endif
|
||||
|
||||
if (!state -> link_to_peer ||
|
||||
state -> link_to_peer -> type != dhcp_type_failover_link)
|
||||
return ISC_R_INVALIDARG;
|
||||
link = (dhcp_failover_link_t *)state -> link_to_peer;
|
||||
|
||||
if (!link -> outer || link -> outer -> type != omapi_type_connection)
|
||||
return ISC_R_INVALIDARG;
|
||||
|
||||
status = (dhcp_failover_put_message
|
||||
(link, link -> outer,
|
||||
FTM_POOLREQ,
|
||||
(failover_option_t *)0));
|
||||
|
||||
#if defined (DEBUG_FAILOVER_MESSAGES)
|
||||
if (status != ISC_R_SUCCESS)
|
||||
failover_print (FMA, " (failed)");
|
||||
failover_print (FMA, ")");
|
||||
if (obufix) {
|
||||
log_debug ("%s", obuf);
|
||||
}
|
||||
#endif
|
||||
return status;
|
||||
}
|
||||
|
||||
isc_result_t dhcp_failover_send_poolresp (dhcp_failover_state_t *state,
|
||||
int leases)
|
||||
{
|
||||
dhcp_failover_link_t *link;
|
||||
isc_result_t status;
|
||||
#if defined (DEBUG_FAILOVER_MESSAGES)
|
||||
char obuf [64];
|
||||
unsigned obufix = 0;
|
||||
|
||||
# define FMA obuf, &obufix, sizeof obuf
|
||||
failover_print (FMA, "(poolreq");
|
||||
#else
|
||||
# define FMA (unsigned char *)0, (unsigned *)0, 0
|
||||
#endif
|
||||
|
||||
if (!state -> link_to_peer ||
|
||||
state -> link_to_peer -> type != dhcp_type_failover_link)
|
||||
return ISC_R_INVALIDARG;
|
||||
link = (dhcp_failover_link_t *)state -> link_to_peer;
|
||||
|
||||
if (!link -> outer || link -> outer -> type != omapi_type_connection)
|
||||
return ISC_R_INVALIDARG;
|
||||
|
||||
status = (dhcp_failover_put_message
|
||||
(link, link -> outer,
|
||||
FTM_POOLREQ,
|
||||
dhcp_failover_make_option (FTO_ADDRESSES_TRANSFERRED, FMA,
|
||||
leases),
|
||||
(failover_option_t *)0));
|
||||
|
||||
#if defined (DEBUG_FAILOVER_MESSAGES)
|
||||
if (status != ISC_R_SUCCESS)
|
||||
failover_print (FMA, " (failed)");
|
||||
failover_print (FMA, ")");
|
||||
if (obufix) {
|
||||
log_debug ("%s", obuf);
|
||||
}
|
||||
#endif
|
||||
return status;
|
||||
}
|
||||
|
||||
isc_result_t dhcp_failover_process_bind_update (dhcp_failover_state_t *state,
|
||||
failover_message_t *msg)
|
||||
{
|
||||
struct lease lt, *lease;
|
||||
struct iaddr ia;
|
||||
|
||||
ia.len = sizeof msg -> assigned_addr;
|
||||
memcpy (ia.iabuf, &msg -> assigned_addr, ia.len);
|
||||
|
||||
lease = find_lease_by_ip_addr (ia);
|
||||
if (!lease) {
|
||||
log_info ("bind update on %s from %s: no such lease.",
|
||||
piaddr (ia), state -> name);
|
||||
return ISC_R_SUCCESS;
|
||||
}
|
||||
|
||||
/* XXX check for conflicts. */
|
||||
|
||||
/* Install the new info. */
|
||||
lt = *lease;
|
||||
lt.on_expiry = 0;
|
||||
lt.on_release = 0;
|
||||
lt.on_commit = 0;
|
||||
|
||||
if (msg -> options_present & FTB_CHADDR) {
|
||||
if (msg -> chaddr.count > sizeof lt.hardware_addr.hbuf) {
|
||||
log_info ("bind update on %s from %s: chaddr too long",
|
||||
piaddr (ia), state -> name);
|
||||
return ISC_R_SUCCESS;
|
||||
}
|
||||
lt.hardware_addr.hlen = msg -> chaddr.count;
|
||||
memcpy (lt.hardware_addr.hbuf, msg -> chaddr.data,
|
||||
msg -> chaddr.count);
|
||||
}
|
||||
|
||||
if (msg -> options_present & FTB_CLIENT_IDENTIFIER) {
|
||||
lt.uid_len = msg -> client_identifier.count;
|
||||
if (lt.uid_len > sizeof lt.uid_buf) {
|
||||
lt.uid_max = lt.uid_len;
|
||||
lt.uid = dmalloc (lt.uid_len, MDL);
|
||||
if (!lt.uid)
|
||||
return ISC_R_SUCCESS;
|
||||
} else {
|
||||
lt.uid_max = sizeof lt.uid_buf;
|
||||
lt.uid = lt.uid_buf;
|
||||
}
|
||||
memcpy (lt.uid, msg -> client_identifier.data, lt.uid_len);
|
||||
}
|
||||
|
||||
/* XXX Times may need to be adjusted based on clock skew! */
|
||||
if (msg -> options_present & FTB_STOS) {
|
||||
lt.starts = msg -> stos;
|
||||
}
|
||||
if (msg -> options_present & FTB_LEASE_EXPIRY) {
|
||||
lt.ends = msg -> expiry;
|
||||
}
|
||||
if (msg -> options_present & FTB_CLTT) {
|
||||
lt.cltt = msg -> client_ltt;
|
||||
}
|
||||
if (msg -> options_present & FTB_POTENTIAL_EXPIRY) {
|
||||
lt.tsfp = msg -> potential_expiry;
|
||||
}
|
||||
|
||||
if (msg -> options_present & FTB_BINDING_STATUS) {
|
||||
if (state -> i_am == primary) {
|
||||
if (msg -> binding_status == FTS_BACKUP)
|
||||
lease -> flags |= PEER_IS_OWNER;
|
||||
else if (msg -> binding_status == FTS_FREE)
|
||||
lease -> flags &= ~PEER_IS_OWNER;
|
||||
} else {
|
||||
if (msg -> binding_status == FTS_BACKUP)
|
||||
lease -> flags &= PEER_IS_OWNER;
|
||||
else if (msg -> binding_status == FTS_FREE)
|
||||
lease -> flags |= ~PEER_IS_OWNER;
|
||||
}
|
||||
}
|
||||
|
||||
/* Try to install the new information. */
|
||||
if (!supersede_lease (lease, <, 1, 0)) {
|
||||
dhcp_failover_send_bind_ack (state, lease, msg,
|
||||
FTR_MISC_REJECT,
|
||||
"database update failed.");
|
||||
} else
|
||||
dhcp_failover_send_bind_ack (state, lease, msg, 0, 0);
|
||||
|
||||
return ISC_R_SUCCESS;
|
||||
}
|
||||
|
||||
isc_result_t dhcp_failover_process_bindack (dhcp_failover_state_t *state,
|
||||
failover_message_t *msg) {
|
||||
log_info ("failover: bind ack.");
|
||||
isc_result_t dhcp_failover_process_bind_ack (dhcp_failover_state_t *state,
|
||||
failover_message_t *msg)
|
||||
{
|
||||
struct lease lt, *lease;
|
||||
struct iaddr ia;
|
||||
|
||||
ia.len = sizeof msg -> assigned_addr;
|
||||
memcpy (ia.iabuf, &msg -> assigned_addr, ia.len);
|
||||
|
||||
lease = find_lease_by_ip_addr (ia);
|
||||
if (!lease) {
|
||||
log_info ("bind update on %s from %s: no such lease.",
|
||||
piaddr (ia), state -> name);
|
||||
return ISC_R_SUCCESS;
|
||||
}
|
||||
|
||||
/* XXX check for conflicts. */
|
||||
|
||||
/* Install the new info. */
|
||||
lt = *lease;
|
||||
lt.on_expiry = 0;
|
||||
lt.on_release = 0;
|
||||
lt.on_commit = 0;
|
||||
|
||||
/* XXX Times may need to be adjusted based on clock skew! */
|
||||
if (msg -> options_present & FTB_POTENTIAL_EXPIRY) {
|
||||
lt.tsfp = msg -> potential_expiry;
|
||||
}
|
||||
|
||||
/* Try to install the new information. */
|
||||
supersede_lease (lease, <, 1, 0);
|
||||
|
||||
state -> cur_unacked_updates--;
|
||||
dhcp_failover_ack_queue_remove (state, lease);
|
||||
|
||||
/* If there are updates pending, we've created space to send at
|
||||
least one. */
|
||||
dhcp_failover_send_updates (state);
|
||||
|
||||
return ISC_R_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -2655,10 +3099,6 @@ void failover_print (char *obuf,
|
||||
}
|
||||
#endif /* defined (DEBUG_FAILOVER_MESSAGES) */
|
||||
|
||||
void update_partner (struct lease *lease)
|
||||
{
|
||||
}
|
||||
|
||||
/* Taken from draft-ietf-dhc-loadb-01.txt: */
|
||||
/* A "mixing table" of 256 distinct values, in pseudo-random order. */
|
||||
unsigned char loadb_mx_tbl[256] = {
|
||||
|
80
server/mdb.c
80
server/mdb.c
@@ -43,13 +43,13 @@
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"$Id: mdb.c,v 1.30 2000/05/03 06:34:13 mellon Exp $ Copyright (c) 1996-2000 The Internet Software Consortium. All rights reserved.\n";
|
||||
"$Id: mdb.c,v 1.31 2000/05/04 18:58:16 mellon Exp $ Copyright (c) 1996-2000 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
|
||||
static struct subnet *subnets;
|
||||
static struct shared_network *shared_networks;
|
||||
struct subnet *subnets;
|
||||
struct shared_network *shared_networks;
|
||||
struct hash_table *host_hw_addr_hash;
|
||||
struct hash_table *host_uid_hash;
|
||||
struct hash_table *lease_uid_hash;
|
||||
@@ -622,6 +622,7 @@ void new_address_range (low, high, subnet, pool)
|
||||
address_range [i].ip_addr.iabuf,
|
||||
address_range [i].ip_addr.len,
|
||||
(unsigned char *)&address_range [i]);
|
||||
address_range [i].refcnt = 1; /* XXX */
|
||||
}
|
||||
|
||||
/* Find out if any dangling leases are in range... */
|
||||
@@ -647,7 +648,7 @@ void new_address_range (low, high, subnet, pool)
|
||||
address_range [lhost - i].hostname = lp -> hostname;
|
||||
address_range [lhost - i].client_hostname =
|
||||
lp -> client_hostname;
|
||||
supersede_lease (&address_range [lhost - i], lp, 0);
|
||||
supersede_lease (&address_range [lhost - i], lp, 0, 0);
|
||||
free_lease (lp, MDL);
|
||||
} else
|
||||
plp = lp;
|
||||
@@ -808,7 +809,7 @@ void enter_lease (lease)
|
||||
/* Record the hostname information in the lease. */
|
||||
comp -> hostname = lease -> hostname;
|
||||
comp -> client_hostname = lease -> client_hostname;
|
||||
supersede_lease (comp, lease, 0);
|
||||
supersede_lease (comp, lease, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -817,9 +818,10 @@ void enter_lease (lease)
|
||||
list of leases by expiry time so that we can always find the oldest
|
||||
lease. */
|
||||
|
||||
int supersede_lease (comp, lease, commit)
|
||||
int supersede_lease (comp, lease, commit, propogate)
|
||||
struct lease *comp, *lease;
|
||||
int commit;
|
||||
int propogate;
|
||||
{
|
||||
int enter_uid = 0;
|
||||
int enter_hwaddr = 0;
|
||||
@@ -1048,6 +1050,22 @@ int supersede_lease (comp, lease, commit)
|
||||
}
|
||||
}
|
||||
comp -> pool -> insertion_point = comp;
|
||||
#if defined (FAILOVER_PROTOCOL)
|
||||
if (comp -> ends <= cur_time && lease -> ends > cur_time) {
|
||||
if (lease -> flags & PEER_IS_OWNER)
|
||||
comp -> pool -> peer_leases--;
|
||||
else
|
||||
comp -> pool -> local_leases--;
|
||||
} else if (comp -> ends > cur_time && lease -> ends <= cur_time) {
|
||||
if (lease -> flags & PEER_IS_OWNER)
|
||||
comp -> pool -> peer_leases++;
|
||||
else
|
||||
comp -> pool -> local_leases++;
|
||||
}
|
||||
comp -> cltt = lease -> cltt;
|
||||
comp -> tstp = lease -> tstp;
|
||||
comp -> tsfp = lease -> tsfp;
|
||||
#endif /* FAILOVER_PROTOCOL */
|
||||
comp -> ends = lease -> ends;
|
||||
|
||||
/* If there's an expiry event on this lease, process it or
|
||||
@@ -1103,7 +1121,7 @@ int supersede_lease (comp, lease, commit)
|
||||
struct lease *foo;
|
||||
struct lease *install = comp;
|
||||
for (foo = comp;
|
||||
foo -> ends == comp -> ends;
|
||||
foo && foo -> ends == comp -> ends;
|
||||
foo = foo -> next) {
|
||||
#if !defined (FAILOVER_PROTOCOL)
|
||||
if (foo -> on_expiry)
|
||||
@@ -1122,7 +1140,7 @@ int supersede_lease (comp, lease, commit)
|
||||
nonzero if we did. */
|
||||
return commit && write_lease (comp) && commit_leases ()
|
||||
#if defined (FAILOVER_PROTOCOL)
|
||||
&& dhcp_failover_queue_update (comp)
|
||||
&& (!propogate || dhcp_failover_queue_update (comp))
|
||||
#endif
|
||||
;
|
||||
}
|
||||
@@ -1166,7 +1184,7 @@ void release_lease (lease, packet)
|
||||
|
||||
lt.ends = cur_time;
|
||||
lt.billing_class = (struct class *)0;
|
||||
supersede_lease (lease, <, 1);
|
||||
supersede_lease (lease, <, 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1198,7 +1216,7 @@ void abandon_lease (lease, message)
|
||||
lt.uid = (unsigned char *)0;
|
||||
lt.uid_len = 0;
|
||||
lt.billing_class = (struct class *)0;
|
||||
supersede_lease (lease, <, 1);
|
||||
supersede_lease (lease, <, 1, 1);
|
||||
}
|
||||
|
||||
/* Abandon the specified lease (set its timeout to infinity and its
|
||||
@@ -1225,7 +1243,7 @@ void dissociate_lease (lease)
|
||||
lt.uid = (unsigned char *)0;
|
||||
lt.uid_len = 0;
|
||||
lt.billing_class = (struct class *)0;
|
||||
supersede_lease (lease, <, 1);
|
||||
supersede_lease (lease, <, 1, 1);
|
||||
}
|
||||
|
||||
/* Timer called when a lease in a particular pool expires. */
|
||||
@@ -1260,10 +1278,6 @@ void pool_timer (vpool)
|
||||
if (lease -> on_release)
|
||||
executable_statement_dereference (&lease -> on_release,
|
||||
MDL);
|
||||
#if defined (FAILOVER_PROTOCOL)
|
||||
lease -> tstp = 0;
|
||||
update_partner (lease);
|
||||
#endif
|
||||
|
||||
/* There are two problems with writing the lease out here.
|
||||
|
||||
@@ -1290,9 +1304,9 @@ void pool_timer (vpool)
|
||||
}
|
||||
#if defined (FAILOVER_PROTOCOL)
|
||||
if (lease -> flags & PEER_IS_OWNER)
|
||||
pool -> peer_leases--;
|
||||
pool -> peer_leases++;
|
||||
else
|
||||
pool -> local_leases--;
|
||||
pool -> local_leases++;
|
||||
#endif
|
||||
}
|
||||
pool -> next_expiry = lease;
|
||||
@@ -1552,7 +1566,10 @@ void write_leases ()
|
||||
log_fatal ("Can't commit leases to new database: %m");
|
||||
}
|
||||
|
||||
/* Write all interesting leases to permanent storage. */
|
||||
/* Run expiry events on every pool. This is called on startup so that
|
||||
any expiry events that occurred after the server stopped and before it
|
||||
was restarted can be run. At the same time, if failover support is
|
||||
compiled in, we compute the balance of leases for the pool. */
|
||||
|
||||
void expire_all_pools ()
|
||||
{
|
||||
@@ -1560,12 +1577,35 @@ void expire_all_pools ()
|
||||
struct pool *p;
|
||||
struct hash_bucket *hb;
|
||||
int i;
|
||||
struct lease *l;
|
||||
|
||||
/* Loop through each pool in each shared network and call the
|
||||
expiry routine on the pool. */
|
||||
for (s = shared_networks; s; s = s -> next)
|
||||
for (p = s -> pools; p; p = p -> next)
|
||||
for (s = shared_networks; s; s = s -> next) {
|
||||
for (p = s -> pools; p; p = p -> next) {
|
||||
pool_timer (p);
|
||||
|
||||
#if defined (FAILOVER_PROTOCOL)
|
||||
p -> lease_count = 0;
|
||||
p -> local_leases = 0;
|
||||
p -> peer_leases = 0;
|
||||
|
||||
for (l = p -> leases; l; l = l -> next) {
|
||||
p -> lease_count++;
|
||||
if (l -> ends <= cur_time) {
|
||||
if (l -> flags & PEER_IS_OWNER)
|
||||
p -> peer_leases++;
|
||||
else
|
||||
p -> local_leases++;
|
||||
}
|
||||
if (p -> failover_peer &&
|
||||
l -> tstp > l -> tsfp &&
|
||||
!(l -> flags & ON_UPDATE_QUEUE))
|
||||
dhcp_failover_queue_update (l);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dump_subnets ()
|
||||
|
Reference in New Issue
Block a user