1a9643ea8Slogwang /*- 2*22ce4affSfengbojiang * SPDX-License-Identifier: BSD-3-Clause 3*22ce4affSfengbojiang * 4a9643ea8Slogwang * Copyright (c) 1982, 1986, 1993 5a9643ea8Slogwang * The Regents of the University of California. 6a9643ea8Slogwang * All rights reserved. 7a9643ea8Slogwang * 8a9643ea8Slogwang * Redistribution and use in source and binary forms, with or without 9a9643ea8Slogwang * modification, are permitted provided that the following conditions 10a9643ea8Slogwang * are met: 11a9643ea8Slogwang * 1. Redistributions of source code must retain the above copyright 12a9643ea8Slogwang * notice, this list of conditions and the following disclaimer. 13a9643ea8Slogwang * 2. Redistributions in binary form must reproduce the above copyright 14a9643ea8Slogwang * notice, this list of conditions and the following disclaimer in the 15a9643ea8Slogwang * documentation and/or other materials provided with the distribution. 16*22ce4affSfengbojiang * 3. Neither the name of the University nor the names of its contributors 17a9643ea8Slogwang * may be used to endorse or promote products derived from this software 18a9643ea8Slogwang * without specific prior written permission. 19a9643ea8Slogwang * 20a9643ea8Slogwang * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21a9643ea8Slogwang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22a9643ea8Slogwang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23a9643ea8Slogwang * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24a9643ea8Slogwang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25a9643ea8Slogwang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26a9643ea8Slogwang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27a9643ea8Slogwang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28a9643ea8Slogwang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29a9643ea8Slogwang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30a9643ea8Slogwang * SUCH DAMAGE. 31a9643ea8Slogwang * 32a9643ea8Slogwang * @(#)ip.h 8.2 (Berkeley) 6/1/94 33a9643ea8Slogwang * $FreeBSD$ 34a9643ea8Slogwang */ 35a9643ea8Slogwang 36a9643ea8Slogwang #ifndef _NETINET_IP_H_ 37a9643ea8Slogwang #define _NETINET_IP_H_ 38a9643ea8Slogwang 39a9643ea8Slogwang #include <sys/cdefs.h> 40a9643ea8Slogwang 41a9643ea8Slogwang /* 42a9643ea8Slogwang * Definitions for internet protocol version 4. 43a9643ea8Slogwang * 44a9643ea8Slogwang * Per RFC 791, September 1981. 45a9643ea8Slogwang */ 46a9643ea8Slogwang #define IPVERSION 4 47a9643ea8Slogwang 48a9643ea8Slogwang /* 49a9643ea8Slogwang * Structure of an internet header, naked of options. 50a9643ea8Slogwang */ 51a9643ea8Slogwang struct ip { 52a9643ea8Slogwang #if BYTE_ORDER == LITTLE_ENDIAN 53a9643ea8Slogwang u_char ip_hl:4, /* header length */ 54a9643ea8Slogwang ip_v:4; /* version */ 55a9643ea8Slogwang #endif 56a9643ea8Slogwang #if BYTE_ORDER == BIG_ENDIAN 57a9643ea8Slogwang u_char ip_v:4, /* version */ 58a9643ea8Slogwang ip_hl:4; /* header length */ 59a9643ea8Slogwang #endif 60a9643ea8Slogwang u_char ip_tos; /* type of service */ 61a9643ea8Slogwang u_short ip_len; /* total length */ 62a9643ea8Slogwang u_short ip_id; /* identification */ 63a9643ea8Slogwang u_short ip_off; /* fragment offset field */ 64a9643ea8Slogwang #define IP_RF 0x8000 /* reserved fragment flag */ 65a9643ea8Slogwang #define IP_DF 0x4000 /* dont fragment flag */ 66a9643ea8Slogwang #define IP_MF 0x2000 /* more fragments flag */ 67a9643ea8Slogwang #define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ 68a9643ea8Slogwang u_char ip_ttl; /* time to live */ 69a9643ea8Slogwang u_char ip_p; /* protocol */ 70a9643ea8Slogwang u_short ip_sum; /* checksum */ 71a9643ea8Slogwang struct in_addr ip_src,ip_dst; /* source and dest address */ 72a9643ea8Slogwang } __packed __aligned(2); 73a9643ea8Slogwang 74a9643ea8Slogwang #define IP_MAXPACKET 65535 /* maximum packet size */ 75a9643ea8Slogwang 76a9643ea8Slogwang /* 77a9643ea8Slogwang * Definitions for IP type of service (ip_tos). 78a9643ea8Slogwang */ 79a9643ea8Slogwang #define IPTOS_LOWDELAY 0x10 80a9643ea8Slogwang #define IPTOS_THROUGHPUT 0x08 81a9643ea8Slogwang #define IPTOS_RELIABILITY 0x04 82a9643ea8Slogwang #define IPTOS_MINCOST 0x02 83a9643ea8Slogwang 84a9643ea8Slogwang /* 85a9643ea8Slogwang * Definitions for IP precedence (also in ip_tos) (deprecated). 86a9643ea8Slogwang */ 87a9643ea8Slogwang #define IPTOS_PREC_NETCONTROL IPTOS_DSCP_CS7 88a9643ea8Slogwang #define IPTOS_PREC_INTERNETCONTROL IPTOS_DSCP_CS6 89a9643ea8Slogwang #define IPTOS_PREC_CRITIC_ECP IPTOS_DSCP_CS5 90a9643ea8Slogwang #define IPTOS_PREC_FLASHOVERRIDE IPTOS_DSCP_CS4 91a9643ea8Slogwang #define IPTOS_PREC_FLASH IPTOS_DSCP_CS3 92a9643ea8Slogwang #define IPTOS_PREC_IMMEDIATE IPTOS_DSCP_CS2 93a9643ea8Slogwang #define IPTOS_PREC_PRIORITY IPTOS_DSCP_CS1 94a9643ea8Slogwang #define IPTOS_PREC_ROUTINE IPTOS_DSCP_CS0 95a9643ea8Slogwang 96a9643ea8Slogwang /* 97*22ce4affSfengbojiang * Offset of Diffserv decimal value to convert it to tos value . 98*22ce4affSfengbojiang */ 99*22ce4affSfengbojiang #define IPTOS_DSCP_OFFSET 2 100*22ce4affSfengbojiang 101*22ce4affSfengbojiang /* 102a9643ea8Slogwang * Definitions for DiffServ Codepoints as per RFC2474 and RFC5865. 103a9643ea8Slogwang */ 104a9643ea8Slogwang #define IPTOS_DSCP_CS0 0x00 105a9643ea8Slogwang #define IPTOS_DSCP_CS1 0x20 106a9643ea8Slogwang #define IPTOS_DSCP_AF11 0x28 107a9643ea8Slogwang #define IPTOS_DSCP_AF12 0x30 108a9643ea8Slogwang #define IPTOS_DSCP_AF13 0x38 109a9643ea8Slogwang #define IPTOS_DSCP_CS2 0x40 110a9643ea8Slogwang #define IPTOS_DSCP_AF21 0x48 111a9643ea8Slogwang #define IPTOS_DSCP_AF22 0x50 112a9643ea8Slogwang #define IPTOS_DSCP_AF23 0x58 113a9643ea8Slogwang #define IPTOS_DSCP_CS3 0x60 114a9643ea8Slogwang #define IPTOS_DSCP_AF31 0x68 115a9643ea8Slogwang #define IPTOS_DSCP_AF32 0x70 116a9643ea8Slogwang #define IPTOS_DSCP_AF33 0x78 117a9643ea8Slogwang #define IPTOS_DSCP_CS4 0x80 118a9643ea8Slogwang #define IPTOS_DSCP_AF41 0x88 119a9643ea8Slogwang #define IPTOS_DSCP_AF42 0x90 120a9643ea8Slogwang #define IPTOS_DSCP_AF43 0x98 121a9643ea8Slogwang #define IPTOS_DSCP_CS5 0xa0 122a9643ea8Slogwang #define IPTOS_DSCP_VA 0xb0 123a9643ea8Slogwang #define IPTOS_DSCP_EF 0xb8 124a9643ea8Slogwang #define IPTOS_DSCP_CS6 0xc0 125a9643ea8Slogwang #define IPTOS_DSCP_CS7 0xe0 126a9643ea8Slogwang 127a9643ea8Slogwang /* 128a9643ea8Slogwang * ECN (Explicit Congestion Notification) codepoints in RFC3168 mapped to the 129a9643ea8Slogwang * lower 2 bits of the TOS field. 130a9643ea8Slogwang */ 131a9643ea8Slogwang #define IPTOS_ECN_NOTECT 0x00 /* not-ECT */ 132a9643ea8Slogwang #define IPTOS_ECN_ECT1 0x01 /* ECN-capable transport (1) */ 133a9643ea8Slogwang #define IPTOS_ECN_ECT0 0x02 /* ECN-capable transport (0) */ 134a9643ea8Slogwang #define IPTOS_ECN_CE 0x03 /* congestion experienced */ 135a9643ea8Slogwang #define IPTOS_ECN_MASK 0x03 /* ECN field mask */ 136a9643ea8Slogwang 137a9643ea8Slogwang /* 138a9643ea8Slogwang * Definitions for options. 139a9643ea8Slogwang */ 140a9643ea8Slogwang #define IPOPT_COPIED(o) ((o)&0x80) 141a9643ea8Slogwang #define IPOPT_CLASS(o) ((o)&0x60) 142a9643ea8Slogwang #define IPOPT_NUMBER(o) ((o)&0x1f) 143a9643ea8Slogwang 144a9643ea8Slogwang #define IPOPT_CONTROL 0x00 145a9643ea8Slogwang #define IPOPT_RESERVED1 0x20 146a9643ea8Slogwang #define IPOPT_DEBMEAS 0x40 147a9643ea8Slogwang #define IPOPT_RESERVED2 0x60 148a9643ea8Slogwang 149a9643ea8Slogwang #define IPOPT_EOL 0 /* end of option list */ 150a9643ea8Slogwang #define IPOPT_NOP 1 /* no operation */ 151a9643ea8Slogwang 152a9643ea8Slogwang #define IPOPT_RR 7 /* record packet route */ 153a9643ea8Slogwang #define IPOPT_TS 68 /* timestamp */ 154a9643ea8Slogwang #define IPOPT_SECURITY 130 /* provide s,c,h,tcc */ 155a9643ea8Slogwang #define IPOPT_LSRR 131 /* loose source route */ 156a9643ea8Slogwang #define IPOPT_ESO 133 /* extended security */ 157a9643ea8Slogwang #define IPOPT_CIPSO 134 /* commercial security */ 158a9643ea8Slogwang #define IPOPT_SATID 136 /* satnet id */ 159a9643ea8Slogwang #define IPOPT_SSRR 137 /* strict source route */ 160a9643ea8Slogwang #define IPOPT_RA 148 /* router alert */ 161a9643ea8Slogwang 162a9643ea8Slogwang /* 163a9643ea8Slogwang * Offsets to fields in options other than EOL and NOP. 164a9643ea8Slogwang */ 165a9643ea8Slogwang #define IPOPT_OPTVAL 0 /* option ID */ 166a9643ea8Slogwang #define IPOPT_OLEN 1 /* option length */ 167a9643ea8Slogwang #define IPOPT_OFFSET 2 /* offset within option */ 168a9643ea8Slogwang #define IPOPT_MINOFF 4 /* min value of above */ 169a9643ea8Slogwang 170a9643ea8Slogwang /* 171a9643ea8Slogwang * Time stamp option structure. 172a9643ea8Slogwang */ 173a9643ea8Slogwang struct ip_timestamp { 174a9643ea8Slogwang u_char ipt_code; /* IPOPT_TS */ 175a9643ea8Slogwang u_char ipt_len; /* size of structure (variable) */ 176a9643ea8Slogwang u_char ipt_ptr; /* index of current entry */ 177a9643ea8Slogwang #if BYTE_ORDER == LITTLE_ENDIAN 178a9643ea8Slogwang u_char ipt_flg:4, /* flags, see below */ 179a9643ea8Slogwang ipt_oflw:4; /* overflow counter */ 180a9643ea8Slogwang #endif 181a9643ea8Slogwang #if BYTE_ORDER == BIG_ENDIAN 182a9643ea8Slogwang u_char ipt_oflw:4, /* overflow counter */ 183a9643ea8Slogwang ipt_flg:4; /* flags, see below */ 184a9643ea8Slogwang #endif 185a9643ea8Slogwang union ipt_timestamp { 186a9643ea8Slogwang uint32_t ipt_time[1]; /* network format */ 187a9643ea8Slogwang struct ipt_ta { 188a9643ea8Slogwang struct in_addr ipt_addr; 189a9643ea8Slogwang uint32_t ipt_time; /* network format */ 190a9643ea8Slogwang } ipt_ta[1]; 191a9643ea8Slogwang } ipt_timestamp; 192a9643ea8Slogwang }; 193a9643ea8Slogwang 194a9643ea8Slogwang /* Flag bits for ipt_flg. */ 195a9643ea8Slogwang #define IPOPT_TS_TSONLY 0 /* timestamps only */ 196a9643ea8Slogwang #define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ 197a9643ea8Slogwang #define IPOPT_TS_PRESPEC 3 /* specified modules only */ 198a9643ea8Slogwang 199a9643ea8Slogwang /* Bits for security (not byte swapped). */ 200a9643ea8Slogwang #define IPOPT_SECUR_UNCLASS 0x0000 201a9643ea8Slogwang #define IPOPT_SECUR_CONFID 0xf135 202a9643ea8Slogwang #define IPOPT_SECUR_EFTO 0x789a 203a9643ea8Slogwang #define IPOPT_SECUR_MMMM 0xbc4d 204a9643ea8Slogwang #define IPOPT_SECUR_RESTR 0xaf13 205a9643ea8Slogwang #define IPOPT_SECUR_SECRET 0xd788 206a9643ea8Slogwang #define IPOPT_SECUR_TOPSECRET 0x6bc5 207a9643ea8Slogwang 208a9643ea8Slogwang /* 209a9643ea8Slogwang * Internet implementation parameters. 210a9643ea8Slogwang */ 211a9643ea8Slogwang #define MAXTTL 255 /* maximum time to live (seconds) */ 212a9643ea8Slogwang #define IPDEFTTL 64 /* default ttl, from RFC 1340 */ 213a9643ea8Slogwang #define IPFRAGTTL 60 /* time to live for frags, slowhz */ 214a9643ea8Slogwang #define IPTTLDEC 1 /* subtracted when forwarding */ 215a9643ea8Slogwang #define IP_MSS 576 /* default maximum segment size */ 216a9643ea8Slogwang 217a9643ea8Slogwang /* 218a9643ea8Slogwang * This is the real IPv4 pseudo header, used for computing the TCP and UDP 219a9643ea8Slogwang * checksums. For the Internet checksum, struct ipovly can be used instead. 220a9643ea8Slogwang * For stronger checksums, the real thing must be used. 221a9643ea8Slogwang */ 222a9643ea8Slogwang struct ippseudo { 223a9643ea8Slogwang struct in_addr ippseudo_src; /* source internet address */ 224a9643ea8Slogwang struct in_addr ippseudo_dst; /* destination internet address */ 225a9643ea8Slogwang u_char ippseudo_pad; /* pad, must be zero */ 226a9643ea8Slogwang u_char ippseudo_p; /* protocol */ 227a9643ea8Slogwang u_short ippseudo_len; /* protocol length */ 228a9643ea8Slogwang }; 229a9643ea8Slogwang #endif 230