xref: /minix3/external/bsd/dhcp/dist/includes/failover.h (revision 83ee113ee0d94f3844d44065af2311604e9a30ad)
1*83ee113eSDavid van Moolenbroek /*	$NetBSD: failover.h,v 1.1.1.3 2014/07/12 11:57:56 spz Exp $	*/
2*83ee113eSDavid van Moolenbroek /* failover.h
3*83ee113eSDavid van Moolenbroek 
4*83ee113eSDavid van Moolenbroek    Definitions for address trees... */
5*83ee113eSDavid van Moolenbroek 
6*83ee113eSDavid van Moolenbroek /*
7*83ee113eSDavid van Moolenbroek  * Copyright (c) 2004,2005,2007,2009,2014 by Internet Systems Consortium, Inc. ("ISC")
8*83ee113eSDavid van Moolenbroek  * Copyright (c) 2000-2003 by Internet Software Consortium
9*83ee113eSDavid van Moolenbroek  *
10*83ee113eSDavid van Moolenbroek  * Permission to use, copy, modify, and distribute this software for any
11*83ee113eSDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
12*83ee113eSDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
13*83ee113eSDavid van Moolenbroek  *
14*83ee113eSDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
15*83ee113eSDavid van Moolenbroek  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
16*83ee113eSDavid van Moolenbroek  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
17*83ee113eSDavid van Moolenbroek  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
18*83ee113eSDavid van Moolenbroek  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
19*83ee113eSDavid van Moolenbroek  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
20*83ee113eSDavid van Moolenbroek  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21*83ee113eSDavid van Moolenbroek  *
22*83ee113eSDavid van Moolenbroek  *   Internet Systems Consortium, Inc.
23*83ee113eSDavid van Moolenbroek  *   950 Charter Street
24*83ee113eSDavid van Moolenbroek  *   Redwood City, CA 94063
25*83ee113eSDavid van Moolenbroek  *   <info@isc.org>
26*83ee113eSDavid van Moolenbroek  *   https://www.isc.org/
27*83ee113eSDavid van Moolenbroek  *
28*83ee113eSDavid van Moolenbroek  */
29*83ee113eSDavid van Moolenbroek 
30*83ee113eSDavid van Moolenbroek #if defined (FAILOVER_PROTOCOL)
31*83ee113eSDavid van Moolenbroek struct failover_option_info {
32*83ee113eSDavid van Moolenbroek 	int code;
33*83ee113eSDavid van Moolenbroek 	const char *name;
34*83ee113eSDavid van Moolenbroek 	enum { FT_UINT8, FT_IPADDR, FT_UINT32, FT_BYTES, FT_TEXT_OR_BYTES,
35*83ee113eSDavid van Moolenbroek 	       FT_DDNS, FT_DDNS1, FT_UINT16, FT_TEXT,
36*83ee113eSDavid van Moolenbroek 	       FT_UNDEF, FT_DIGEST } type;
37*83ee113eSDavid van Moolenbroek 	int num_present;
38*83ee113eSDavid van Moolenbroek 	int offset;
39*83ee113eSDavid van Moolenbroek 	u_int32_t bit;
40*83ee113eSDavid van Moolenbroek };
41*83ee113eSDavid van Moolenbroek 
42*83ee113eSDavid van Moolenbroek typedef struct {
43*83ee113eSDavid van Moolenbroek 	unsigned count;
44*83ee113eSDavid van Moolenbroek 	u_int8_t *data;
45*83ee113eSDavid van Moolenbroek } failover_option_t;
46*83ee113eSDavid van Moolenbroek 
47*83ee113eSDavid van Moolenbroek /* Failover configuration defaults. */
48*83ee113eSDavid van Moolenbroek #ifndef  DEFAULT_MAX_BALANCE_TIME
49*83ee113eSDavid van Moolenbroek # define DEFAULT_MAX_BALANCE_TIME	3600
50*83ee113eSDavid van Moolenbroek #endif
51*83ee113eSDavid van Moolenbroek 
52*83ee113eSDavid van Moolenbroek #ifndef  DEFAULT_MIN_BALANCE_TIME
53*83ee113eSDavid van Moolenbroek # define DEFAULT_MIN_BALANCE_TIME	60
54*83ee113eSDavid van Moolenbroek #endif
55*83ee113eSDavid van Moolenbroek 
56*83ee113eSDavid van Moolenbroek #ifndef  DEFAULT_MAX_LEASE_MISBALANCE
57*83ee113eSDavid van Moolenbroek # define DEFAULT_MAX_LEASE_MISBALANCE   15
58*83ee113eSDavid van Moolenbroek #endif
59*83ee113eSDavid van Moolenbroek 
60*83ee113eSDavid van Moolenbroek #ifndef  DEFAULT_MAX_LEASE_OWNERSHIP
61*83ee113eSDavid van Moolenbroek # define DEFAULT_MAX_LEASE_OWNERSHIP    10
62*83ee113eSDavid van Moolenbroek #endif
63*83ee113eSDavid van Moolenbroek 
64*83ee113eSDavid van Moolenbroek #ifndef  DEFAULT_MAX_FLYING_UPDATES
65*83ee113eSDavid van Moolenbroek # define DEFAULT_MAX_FLYING_UPDATES	100
66*83ee113eSDavid van Moolenbroek #endif
67*83ee113eSDavid van Moolenbroek 
68*83ee113eSDavid van Moolenbroek #ifndef  DEFAULT_MAX_RESPONSE_DELAY
69*83ee113eSDavid van Moolenbroek # define DEFAULT_MAX_RESPONSE_DELAY	20
70*83ee113eSDavid van Moolenbroek #endif
71*83ee113eSDavid van Moolenbroek 
72*83ee113eSDavid van Moolenbroek /*
73*83ee113eSDavid van Moolenbroek  * IANA has assigned ports 647 ("dhcp-failover") and 847 ("dhcp-failover2").
74*83ee113eSDavid van Moolenbroek  * Of these, only port 647 is mentioned in the -12 draft revision.  We're not
75*83ee113eSDavid van Moolenbroek  * sure if they are supposed to indicate primary and secondary?  No matter,
76*83ee113eSDavid van Moolenbroek  * we'll stick to the -12 draft revision level.
77*83ee113eSDavid van Moolenbroek  */
78*83ee113eSDavid van Moolenbroek #ifndef  DEFAULT_FAILOVER_PORT
79*83ee113eSDavid van Moolenbroek # define DEFAULT_FAILOVER_PORT		647
80*83ee113eSDavid van Moolenbroek #endif
81*83ee113eSDavid van Moolenbroek 
82*83ee113eSDavid van Moolenbroek #define FM_OFFSET(x) (long)(&(((failover_message_t *)0) -> x))
83*83ee113eSDavid van Moolenbroek 
84*83ee113eSDavid van Moolenbroek /* All of the below definitions are mandated by draft-ietf-dhc-failover-12.
85*83ee113eSDavid van Moolenbroek  * The Sections referenced are Sections within that document of that
86*83ee113eSDavid van Moolenbroek  * version, and may be different in other documents of other versions.
87*83ee113eSDavid van Moolenbroek  */
88*83ee113eSDavid van Moolenbroek 
89*83ee113eSDavid van Moolenbroek /* Failover message options from Section 12: */
90*83ee113eSDavid van Moolenbroek #define FTO_ADDRESSES_TRANSFERRED	1
91*83ee113eSDavid van Moolenbroek #define FTB_ADDRESSES_TRANSFERRED		0x00000002
92*83ee113eSDavid van Moolenbroek #define FTO_ASSIGNED_IP_ADDRESS		2
93*83ee113eSDavid van Moolenbroek #define FTB_ASSIGNED_IP_ADDRESS			0x00000004
94*83ee113eSDavid van Moolenbroek #define FTO_BINDING_STATUS		3
95*83ee113eSDavid van Moolenbroek #define FTB_BINDING_STATUS			0x00000008
96*83ee113eSDavid van Moolenbroek #define FTO_CLIENT_IDENTIFIER		4
97*83ee113eSDavid van Moolenbroek #define FTB_CLIENT_IDENTIFIER			0x00000010
98*83ee113eSDavid van Moolenbroek #define FTO_CHADDR			5
99*83ee113eSDavid van Moolenbroek #define FTB_CHADDR				0x00000020
100*83ee113eSDavid van Moolenbroek #define FTO_CLTT			6
101*83ee113eSDavid van Moolenbroek #define FTB_CLTT				0x00000040
102*83ee113eSDavid van Moolenbroek #define FTO_REPLY_OPTIONS		7
103*83ee113eSDavid van Moolenbroek #define FTB_REPLY_OPTIONS			0x00000080
104*83ee113eSDavid van Moolenbroek #define FTO_REQUEST_OPTIONS		8
105*83ee113eSDavid van Moolenbroek #define FTB_REQUEST_OPTIONS			0x00000100
106*83ee113eSDavid van Moolenbroek #define FTO_DDNS			9
107*83ee113eSDavid van Moolenbroek #define FTB_DDNS				0x00000200
108*83ee113eSDavid van Moolenbroek #define FTO_DELAYED_SERVICE		10
109*83ee113eSDavid van Moolenbroek #define FTB_DELAYED_SERVICE			0x00000400
110*83ee113eSDavid van Moolenbroek #define FTO_HBA				11
111*83ee113eSDavid van Moolenbroek #define FTB_HBA					0x00000800
112*83ee113eSDavid van Moolenbroek #define FTO_IP_FLAGS			12
113*83ee113eSDavid van Moolenbroek #define FTB_IP_FLAGS				0x00001000
114*83ee113eSDavid van Moolenbroek #define FTO_LEASE_EXPIRY		13
115*83ee113eSDavid van Moolenbroek #define FTB_LEASE_EXPIRY			0x00002000
116*83ee113eSDavid van Moolenbroek #define FTO_MAX_UNACKED			14
117*83ee113eSDavid van Moolenbroek #define FTB_MAX_UNACKED				0x00004000
118*83ee113eSDavid van Moolenbroek #define FTO_MCLT			15
119*83ee113eSDavid van Moolenbroek #define FTB_MCLT				0x00008000
120*83ee113eSDavid van Moolenbroek #define FTO_MESSAGE			16
121*83ee113eSDavid van Moolenbroek #define FTB_MESSAGE				0x00010000
122*83ee113eSDavid van Moolenbroek #define FTO_MESSAGE_DIGEST		17
123*83ee113eSDavid van Moolenbroek #define FTB_MESSAGE_DIGEST			0x00020000
124*83ee113eSDavid van Moolenbroek #define FTO_POTENTIAL_EXPIRY		18
125*83ee113eSDavid van Moolenbroek #define FTB_POTENTIAL_EXPIRY			0x00040000
126*83ee113eSDavid van Moolenbroek #define FTO_RECEIVE_TIMER		19
127*83ee113eSDavid van Moolenbroek #define FTB_RECEIVE_TIMER			0x00080000
128*83ee113eSDavid van Moolenbroek #define FTO_PROTOCOL_VERSION		20
129*83ee113eSDavid van Moolenbroek #define FTB_PROTOCOL_VERSION			0x00100000
130*83ee113eSDavid van Moolenbroek #define FTO_REJECT_REASON		21
131*83ee113eSDavid van Moolenbroek #define FTB_REJECT_REASON			0x00200000
132*83ee113eSDavid van Moolenbroek #define FTO_RELATIONSHIP_NAME		22
133*83ee113eSDavid van Moolenbroek #define FTB_RELATIONSHIP_NAME			0x00400000
134*83ee113eSDavid van Moolenbroek #define FTO_SERVER_FLAGS		23
135*83ee113eSDavid van Moolenbroek #define FTB_SERVER_FLAGS			0x00800000
136*83ee113eSDavid van Moolenbroek #define FTO_SERVER_STATE		24
137*83ee113eSDavid van Moolenbroek #define FTB_SERVER_STATE			0x01000000
138*83ee113eSDavid van Moolenbroek #define FTO_STOS			25
139*83ee113eSDavid van Moolenbroek #define FTB_STOS				0x02000000
140*83ee113eSDavid van Moolenbroek #define FTO_TLS_REPLY			26
141*83ee113eSDavid van Moolenbroek #define FTB_TLS_REPLY				0x04000000
142*83ee113eSDavid van Moolenbroek #define FTO_TLS_REQUEST			27
143*83ee113eSDavid van Moolenbroek #define FTB_TLS_REQUEST				0x08000000
144*83ee113eSDavid van Moolenbroek #define FTO_VENDOR_CLASS		28
145*83ee113eSDavid van Moolenbroek #define FTB_VENDOR_CLASS			0x10000000
146*83ee113eSDavid van Moolenbroek #define FTO_VENDOR_OPTIONS		29
147*83ee113eSDavid van Moolenbroek #define FTB_VENDOR_OPTIONS			0x20000000
148*83ee113eSDavid van Moolenbroek 
149*83ee113eSDavid van Moolenbroek #define FTO_MAX				FTO_VENDOR_OPTIONS
150*83ee113eSDavid van Moolenbroek 
151*83ee113eSDavid van Moolenbroek /* Failover protocol message types from Section 6.1: */
152*83ee113eSDavid van Moolenbroek #define FTM_POOLREQ		1
153*83ee113eSDavid van Moolenbroek #define FTM_POOLRESP		2
154*83ee113eSDavid van Moolenbroek #define FTM_BNDUPD		3
155*83ee113eSDavid van Moolenbroek #define FTM_BNDACK		4
156*83ee113eSDavid van Moolenbroek #define FTM_CONNECT		5
157*83ee113eSDavid van Moolenbroek #define FTM_CONNECTACK		6
158*83ee113eSDavid van Moolenbroek #define FTM_UPDREQALL		7
159*83ee113eSDavid van Moolenbroek #define FTM_UPDDONE		8
160*83ee113eSDavid van Moolenbroek #define FTM_UPDREQ		9
161*83ee113eSDavid van Moolenbroek #define FTM_STATE		10
162*83ee113eSDavid van Moolenbroek #define FTM_CONTACT		11
163*83ee113eSDavid van Moolenbroek #define FTM_DISCONNECT		12
164*83ee113eSDavid van Moolenbroek 
165*83ee113eSDavid van Moolenbroek /* Reject reasons from Section 12.21: */
166*83ee113eSDavid van Moolenbroek #define FTR_ILLEGAL_IP_ADDR	1
167*83ee113eSDavid van Moolenbroek #define FTR_FATAL_CONFLICT	2
168*83ee113eSDavid van Moolenbroek #define FTR_MISSING_BINDINFO	3
169*83ee113eSDavid van Moolenbroek #define FTR_TIMEMISMATCH	4
170*83ee113eSDavid van Moolenbroek #define FTR_INVALID_MCLT	5
171*83ee113eSDavid van Moolenbroek #define FTR_MISC_REJECT		6
172*83ee113eSDavid van Moolenbroek #define FTR_DUP_CONNECTION	7
173*83ee113eSDavid van Moolenbroek #define FTR_INVALID_PARTNER	8
174*83ee113eSDavid van Moolenbroek #define FTR_TLS_UNSUPPORTED	9
175*83ee113eSDavid van Moolenbroek #define FTR_TLS_UNCONFIGURED	10
176*83ee113eSDavid van Moolenbroek #define FTR_TLS_REQUIRED	11
177*83ee113eSDavid van Moolenbroek #define FTR_DIGEST_UNSUPPORTED	12
178*83ee113eSDavid van Moolenbroek #define FTR_DIGEST_UNCONFIGURED	13
179*83ee113eSDavid van Moolenbroek #define FTR_VERSION_MISMATCH	14
180*83ee113eSDavid van Moolenbroek #define FTR_OUTDATED_BIND_INFO	15
181*83ee113eSDavid van Moolenbroek #define FTR_LESS_CRIT_BIND_INFO	16
182*83ee113eSDavid van Moolenbroek #define FTR_NO_TRAFFIC		17
183*83ee113eSDavid van Moolenbroek #define FTR_HBA_CONFLICT	18
184*83ee113eSDavid van Moolenbroek #define FTR_IP_NOT_RESERVED	19
185*83ee113eSDavid van Moolenbroek #define FTR_IP_DIGEST_FAILURE	20
186*83ee113eSDavid van Moolenbroek #define FTR_IP_MISSING_DIGEST	21
187*83ee113eSDavid van Moolenbroek #define FTR_UNKNOWN		254
188*83ee113eSDavid van Moolenbroek 
189*83ee113eSDavid van Moolenbroek /* Message size limitations defined in Section 6.1: */
190*83ee113eSDavid van Moolenbroek #define DHCP_FAILOVER_MIN_MESSAGE_SIZE    12
191*83ee113eSDavid van Moolenbroek #define DHCP_FAILOVER_MAX_MESSAGE_SIZE	2048
192*83ee113eSDavid van Moolenbroek 
193*83ee113eSDavid van Moolenbroek /* Failover server flags from Section 12.23: */
194*83ee113eSDavid van Moolenbroek #define FTF_SERVER_STARTUP	1
195*83ee113eSDavid van Moolenbroek 
196*83ee113eSDavid van Moolenbroek /* DDNS flags from Section 12.9.  These are really their names. */
197*83ee113eSDavid van Moolenbroek #define FTF_DDNS_C		0x0001
198*83ee113eSDavid van Moolenbroek #define FTF_DDNS_A		0x0002
199*83ee113eSDavid van Moolenbroek #define FTF_DDNS_D		0x0004
200*83ee113eSDavid van Moolenbroek #define FTF_DDNS_P		0x0008
201*83ee113eSDavid van Moolenbroek 
202*83ee113eSDavid van Moolenbroek /* FTO_IP_FLAGS contents from Section 12.12: */
203*83ee113eSDavid van Moolenbroek #define FTF_IP_FLAG_RESERVE	0x0001
204*83ee113eSDavid van Moolenbroek #define FTF_IP_FLAG_BOOTP	0x0002
205*83ee113eSDavid van Moolenbroek 
206*83ee113eSDavid van Moolenbroek /* FTO_MESSAGE_DIGEST Type Codes from Section 12.17: */
207*83ee113eSDavid van Moolenbroek #define FTT_MESSAGE_DIGEST_HMAC_MD5	0x01
208*83ee113eSDavid van Moolenbroek 
209*83ee113eSDavid van Moolenbroek typedef struct failover_message {
210*83ee113eSDavid van Moolenbroek 	int refcnt;
211*83ee113eSDavid van Moolenbroek 	struct failover_message *next;
212*83ee113eSDavid van Moolenbroek 
213*83ee113eSDavid van Moolenbroek 	int options_present;
214*83ee113eSDavid van Moolenbroek 
215*83ee113eSDavid van Moolenbroek 	u_int32_t time;
216*83ee113eSDavid van Moolenbroek 	u_int32_t xid;
217*83ee113eSDavid van Moolenbroek 	u_int8_t type;
218*83ee113eSDavid van Moolenbroek 
219*83ee113eSDavid van Moolenbroek 	/* One-byte options. */
220*83ee113eSDavid van Moolenbroek 	u_int8_t binding_status;
221*83ee113eSDavid van Moolenbroek 	u_int8_t delayed_service;
222*83ee113eSDavid van Moolenbroek 	u_int8_t protocol_version;
223*83ee113eSDavid van Moolenbroek 	u_int8_t reject_reason;
224*83ee113eSDavid van Moolenbroek 	u_int8_t server_flags;
225*83ee113eSDavid van Moolenbroek 	u_int8_t server_state;
226*83ee113eSDavid van Moolenbroek 	u_int8_t tls_reply;
227*83ee113eSDavid van Moolenbroek 	u_int8_t tls_request;
228*83ee113eSDavid van Moolenbroek 
229*83ee113eSDavid van Moolenbroek 	/* Two-byte options. */
230*83ee113eSDavid van Moolenbroek 	u_int16_t ip_flags;
231*83ee113eSDavid van Moolenbroek 
232*83ee113eSDavid van Moolenbroek 	/* Four-byte options. */
233*83ee113eSDavid van Moolenbroek 	u_int32_t addresses_transferred;
234*83ee113eSDavid van Moolenbroek 	u_int32_t assigned_addr;
235*83ee113eSDavid van Moolenbroek 	u_int32_t cltt;
236*83ee113eSDavid van Moolenbroek 	u_int32_t expiry;
237*83ee113eSDavid van Moolenbroek 	u_int32_t max_unacked;
238*83ee113eSDavid van Moolenbroek 	u_int32_t mclt;
239*83ee113eSDavid van Moolenbroek 	u_int32_t potential_expiry;
240*83ee113eSDavid van Moolenbroek 	u_int32_t receive_timer;
241*83ee113eSDavid van Moolenbroek 	u_int32_t stos;
242*83ee113eSDavid van Moolenbroek 
243*83ee113eSDavid van Moolenbroek 	/* Arbitrary field options. */
244*83ee113eSDavid van Moolenbroek 	failover_option_t chaddr;
245*83ee113eSDavid van Moolenbroek 	failover_option_t client_identifier;
246*83ee113eSDavid van Moolenbroek 	failover_option_t hba;
247*83ee113eSDavid van Moolenbroek 	failover_option_t message;
248*83ee113eSDavid van Moolenbroek 	failover_option_t message_digest;
249*83ee113eSDavid van Moolenbroek 	failover_option_t relationship_name;
250*83ee113eSDavid van Moolenbroek 	failover_option_t reply_options;
251*83ee113eSDavid van Moolenbroek 	failover_option_t request_options;
252*83ee113eSDavid van Moolenbroek 	failover_option_t vendor_class;
253*83ee113eSDavid van Moolenbroek 	failover_option_t vendor_options;
254*83ee113eSDavid van Moolenbroek 
255*83ee113eSDavid van Moolenbroek 	/* Special contents options. */
256*83ee113eSDavid van Moolenbroek 	ddns_fqdn_t ddns;
257*83ee113eSDavid van Moolenbroek } failover_message_t;
258*83ee113eSDavid van Moolenbroek 
259*83ee113eSDavid van Moolenbroek typedef struct {
260*83ee113eSDavid van Moolenbroek 	OMAPI_OBJECT_PREAMBLE;
261*83ee113eSDavid van Moolenbroek 	struct option_cache *peer_address;
262*83ee113eSDavid van Moolenbroek 	unsigned peer_port;
263*83ee113eSDavid van Moolenbroek 	int options_present;
264*83ee113eSDavid van Moolenbroek 	enum dhcp_flink_state {
265*83ee113eSDavid van Moolenbroek 		dhcp_flink_start,
266*83ee113eSDavid van Moolenbroek 		dhcp_flink_message_length_wait,
267*83ee113eSDavid van Moolenbroek 		dhcp_flink_message_wait,
268*83ee113eSDavid van Moolenbroek 		dhcp_flink_disconnected,
269*83ee113eSDavid van Moolenbroek 		dhcp_flink_state_max
270*83ee113eSDavid van Moolenbroek 	} state;
271*83ee113eSDavid van Moolenbroek 	failover_message_t *imsg;
272*83ee113eSDavid van Moolenbroek 	struct _dhcp_failover_state *state_object;
273*83ee113eSDavid van Moolenbroek 	u_int16_t imsg_len;
274*83ee113eSDavid van Moolenbroek 	unsigned imsg_count;
275*83ee113eSDavid van Moolenbroek 	u_int8_t imsg_payoff; /* Pay*load* offset. :') */
276*83ee113eSDavid van Moolenbroek 	u_int32_t xid;
277*83ee113eSDavid van Moolenbroek } dhcp_failover_link_t;
278*83ee113eSDavid van Moolenbroek 
279*83ee113eSDavid van Moolenbroek typedef struct _dhcp_failover_listener {
280*83ee113eSDavid van Moolenbroek 	OMAPI_OBJECT_PREAMBLE;
281*83ee113eSDavid van Moolenbroek 	struct _dhcp_failover_listener *next;
282*83ee113eSDavid van Moolenbroek 	omapi_addr_t address;
283*83ee113eSDavid van Moolenbroek } dhcp_failover_listener_t;
284*83ee113eSDavid van Moolenbroek #endif /* FAILOVER_PROTOCOL */
285*83ee113eSDavid van Moolenbroek 
286*83ee113eSDavid van Moolenbroek /* A failover peer's running state. */
287*83ee113eSDavid van Moolenbroek enum failover_state {
288*83ee113eSDavid van Moolenbroek 	unknown_state			=  0, /* XXX: Not a standard state. */
289*83ee113eSDavid van Moolenbroek 	startup				=  1,
290*83ee113eSDavid van Moolenbroek 	normal				=  2,
291*83ee113eSDavid van Moolenbroek 	communications_interrupted	=  3,
292*83ee113eSDavid van Moolenbroek 	partner_down			=  4,
293*83ee113eSDavid van Moolenbroek 	potential_conflict		=  5,
294*83ee113eSDavid van Moolenbroek 	recover				=  6,
295*83ee113eSDavid van Moolenbroek 	paused				=  7,
296*83ee113eSDavid van Moolenbroek 	shut_down			=  8,
297*83ee113eSDavid van Moolenbroek 	recover_done			=  9,
298*83ee113eSDavid van Moolenbroek 	resolution_interrupted		= 10,
299*83ee113eSDavid van Moolenbroek 	conflict_done			= 11,
300*83ee113eSDavid van Moolenbroek 
301*83ee113eSDavid van Moolenbroek 	/* Draft revision 12 of the failover protocol documents a RECOVER-WAIT
302*83ee113eSDavid van Moolenbroek 	 * state, but does not enumerate its value in the section 12.24
303*83ee113eSDavid van Moolenbroek 	 * table.  ISC DHCP 3.0.x used value 254 even though the state was
304*83ee113eSDavid van Moolenbroek 	 * not documented at all.  For the time being, we will continue to use
305*83ee113eSDavid van Moolenbroek 	 * this value.
306*83ee113eSDavid van Moolenbroek 	 */
307*83ee113eSDavid van Moolenbroek 	recover_wait			= 254
308*83ee113eSDavid van Moolenbroek };
309*83ee113eSDavid van Moolenbroek 
310*83ee113eSDavid van Moolenbroek /* Service states are simplifications of failover states, particularly
311*83ee113eSDavid van Moolenbroek    useful because the startup state isn't actually implementable as a
312*83ee113eSDavid van Moolenbroek    separate failover state without maintaining a state stack. */
313*83ee113eSDavid van Moolenbroek 
314*83ee113eSDavid van Moolenbroek enum service_state {
315*83ee113eSDavid van Moolenbroek 	unknown_service_state,
316*83ee113eSDavid van Moolenbroek 	cooperating,
317*83ee113eSDavid van Moolenbroek 	not_cooperating,
318*83ee113eSDavid van Moolenbroek 	service_partner_down,
319*83ee113eSDavid van Moolenbroek 	not_responding,
320*83ee113eSDavid van Moolenbroek 	service_startup
321*83ee113eSDavid van Moolenbroek };
322*83ee113eSDavid van Moolenbroek 
323*83ee113eSDavid van Moolenbroek #if defined (FAILOVER_PROTOCOL)
324*83ee113eSDavid van Moolenbroek typedef struct _dhcp_failover_config {
325*83ee113eSDavid van Moolenbroek 	struct option_cache *address;
326*83ee113eSDavid van Moolenbroek 	int port;
327*83ee113eSDavid van Moolenbroek 	u_int32_t max_flying_updates;
328*83ee113eSDavid van Moolenbroek 	enum failover_state state;
329*83ee113eSDavid van Moolenbroek 	TIME stos;
330*83ee113eSDavid van Moolenbroek 	u_int32_t max_response_delay;
331*83ee113eSDavid van Moolenbroek } dhcp_failover_config_t;
332*83ee113eSDavid van Moolenbroek 
333*83ee113eSDavid van Moolenbroek typedef struct _dhcp_failover_state {
334*83ee113eSDavid van Moolenbroek 	OMAPI_OBJECT_PREAMBLE;
335*83ee113eSDavid van Moolenbroek 	struct _dhcp_failover_state *next;
336*83ee113eSDavid van Moolenbroek 	char *name;			/* Name of this failover instance. */
337*83ee113eSDavid van Moolenbroek 	dhcp_failover_config_t me;	/* My configuration. */
338*83ee113eSDavid van Moolenbroek 	dhcp_failover_config_t partner;	/* Partner's configuration. */
339*83ee113eSDavid van Moolenbroek 	enum failover_state saved_state; /* Saved state during startup. */
340*83ee113eSDavid van Moolenbroek 	struct data_string server_identifier; /* Server identifier (IP addr) */
341*83ee113eSDavid van Moolenbroek 	u_int32_t mclt;
342*83ee113eSDavid van Moolenbroek 
343*83ee113eSDavid van Moolenbroek 	u_int8_t *hba;	/* Hash bucket array for load balancing. */
344*83ee113eSDavid van Moolenbroek 	int load_balance_max_secs;
345*83ee113eSDavid van Moolenbroek 
346*83ee113eSDavid van Moolenbroek 	u_int32_t max_lease_misbalance, max_lease_ownership;
347*83ee113eSDavid van Moolenbroek 	u_int32_t max_balance, min_balance;
348*83ee113eSDavid van Moolenbroek 	TIME last_balance, sched_balance;
349*83ee113eSDavid van Moolenbroek 
350*83ee113eSDavid van Moolenbroek 	u_int32_t auto_partner_down;
351*83ee113eSDavid van Moolenbroek 
352*83ee113eSDavid van Moolenbroek 	enum service_state service_state;
353*83ee113eSDavid van Moolenbroek 	const char *nrr;	/* Printable reason why we're in the
354*83ee113eSDavid van Moolenbroek 				   not_responding service state (empty
355*83ee113eSDavid van Moolenbroek 				   string if we are responding. */
356*83ee113eSDavid van Moolenbroek 
357*83ee113eSDavid van Moolenbroek 	dhcp_failover_link_t *link_to_peer;	/* Currently-established link
358*83ee113eSDavid van Moolenbroek 						   to peer. */
359*83ee113eSDavid van Moolenbroek 
360*83ee113eSDavid van Moolenbroek 	enum {
361*83ee113eSDavid van Moolenbroek 		primary, secondary
362*83ee113eSDavid van Moolenbroek 	} i_am;		/* We are primary or secondary in this relationship. */
363*83ee113eSDavid van Moolenbroek 
364*83ee113eSDavid van Moolenbroek 	TIME last_packet_sent;		/* Timestamp on last packet we sent. */
365*83ee113eSDavid van Moolenbroek 	TIME last_timestamp_received;	/* The last timestamp we sent that
366*83ee113eSDavid van Moolenbroek 					   has been returned by our partner. */
367*83ee113eSDavid van Moolenbroek 	TIME skew;	/* The skew between our clock and our partner's. */
368*83ee113eSDavid van Moolenbroek 	struct lease *update_queue_head; /* List of leases we haven't sent
369*83ee113eSDavid van Moolenbroek 					    to peer. */
370*83ee113eSDavid van Moolenbroek 	struct lease *update_queue_tail;
371*83ee113eSDavid van Moolenbroek 
372*83ee113eSDavid van Moolenbroek 	struct lease *ack_queue_head;	/* List of lease updates the peer
373*83ee113eSDavid van Moolenbroek 					   hasn't yet acked. */
374*83ee113eSDavid van Moolenbroek 	struct lease *ack_queue_tail;
375*83ee113eSDavid van Moolenbroek 
376*83ee113eSDavid van Moolenbroek 	struct lease *send_update_done;	/* When we get a BNDACK for this
377*83ee113eSDavid van Moolenbroek 					   lease, send an UPDDONE message. */
378*83ee113eSDavid van Moolenbroek 	int cur_unacked_updates;	/* Number of updates we've sent
379*83ee113eSDavid van Moolenbroek 					   that have not yet been acked. */
380*83ee113eSDavid van Moolenbroek 
381*83ee113eSDavid van Moolenbroek 					/* List of messages which we haven't
382*83ee113eSDavid van Moolenbroek 					   acked yet. */
383*83ee113eSDavid van Moolenbroek 	failover_message_t *toack_queue_head;
384*83ee113eSDavid van Moolenbroek 	failover_message_t *toack_queue_tail;
385*83ee113eSDavid van Moolenbroek 	int pending_acks;		/* Number of messages in the toack
386*83ee113eSDavid van Moolenbroek 					   queue. */
387*83ee113eSDavid van Moolenbroek 	int pool_count;			/* Number of pools referencing this
388*83ee113eSDavid van Moolenbroek 					   failover state object. */
389*83ee113eSDavid van Moolenbroek 	int curUPD;			/* If an UPDREQ* message is in motion,
390*83ee113eSDavid van Moolenbroek 					   this value indicates which one. */
391*83ee113eSDavid van Moolenbroek 	u_int32_t updxid;		/* XID of UPDREQ* message in action. */
392*83ee113eSDavid van Moolenbroek } dhcp_failover_state_t;
393*83ee113eSDavid van Moolenbroek 
394*83ee113eSDavid van Moolenbroek #define DHCP_FAILOVER_VERSION		1
395*83ee113eSDavid van Moolenbroek #endif /* FAILOVER_PROTOCOL */
396