1 1.14 roy /* $NetBSD: ip_carp.h,v 1.14 2021/02/03 18:13:13 roy Exp $ */ 2 1.1 liamjfoy /* $OpenBSD: ip_carp.h,v 1.18 2005/04/20 23:00:41 mpf Exp $ */ 3 1.1 liamjfoy 4 1.1 liamjfoy /* 5 1.1 liamjfoy * Copyright (c) 2002 Michael Shalayeff. All rights reserved. 6 1.1 liamjfoy * Copyright (c) 2003 Ryan McBride. All rights reserved. 7 1.1 liamjfoy * 8 1.1 liamjfoy * Redistribution and use in source and binary forms, with or without 9 1.1 liamjfoy * modification, are permitted provided that the following conditions 10 1.1 liamjfoy * are met: 11 1.1 liamjfoy * 1. Redistributions of source code must retain the above copyright 12 1.1 liamjfoy * notice, this list of conditions and the following disclaimer. 13 1.1 liamjfoy * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 liamjfoy * notice, this list of conditions and the following disclaimer in the 15 1.1 liamjfoy * documentation and/or other materials provided with the distribution. 16 1.1 liamjfoy * 17 1.1 liamjfoy * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 1.1 liamjfoy * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 1.1 liamjfoy * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 1.1 liamjfoy * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT, 21 1.1 liamjfoy * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 1.1 liamjfoy * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 23 1.1 liamjfoy * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 1.1 liamjfoy * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 25 1.1 liamjfoy * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 26 1.1 liamjfoy * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 27 1.1 liamjfoy * THE POSSIBILITY OF SUCH DAMAGE. 28 1.1 liamjfoy */ 29 1.1 liamjfoy 30 1.1 liamjfoy #ifndef _NETINET_IP_CARP_H_ 31 1.1 liamjfoy #define _NETINET_IP_CARP_H_ 32 1.1 liamjfoy 33 1.1 liamjfoy /* 34 1.1 liamjfoy * The CARP header layout is as follows: 35 1.1 liamjfoy * 36 1.1 liamjfoy * 0 1 2 3 37 1.1 liamjfoy * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 38 1.1 liamjfoy * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 39 1.1 liamjfoy * |Version| Type | VirtualHostID | AdvSkew | Auth Len | 40 1.1 liamjfoy * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 41 1.1 liamjfoy * | Reserved | AdvBase | Checksum | 42 1.1 liamjfoy * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 43 1.1 liamjfoy * | Counter (1) | 44 1.1 liamjfoy * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 45 1.1 liamjfoy * | Counter (2) | 46 1.1 liamjfoy * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 47 1.1 liamjfoy * | SHA-1 HMAC (1) | 48 1.1 liamjfoy * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 49 1.1 liamjfoy * | SHA-1 HMAC (2) | 50 1.1 liamjfoy * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 51 1.1 liamjfoy * | SHA-1 HMAC (3) | 52 1.1 liamjfoy * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 53 1.1 liamjfoy * | SHA-1 HMAC (4) | 54 1.1 liamjfoy * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 55 1.1 liamjfoy * | SHA-1 HMAC (5) | 56 1.1 liamjfoy * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 57 1.1 liamjfoy * 58 1.1 liamjfoy */ 59 1.1 liamjfoy 60 1.1 liamjfoy struct carp_header { 61 1.1 liamjfoy #if BYTE_ORDER == LITTLE_ENDIAN 62 1.5 dyoung unsigned int carp_type:4, 63 1.1 liamjfoy carp_version:4; 64 1.1 liamjfoy #endif 65 1.1 liamjfoy #if BYTE_ORDER == BIG_ENDIAN 66 1.5 dyoung unsigned int carp_version:4, 67 1.1 liamjfoy carp_type:4; 68 1.1 liamjfoy #endif 69 1.1 liamjfoy u_int8_t carp_vhid; /* virtual host id */ 70 1.1 liamjfoy u_int8_t carp_advskew; /* advertisement skew */ 71 1.1 liamjfoy u_int8_t carp_authlen; /* size of counter+md, 32bit chunks */ 72 1.1 liamjfoy u_int8_t carp_pad1; /* reserved */ 73 1.1 liamjfoy u_int8_t carp_advbase; /* advertisement interval */ 74 1.1 liamjfoy u_int16_t carp_cksum; 75 1.1 liamjfoy u_int32_t carp_counter[2]; 76 1.1 liamjfoy unsigned char carp_md[20]; /* SHA1 HMAC */ 77 1.13 roy }; 78 1.13 roy 79 1.14 roy #ifdef __CTASSERT 80 1.14 roy __CTASSERT(sizeof(struct carp_header) == 36); 81 1.13 roy #endif 82 1.1 liamjfoy 83 1.1 liamjfoy #define CARP_DFLTTL 255 84 1.1 liamjfoy 85 1.1 liamjfoy /* carp_version */ 86 1.1 liamjfoy #define CARP_VERSION 2 87 1.1 liamjfoy 88 1.1 liamjfoy /* carp_type */ 89 1.1 liamjfoy #define CARP_ADVERTISEMENT 0x01 90 1.1 liamjfoy 91 1.1 liamjfoy #define CARP_KEY_LEN 20 /* a sha1 hash of a passphrase */ 92 1.1 liamjfoy 93 1.1 liamjfoy /* carp_advbase */ 94 1.1 liamjfoy #define CARP_DFLTINTV 1 95 1.1 liamjfoy 96 1.1 liamjfoy /* 97 1.1 liamjfoy * Statistics. 98 1.1 liamjfoy */ 99 1.4 thorpej #define CARP_STAT_IPACKETS 0 /* total input packets, IPv4 */ 100 1.4 thorpej #define CARP_STAT_IPACKETS6 1 /* total input packets, IPv6 */ 101 1.4 thorpej #define CARP_STAT_BADIF 2 /* wrong interface */ 102 1.4 thorpej #define CARP_STAT_BADTTL 3 /* TTL is not CARP_DFLTTL */ 103 1.4 thorpej #define CARP_STAT_HDROPS 4 /* packets shorter than hdr */ 104 1.4 thorpej #define CARP_STAT_BADSUM 5 /* bad checksum */ 105 1.4 thorpej #define CARP_STAT_BADVER 6 /* bad (incl unsupported) version */ 106 1.4 thorpej #define CARP_STAT_BADLEN 7 /* data length does not match */ 107 1.4 thorpej #define CARP_STAT_BADAUTH 8 /* bad authentication */ 108 1.4 thorpej #define CARP_STAT_BADVHID 9 /* bad VHID */ 109 1.4 thorpej #define CARP_STAT_BADADDRS 10 /* bad address list */ 110 1.4 thorpej #define CARP_STAT_OPACKETS 11 /* total output packets, IPv4 */ 111 1.4 thorpej #define CARP_STAT_OPACKETS6 12 /* total output packets, IPv6 */ 112 1.4 thorpej #define CARP_STAT_ONOMEM 13 /* no memory for an mbuf */ 113 1.4 thorpej #define CARP_STAT_OSTATES 14 /* total state updates sent */ 114 1.4 thorpej #define CARP_STAT_PREEMPT 15 /* in enabled, preemptions */ 115 1.1 liamjfoy 116 1.4 thorpej #define CARP_NSTATS 16 117 1.1 liamjfoy 118 1.1 liamjfoy #define CARPDEVNAMSIZ 16 119 1.1 liamjfoy #ifdef IFNAMSIZ 120 1.1 liamjfoy #if CARPDEVNAMSIZ != IFNAMSIZ 121 1.1 liamjfoy #error 122 1.1 liamjfoy #endif 123 1.1 liamjfoy #endif 124 1.1 liamjfoy 125 1.1 liamjfoy /* 126 1.1 liamjfoy * Configuration structure for SIOCSVH SIOCGVH 127 1.1 liamjfoy */ 128 1.1 liamjfoy struct carpreq { 129 1.1 liamjfoy int carpr_state; 130 1.1 liamjfoy #define CARP_STATES "INIT", "BACKUP", "MASTER" 131 1.1 liamjfoy #define CARP_MAXSTATE 2 132 1.1 liamjfoy 133 1.1 liamjfoy char carpr_carpdev[CARPDEVNAMSIZ]; 134 1.1 liamjfoy int carpr_vhid; 135 1.1 liamjfoy int carpr_advskew; 136 1.1 liamjfoy int carpr_advbase; 137 1.1 liamjfoy unsigned char carpr_key[CARP_KEY_LEN]; 138 1.1 liamjfoy }; 139 1.1 liamjfoy 140 1.1 liamjfoy /* 141 1.1 liamjfoy * Names for CARP sysctl objects 142 1.1 liamjfoy */ 143 1.1 liamjfoy #define CARPCTL_ALLOW 1 /* accept incoming CARP packets */ 144 1.1 liamjfoy #define CARPCTL_PREEMPT 2 /* high-pri backup preemption mode */ 145 1.1 liamjfoy #define CARPCTL_LOG 3 /* log bad packets */ 146 1.1 liamjfoy #define CARPCTL_ARPBALANCE 4 /* balance arp responses */ 147 1.1 liamjfoy #define CARPCTL_STATS 5 /* carp statistics */ 148 1.1 liamjfoy #define CARPCTL_MAXID 6 149 1.1 liamjfoy 150 1.1 liamjfoy #ifdef _KERNEL 151 1.6 pooka void carp_init(void); 152 1.7 ozaki void carp_ifdetach(struct ifnet *); 153 1.10 maxv void carp_proto_input(struct mbuf *, int, int); 154 1.1 liamjfoy void carp_carpdev_state(void *); 155 1.1 liamjfoy int carp6_proto_input(struct mbuf **, int *, int); 156 1.1 liamjfoy int carp_iamatch(struct in_ifaddr *, u_char *, 157 1.1 liamjfoy u_int32_t *, u_int32_t); 158 1.1 liamjfoy struct ifaddr *carp_iamatch6(void *, struct in6_addr *); 159 1.1 liamjfoy struct ifnet *carp_ourether(void *, struct ether_header *, u_char, int); 160 1.1 liamjfoy int carp_input(struct mbuf *, u_int8_t *, u_int8_t *, u_int16_t); 161 1.3 dyoung int carp_output(struct ifnet *, struct mbuf *, 162 1.8 ozaki const struct sockaddr *, const struct rtentry *); 163 1.1 liamjfoy #endif /* _KERNEL */ 164 1.1 liamjfoy #endif /* _NETINET_IP_CARP_H_ */ 165