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