aboutsummaryrefslogtreecommitdiff
path: root/includes/failover.h
diff options
context:
space:
mode:
Diffstat (limited to 'includes/failover.h')
-rw-r--r--includes/failover.h400
1 files changed, 400 insertions, 0 deletions
diff --git a/includes/failover.h b/includes/failover.h
new file mode 100644
index 0000000..1db0e68
--- /dev/null
+++ b/includes/failover.h
@@ -0,0 +1,400 @@
+/* failover.h
+
+ Definitions for address trees... */
+
+/*
+ * Copyright (c) 2004,2005,2007,2009 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 2000-2003 by Internet Software Consortium
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Internet Systems Consortium, Inc.
+ * 950 Charter Street
+ * Redwood City, CA 94063
+ * <info@isc.org>
+ * https://www.isc.org/
+ *
+ * This software has been written for Internet Systems Consortium
+ * by Ted Lemon in cooperation with Vixie Enterprises and Nominum, Inc.
+ * To learn more about Internet Systems Consortium, see
+ * ``https://www.isc.org/''. To learn more about Vixie Enterprises,
+ * see ``http://www.vix.com''. To learn more about Nominum, Inc., see
+ * ``http://www.nominum.com''.
+ */
+
+#if defined (FAILOVER_PROTOCOL)
+struct failover_option_info {
+ int code;
+ const char *name;
+ enum { FT_UINT8, FT_IPADDR, FT_UINT32, FT_BYTES, FT_TEXT_OR_BYTES,
+ FT_DDNS, FT_DDNS1, FT_UINT16, FT_TEXT,
+ FT_UNDEF, FT_DIGEST } type;
+ int num_present;
+ int offset;
+ u_int32_t bit;
+};
+
+typedef struct {
+ unsigned count;
+ u_int8_t *data;
+} failover_option_t;
+
+/* Failover configuration defaults. */
+#ifndef DEFAULT_MAX_BALANCE_TIME
+# define DEFAULT_MAX_BALANCE_TIME 3600
+#endif
+
+#ifndef DEFAULT_MIN_BALANCE_TIME
+# define DEFAULT_MIN_BALANCE_TIME 60
+#endif
+
+#ifndef DEFAULT_MAX_LEASE_MISBALANCE
+# define DEFAULT_MAX_LEASE_MISBALANCE 15
+#endif
+
+#ifndef DEFAULT_MAX_LEASE_OWNERSHIP
+# define DEFAULT_MAX_LEASE_OWNERSHIP 10
+#endif
+
+#ifndef DEFAULT_MAX_FLYING_UPDATES
+# define DEFAULT_MAX_FLYING_UPDATES 100
+#endif
+
+#ifndef DEFAULT_MAX_RESPONSE_DELAY
+# define DEFAULT_MAX_RESPONSE_DELAY 20
+#endif
+
+/*
+ * IANA has assigned ports 647 ("dhcp-failover") and 847 ("dhcp-failover2").
+ * Of these, only port 647 is mentioned in the -12 draft revision. We're not
+ * sure if they are supposed to indicate primary and secondary? No matter,
+ * we'll stick to the -12 draft revision level.
+ */
+#ifndef DEFAULT_FAILOVER_PORT
+# define DEFAULT_FAILOVER_PORT 647
+#endif
+
+#define FM_OFFSET(x) (long)(&(((failover_message_t *)0) -> x))
+
+/* All of the below definitions are mandated by draft-ietf-dhc-failover-12.
+ * The Sections referenced are Sections within that document of that
+ * version, and may be different in other documents of other versions.
+ */
+
+/* Failover message options from Section 12: */
+#define FTO_ADDRESSES_TRANSFERRED 1
+#define FTB_ADDRESSES_TRANSFERRED 0x00000002
+#define FTO_ASSIGNED_IP_ADDRESS 2
+#define FTB_ASSIGNED_IP_ADDRESS 0x00000004
+#define FTO_BINDING_STATUS 3
+#define FTB_BINDING_STATUS 0x00000008
+#define FTO_CLIENT_IDENTIFIER 4
+#define FTB_CLIENT_IDENTIFIER 0x00000010
+#define FTO_CHADDR 5
+#define FTB_CHADDR 0x00000020
+#define FTO_CLTT 6
+#define FTB_CLTT 0x00000040
+#define FTO_REPLY_OPTIONS 7
+#define FTB_REPLY_OPTIONS 0x00000080
+#define FTO_REQUEST_OPTIONS 8
+#define FTB_REQUEST_OPTIONS 0x00000100
+#define FTO_DDNS 9
+#define FTB_DDNS 0x00000200
+#define FTO_DELAYED_SERVICE 10
+#define FTB_DELAYED_SERVICE 0x00000400
+#define FTO_HBA 11
+#define FTB_HBA 0x00000800
+#define FTO_IP_FLAGS 12
+#define FTB_IP_FLAGS 0x00001000
+#define FTO_LEASE_EXPIRY 13
+#define FTB_LEASE_EXPIRY 0x00002000
+#define FTO_MAX_UNACKED 14
+#define FTB_MAX_UNACKED 0x00004000
+#define FTO_MCLT 15
+#define FTB_MCLT 0x00008000
+#define FTO_MESSAGE 16
+#define FTB_MESSAGE 0x00010000
+#define FTO_MESSAGE_DIGEST 17
+#define FTB_MESSAGE_DIGEST 0x00020000
+#define FTO_POTENTIAL_EXPIRY 18
+#define FTB_POTENTIAL_EXPIRY 0x00040000
+#define FTO_RECEIVE_TIMER 19
+#define FTB_RECEIVE_TIMER 0x00080000
+#define FTO_PROTOCOL_VERSION 20
+#define FTB_PROTOCOL_VERSION 0x00100000
+#define FTO_REJECT_REASON 21
+#define FTB_REJECT_REASON 0x00200000
+#define FTO_RELATIONSHIP_NAME 22
+#define FTB_RELATIONSHIP_NAME 0x00400000
+#define FTO_SERVER_FLAGS 23
+#define FTB_SERVER_FLAGS 0x00800000
+#define FTO_SERVER_STATE 24
+#define FTB_SERVER_STATE 0x01000000
+#define FTO_STOS 25
+#define FTB_STOS 0x02000000
+#define FTO_TLS_REPLY 26
+#define FTB_TLS_REPLY 0x04000000
+#define FTO_TLS_REQUEST 27
+#define FTB_TLS_REQUEST 0x08000000
+#define FTO_VENDOR_CLASS 28
+#define FTB_VENDOR_CLASS 0x10000000
+#define FTO_VENDOR_OPTIONS 29
+#define FTB_VENDOR_OPTIONS 0x20000000
+
+#define FTO_MAX FTO_VENDOR_OPTIONS
+
+/* Failover protocol message types from Section 6.1: */
+#define FTM_POOLREQ 1
+#define FTM_POOLRESP 2
+#define FTM_BNDUPD 3
+#define FTM_BNDACK 4
+#define FTM_CONNECT 5
+#define FTM_CONNECTACK 6
+#define FTM_UPDREQALL 7
+#define FTM_UPDDONE 8
+#define FTM_UPDREQ 9
+#define FTM_STATE 10
+#define FTM_CONTACT 11
+#define FTM_DISCONNECT 12
+
+/* Reject reasons from Section 12.21: */
+#define FTR_ILLEGAL_IP_ADDR 1
+#define FTR_FATAL_CONFLICT 2
+#define FTR_MISSING_BINDINFO 3
+#define FTR_TIMEMISMATCH 4
+#define FTR_INVALID_MCLT 5
+#define FTR_MISC_REJECT 6
+#define FTR_DUP_CONNECTION 7
+#define FTR_INVALID_PARTNER 8
+#define FTR_TLS_UNSUPPORTED 9
+#define FTR_TLS_UNCONFIGURED 10
+#define FTR_TLS_REQUIRED 11
+#define FTR_DIGEST_UNSUPPORTED 12
+#define FTR_DIGEST_UNCONFIGURED 13
+#define FTR_VERSION_MISMATCH 14
+#define FTR_OUTDATED_BIND_INFO 15
+#define FTR_LESS_CRIT_BIND_INFO 16
+#define FTR_NO_TRAFFIC 17
+#define FTR_HBA_CONFLICT 18
+#define FTR_IP_NOT_RESERVED 19
+#define FTR_IP_DIGEST_FAILURE 20
+#define FTR_IP_MISSING_DIGEST 21
+#define FTR_UNKNOWN 254
+
+/* Message size limitations defined in Section 6.1: */
+#define DHCP_FAILOVER_MIN_MESSAGE_SIZE 12
+#define DHCP_FAILOVER_MAX_MESSAGE_SIZE 2048
+
+/* Failover server flags from Section 12.23: */
+#define FTF_SERVER_STARTUP 1
+
+/* DDNS flags from Section 12.9. These are really their names. */
+#define FTF_DDNS_C 0x0001
+#define FTF_DDNS_A 0x0002
+#define FTF_DDNS_D 0x0004
+#define FTF_DDNS_P 0x0008
+
+/* FTO_IP_FLAGS contents from Section 12.12: */
+#define FTF_IP_FLAG_RESERVE 0x0001
+#define FTF_IP_FLAG_BOOTP 0x0002
+
+/* FTO_MESSAGE_DIGEST Type Codes from Section 12.17: */
+#define FTT_MESSAGE_DIGEST_HMAC_MD5 0x01
+
+typedef struct failover_message {
+ int refcnt;
+ struct failover_message *next;
+
+ int options_present;
+
+ u_int32_t time;
+ u_int32_t xid;
+ u_int8_t type;
+
+ /* One-byte options. */
+ u_int8_t binding_status;
+ u_int8_t delayed_service;
+ u_int8_t protocol_version;
+ u_int8_t reject_reason;
+ u_int8_t server_flags;
+ u_int8_t server_state;
+ u_int8_t tls_reply;
+ u_int8_t tls_request;
+
+ /* Two-byte options. */
+ u_int16_t ip_flags;
+
+ /* Four-byte options. */
+ u_int32_t addresses_transferred;
+ u_int32_t assigned_addr;
+ u_int32_t cltt;
+ u_int32_t expiry;
+ u_int32_t max_unacked;
+ u_int32_t mclt;
+ u_int32_t potential_expiry;
+ u_int32_t receive_timer;
+ u_int32_t stos;
+
+ /* Arbitrary field options. */
+ failover_option_t chaddr;
+ failover_option_t client_identifier;
+ failover_option_t hba;
+ failover_option_t message;
+ failover_option_t message_digest;
+ failover_option_t relationship_name;
+ failover_option_t reply_options;
+ failover_option_t request_options;
+ failover_option_t vendor_class;
+ failover_option_t vendor_options;
+
+ /* Special contents options. */
+ ddns_fqdn_t ddns;
+} failover_message_t;
+
+typedef struct {
+ OMAPI_OBJECT_PREAMBLE;
+ struct option_cache *peer_address;
+ unsigned peer_port;
+ int options_present;
+ enum dhcp_flink_state {
+ dhcp_flink_start,
+ dhcp_flink_message_length_wait,
+ dhcp_flink_message_wait,
+ dhcp_flink_disconnected,
+ dhcp_flink_state_max
+ } state;
+ failover_message_t *imsg;
+ struct _dhcp_failover_state *state_object;
+ u_int16_t imsg_len;
+ unsigned imsg_count;
+ u_int8_t imsg_payoff; /* Pay*load* offset. :') */
+ u_int32_t xid;
+} dhcp_failover_link_t;
+
+typedef struct _dhcp_failover_listener {
+ OMAPI_OBJECT_PREAMBLE;
+ struct _dhcp_failover_listener *next;
+ omapi_addr_t address;
+} dhcp_failover_listener_t;
+#endif /* FAILOVER_PROTOCOL */
+
+/* A failover peer's running state. */
+enum failover_state {
+ unknown_state = 0, /* XXX: Not a standard state. */
+ startup = 1,
+ normal = 2,
+ communications_interrupted = 3,
+ partner_down = 4,
+ potential_conflict = 5,
+ recover = 6,
+ paused = 7,
+ shut_down = 8,
+ recover_done = 9,
+ resolution_interrupted = 10,
+ conflict_done = 11,
+
+ /* Draft revision 12 of the failover protocol documents a RECOVER-WAIT
+ * state, but does not enumerate its value in the section 12.24
+ * table. ISC DHCP 3.0.x used value 254 even though the state was
+ * not documented at all. For the time being, we will continue to use
+ * this value.
+ */
+ recover_wait = 254
+};
+
+/* Service states are simplifications of failover states, particularly
+ useful because the startup state isn't actually implementable as a
+ separate failover state without maintaining a state stack. */
+
+enum service_state {
+ unknown_service_state,
+ cooperating,
+ not_cooperating,
+ service_partner_down,
+ not_responding,
+ service_startup
+};
+
+#if defined (FAILOVER_PROTOCOL)
+typedef struct _dhcp_failover_config {
+ struct option_cache *address;
+ int port;
+ u_int32_t max_flying_updates;
+ enum failover_state state;
+ TIME stos;
+ u_int32_t max_response_delay;
+} dhcp_failover_config_t;
+
+typedef struct _dhcp_failover_state {
+ OMAPI_OBJECT_PREAMBLE;
+ struct _dhcp_failover_state *next;
+ char *name; /* Name of this failover instance. */
+ dhcp_failover_config_t me; /* My configuration. */
+ dhcp_failover_config_t partner; /* Partner's configuration. */
+ enum failover_state saved_state; /* Saved state during startup. */
+ struct data_string server_identifier; /* Server identifier (IP addr) */
+ u_int32_t mclt;
+
+ u_int8_t *hba; /* Hash bucket array for load balancing. */
+ int load_balance_max_secs;
+
+ u_int32_t max_lease_misbalance, max_lease_ownership;
+ u_int32_t max_balance, min_balance;
+ TIME last_balance, sched_balance;
+
+ u_int32_t auto_partner_down;
+
+ enum service_state service_state;
+ const char *nrr; /* Printable reason why we're in the
+ not_responding service state (empty
+ string if we are responding. */
+
+ dhcp_failover_link_t *link_to_peer; /* Currently-established link
+ to peer. */
+
+ enum {
+ primary, secondary
+ } i_am; /* We are primary or secondary in this relationship. */
+
+ TIME last_packet_sent; /* Timestamp on last packet we sent. */
+ TIME last_timestamp_received; /* The last timestamp we sent that
+ has been returned by our partner. */
+ TIME skew; /* The skew between our clock and our partner's. */
+ struct lease *update_queue_head; /* List of leases we haven't sent
+ to peer. */
+ struct lease *update_queue_tail;
+
+ struct lease *ack_queue_head; /* List of lease updates the peer
+ hasn't yet acked. */
+ struct lease *ack_queue_tail;
+
+ struct lease *send_update_done; /* When we get a BNDACK for this
+ lease, send an UPDDONE message. */
+ int cur_unacked_updates; /* Number of updates we've sent
+ that have not yet been acked. */
+
+ /* List of messages which we haven't
+ acked yet. */
+ failover_message_t *toack_queue_head;
+ failover_message_t *toack_queue_tail;
+ int pending_acks; /* Number of messages in the toack
+ queue. */
+ int pool_count; /* Number of pools referencing this
+ failover state object. */
+ int curUPD; /* If an UPDREQ* message is in motion,
+ this value indicates which one. */
+ u_int32_t updxid; /* XID of UPDREQ* message in action. */
+} dhcp_failover_state_t;
+
+#define DHCP_FAILOVER_VERSION 1
+#endif /* FAILOVER_PROTOCOL */