1*b636d99dSDavid van Moolenbroek /* 2*b636d99dSDavid van Moolenbroek * Copyright (c) 1982, 1986, 1993 3*b636d99dSDavid van Moolenbroek * The Regents of the University of California. All rights reserved. 4*b636d99dSDavid van Moolenbroek * 5*b636d99dSDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without 6*b636d99dSDavid van Moolenbroek * modification, are permitted provided that the following conditions 7*b636d99dSDavid van Moolenbroek * are met: 8*b636d99dSDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright 9*b636d99dSDavid van Moolenbroek * notice, this list of conditions and the following disclaimer. 10*b636d99dSDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright 11*b636d99dSDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the 12*b636d99dSDavid van Moolenbroek * documentation and/or other materials provided with the distribution. 13*b636d99dSDavid van Moolenbroek * 3. Neither the name of the University nor the names of its contributors 14*b636d99dSDavid van Moolenbroek * may be used to endorse or promote products derived from this software 15*b636d99dSDavid van Moolenbroek * without specific prior written permission. 16*b636d99dSDavid van Moolenbroek * 17*b636d99dSDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18*b636d99dSDavid van Moolenbroek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*b636d99dSDavid van Moolenbroek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*b636d99dSDavid van Moolenbroek * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21*b636d99dSDavid van Moolenbroek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*b636d99dSDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23*b636d99dSDavid van Moolenbroek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24*b636d99dSDavid van Moolenbroek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25*b636d99dSDavid van Moolenbroek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26*b636d99dSDavid van Moolenbroek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*b636d99dSDavid van Moolenbroek * SUCH DAMAGE. 28*b636d99dSDavid van Moolenbroek * 29*b636d99dSDavid van Moolenbroek * @(#)ip.h 8.2 (Berkeley) 6/1/94 30*b636d99dSDavid van Moolenbroek */ 31*b636d99dSDavid van Moolenbroek 32*b636d99dSDavid van Moolenbroek #ifndef TCPDUMP_IP_H 33*b636d99dSDavid van Moolenbroek #define TCPDUMP_IP_H 34*b636d99dSDavid van Moolenbroek 35*b636d99dSDavid van Moolenbroek #include "tcpdump-stdinc.h" 36*b636d99dSDavid van Moolenbroek 37*b636d99dSDavid van Moolenbroek /* 38*b636d99dSDavid van Moolenbroek * Definitions for internet protocol version 4. 39*b636d99dSDavid van Moolenbroek * Per RFC 791, September 1981. 40*b636d99dSDavid van Moolenbroek */ 41*b636d99dSDavid van Moolenbroek #define IPVERSION 4 42*b636d99dSDavid van Moolenbroek 43*b636d99dSDavid van Moolenbroek /* 44*b636d99dSDavid van Moolenbroek * Structure of an internet header, naked of options. 45*b636d99dSDavid van Moolenbroek * 46*b636d99dSDavid van Moolenbroek * We declare ip_len and ip_off to be short, rather than u_short 47*b636d99dSDavid van Moolenbroek * pragmatically since otherwise unsigned comparisons can result 48*b636d99dSDavid van Moolenbroek * against negative integers quite easily, and fail in subtle ways. 49*b636d99dSDavid van Moolenbroek */ 50*b636d99dSDavid van Moolenbroek struct ip { 51*b636d99dSDavid van Moolenbroek uint8_t ip_vhl; /* header length, version */ 52*b636d99dSDavid van Moolenbroek #define IP_V(ip) (((ip)->ip_vhl & 0xf0) >> 4) 53*b636d99dSDavid van Moolenbroek #define IP_HL(ip) ((ip)->ip_vhl & 0x0f) 54*b636d99dSDavid van Moolenbroek uint8_t ip_tos; /* type of service */ 55*b636d99dSDavid van Moolenbroek uint16_t ip_len; /* total length */ 56*b636d99dSDavid van Moolenbroek uint16_t ip_id; /* identification */ 57*b636d99dSDavid van Moolenbroek uint16_t ip_off; /* fragment offset field */ 58*b636d99dSDavid van Moolenbroek #define IP_DF 0x4000 /* dont fragment flag */ 59*b636d99dSDavid van Moolenbroek #define IP_MF 0x2000 /* more fragments flag */ 60*b636d99dSDavid van Moolenbroek #define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ 61*b636d99dSDavid van Moolenbroek uint8_t ip_ttl; /* time to live */ 62*b636d99dSDavid van Moolenbroek uint8_t ip_p; /* protocol */ 63*b636d99dSDavid van Moolenbroek uint16_t ip_sum; /* checksum */ 64*b636d99dSDavid van Moolenbroek struct in_addr ip_src,ip_dst; /* source and dest address */ 65*b636d99dSDavid van Moolenbroek } UNALIGNED; 66*b636d99dSDavid van Moolenbroek 67*b636d99dSDavid van Moolenbroek #define IP_MAXPACKET 65535 /* maximum packet size */ 68*b636d99dSDavid van Moolenbroek 69*b636d99dSDavid van Moolenbroek /* 70*b636d99dSDavid van Moolenbroek * Definitions for IP type of service (ip_tos) 71*b636d99dSDavid van Moolenbroek */ 72*b636d99dSDavid van Moolenbroek #define IPTOS_LOWDELAY 0x10 73*b636d99dSDavid van Moolenbroek #define IPTOS_THROUGHPUT 0x08 74*b636d99dSDavid van Moolenbroek #define IPTOS_RELIABILITY 0x04 75*b636d99dSDavid van Moolenbroek 76*b636d99dSDavid van Moolenbroek /* 77*b636d99dSDavid van Moolenbroek * Definitions for IP precedence (also in ip_tos) (hopefully unused) 78*b636d99dSDavid van Moolenbroek */ 79*b636d99dSDavid van Moolenbroek #define IPTOS_PREC_NETCONTROL 0xe0 80*b636d99dSDavid van Moolenbroek #define IPTOS_PREC_INTERNETCONTROL 0xc0 81*b636d99dSDavid van Moolenbroek #define IPTOS_PREC_CRITIC_ECP 0xa0 82*b636d99dSDavid van Moolenbroek #define IPTOS_PREC_FLASHOVERRIDE 0x80 83*b636d99dSDavid van Moolenbroek #define IPTOS_PREC_FLASH 0x60 84*b636d99dSDavid van Moolenbroek #define IPTOS_PREC_IMMEDIATE 0x40 85*b636d99dSDavid van Moolenbroek #define IPTOS_PREC_PRIORITY 0x20 86*b636d99dSDavid van Moolenbroek #define IPTOS_PREC_ROUTINE 0x00 87*b636d99dSDavid van Moolenbroek 88*b636d99dSDavid van Moolenbroek /* 89*b636d99dSDavid van Moolenbroek * Definitions for options. 90*b636d99dSDavid van Moolenbroek */ 91*b636d99dSDavid van Moolenbroek #define IPOPT_COPIED(o) ((o)&0x80) 92*b636d99dSDavid van Moolenbroek #define IPOPT_CLASS(o) ((o)&0x60) 93*b636d99dSDavid van Moolenbroek #define IPOPT_NUMBER(o) ((o)&0x1f) 94*b636d99dSDavid van Moolenbroek 95*b636d99dSDavid van Moolenbroek #define IPOPT_CONTROL 0x00 96*b636d99dSDavid van Moolenbroek #define IPOPT_RESERVED1 0x20 97*b636d99dSDavid van Moolenbroek #define IPOPT_DEBMEAS 0x40 98*b636d99dSDavid van Moolenbroek #define IPOPT_RESERVED2 0x60 99*b636d99dSDavid van Moolenbroek 100*b636d99dSDavid van Moolenbroek #define IPOPT_EOL 0 /* end of option list */ 101*b636d99dSDavid van Moolenbroek #define IPOPT_NOP 1 /* no operation */ 102*b636d99dSDavid van Moolenbroek 103*b636d99dSDavid van Moolenbroek #define IPOPT_RR 7 /* record packet route */ 104*b636d99dSDavid van Moolenbroek #define IPOPT_TS 68 /* timestamp */ 105*b636d99dSDavid van Moolenbroek #define IPOPT_RFC1393 82 /* traceroute RFC 1393 */ 106*b636d99dSDavid van Moolenbroek #define IPOPT_SECURITY 130 /* provide s,c,h,tcc */ 107*b636d99dSDavid van Moolenbroek #define IPOPT_LSRR 131 /* loose source route */ 108*b636d99dSDavid van Moolenbroek #define IPOPT_SATID 136 /* satnet id */ 109*b636d99dSDavid van Moolenbroek #define IPOPT_SSRR 137 /* strict source route */ 110*b636d99dSDavid van Moolenbroek #define IPOPT_RA 148 /* router-alert, rfc2113 */ 111*b636d99dSDavid van Moolenbroek 112*b636d99dSDavid van Moolenbroek /* 113*b636d99dSDavid van Moolenbroek * Offsets to fields in options other than EOL and NOP. 114*b636d99dSDavid van Moolenbroek */ 115*b636d99dSDavid van Moolenbroek #define IPOPT_OPTVAL 0 /* option ID */ 116*b636d99dSDavid van Moolenbroek #define IPOPT_OLEN 1 /* option length */ 117*b636d99dSDavid van Moolenbroek #define IPOPT_OFFSET 2 /* offset within option */ 118*b636d99dSDavid van Moolenbroek #define IPOPT_MINOFF 4 /* min value of above */ 119*b636d99dSDavid van Moolenbroek 120*b636d99dSDavid van Moolenbroek /* 121*b636d99dSDavid van Moolenbroek * Time stamp option structure. 122*b636d99dSDavid van Moolenbroek */ 123*b636d99dSDavid van Moolenbroek struct ip_timestamp { 124*b636d99dSDavid van Moolenbroek uint8_t ipt_code; /* IPOPT_TS */ 125*b636d99dSDavid van Moolenbroek uint8_t ipt_len; /* size of structure (variable) */ 126*b636d99dSDavid van Moolenbroek uint8_t ipt_ptr; /* index of current entry */ 127*b636d99dSDavid van Moolenbroek uint8_t ipt_oflwflg; /* flags, overflow counter */ 128*b636d99dSDavid van Moolenbroek #define IPTS_OFLW(ip) (((ipt)->ipt_oflwflg & 0xf0) >> 4) 129*b636d99dSDavid van Moolenbroek #define IPTS_FLG(ip) ((ipt)->ipt_oflwflg & 0x0f) 130*b636d99dSDavid van Moolenbroek union ipt_timestamp { 131*b636d99dSDavid van Moolenbroek uint32_t ipt_time[1]; 132*b636d99dSDavid van Moolenbroek struct ipt_ta { 133*b636d99dSDavid van Moolenbroek struct in_addr ipt_addr; 134*b636d99dSDavid van Moolenbroek uint32_t ipt_time; 135*b636d99dSDavid van Moolenbroek } ipt_ta[1]; 136*b636d99dSDavid van Moolenbroek } ipt_timestamp; 137*b636d99dSDavid van Moolenbroek } UNALIGNED; 138*b636d99dSDavid van Moolenbroek 139*b636d99dSDavid van Moolenbroek /* flag bits for ipt_flg */ 140*b636d99dSDavid van Moolenbroek #define IPOPT_TS_TSONLY 0 /* timestamps only */ 141*b636d99dSDavid van Moolenbroek #define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ 142*b636d99dSDavid van Moolenbroek #define IPOPT_TS_PRESPEC 3 /* specified modules only */ 143*b636d99dSDavid van Moolenbroek 144*b636d99dSDavid van Moolenbroek /* bits for security (not byte swapped) */ 145*b636d99dSDavid van Moolenbroek #define IPOPT_SECUR_UNCLASS 0x0000 146*b636d99dSDavid van Moolenbroek #define IPOPT_SECUR_CONFID 0xf135 147*b636d99dSDavid van Moolenbroek #define IPOPT_SECUR_EFTO 0x789a 148*b636d99dSDavid van Moolenbroek #define IPOPT_SECUR_MMMM 0xbc4d 149*b636d99dSDavid van Moolenbroek #define IPOPT_SECUR_RESTR 0xaf13 150*b636d99dSDavid van Moolenbroek #define IPOPT_SECUR_SECRET 0xd788 151*b636d99dSDavid van Moolenbroek #define IPOPT_SECUR_TOPSECRET 0x6bc5 152*b636d99dSDavid van Moolenbroek 153*b636d99dSDavid van Moolenbroek /* 154*b636d99dSDavid van Moolenbroek * Internet implementation parameters. 155*b636d99dSDavid van Moolenbroek */ 156*b636d99dSDavid van Moolenbroek #define MAXTTL 255 /* maximum time to live (seconds) */ 157*b636d99dSDavid van Moolenbroek #define IPDEFTTL 64 /* default ttl, from RFC 1340 */ 158*b636d99dSDavid van Moolenbroek #define IPFRAGTTL 60 /* time to live for frags, slowhz */ 159*b636d99dSDavid van Moolenbroek #define IPTTLDEC 1 /* subtracted when forwarding */ 160*b636d99dSDavid van Moolenbroek 161*b636d99dSDavid van Moolenbroek #define IP_MSS 576 /* default maximum segment size */ 162*b636d99dSDavid van Moolenbroek #endif /* TCPDUMP_IP_H */ 163