Annotation of embedaddon/dhcp/includes/failover.h, revision 1.1.1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>