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