153f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* @(#) $Header: /tcpdump/master/tcpdump/ip.h,v 1.12 2007-09-14 01:29:28 guy Exp $ (LBL) */
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1982, 1986, 1993
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that the following conditions
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * are met:
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    documentation and/or other materials provided with the distribution.
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 3. All advertising materials mentioning features or use of this software
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    must display the following acknowledgement:
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	This product includes software developed by the University of
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	California, Berkeley and its contributors.
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 4. Neither the name of the University nor the names of its contributors
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    may be used to endorse or promote products derived from this software
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    without specific prior written permission.
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * SUCH DAMAGE.
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	@(#)ip.h	8.2 (Berkeley) 6/1/94
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Definitions for internet protocol version 4.
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Per RFC 791, September 1981.
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPVERSION	4
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Structure of an internet header, naked of options.
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * We declare ip_len and ip_off to be short, rather than u_short
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * pragmatically since otherwise unsigned comparisons can result
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * against negative integers quite easily, and fail in subtle ways.
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct ip {
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t	ip_vhl;		/* header length, version */
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP_V(ip)	(((ip)->ip_vhl & 0xf0) >> 4)
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP_HL(ip)	((ip)->ip_vhl & 0x0f)
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t	ip_tos;		/* type of service */
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int16_t	ip_len;		/* total length */
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int16_t	ip_id;		/* identification */
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int16_t	ip_off;		/* fragment offset field */
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IP_DF 0x4000			/* dont fragment flag */
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IP_MF 0x2000			/* more fragments flag */
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IP_OFFMASK 0x1fff		/* mask for fragmenting bits */
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t	ip_ttl;		/* time to live */
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t	ip_p;		/* protocol */
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int16_t	ip_sum;		/* checksum */
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct	in_addr ip_src,ip_dst;	/* source and dest address */
6553f17a9db278d33517d9888dd77848f554522a38JP Abgrall} UNALIGNED;
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IP_MAXPACKET	65535		/* maximum packet size */
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Definitions for IP type of service (ip_tos)
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPTOS_LOWDELAY		0x10
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPTOS_THROUGHPUT	0x08
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPTOS_RELIABILITY	0x04
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Definitions for IP precedence (also in ip_tos) (hopefully unused)
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPTOS_PREC_NETCONTROL		0xe0
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPTOS_PREC_INTERNETCONTROL	0xc0
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPTOS_PREC_CRITIC_ECP		0xa0
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPTOS_PREC_FLASHOVERRIDE	0x80
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPTOS_PREC_FLASH		0x60
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPTOS_PREC_IMMEDIATE		0x40
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPTOS_PREC_PRIORITY		0x20
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPTOS_PREC_ROUTINE		0x00
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Definitions for options.
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_COPIED(o)		((o)&0x80)
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_CLASS(o)		((o)&0x60)
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_NUMBER(o)		((o)&0x1f)
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_CONTROL		0x00
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_RESERVED1		0x20
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_DEBMEAS		0x40
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_RESERVED2		0x60
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_EOL		0		/* end of option list */
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_NOP		1		/* no operation */
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_RR		7		/* record packet route */
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_TS		68		/* timestamp */
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_RFC1393           82              /* traceroute RFC 1393 */
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_SECURITY		130		/* provide s,c,h,tcc */
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_LSRR		131		/* loose source route */
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_SATID		136		/* satnet id */
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_SSRR		137		/* strict source route */
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IPOPT_RA                148             /* router-alert, rfc2113 */
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Offsets to fields in options other than EOL and NOP.
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_OPTVAL		0		/* option ID */
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_OLEN		1		/* option length */
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IPOPT_OFFSET		2		/* offset within option */
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_MINOFF		4		/* min value of above */
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Time stamp option structure.
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct	ip_timestamp {
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t	ipt_code;	/* IPOPT_TS */
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t	ipt_len;	/* size of structure (variable) */
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t	ipt_ptr;	/* index of current entry */
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t	ipt_oflwflg;	/* flags, overflow counter */
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IPTS_OFLW(ip)	(((ipt)->ipt_oflwflg & 0xf0) >> 4)
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IPTS_FLG(ip)	((ipt)->ipt_oflwflg & 0x0f)
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	union ipt_timestamp {
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int32_t ipt_time[1];
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		struct	ipt_ta {
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			struct in_addr ipt_addr;
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			u_int32_t ipt_time;
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} ipt_ta[1];
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} ipt_timestamp;
13753f17a9db278d33517d9888dd77848f554522a38JP Abgrall} UNALIGNED;
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* flag bits for ipt_flg */
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_TS_TSONLY		0		/* timestamps only */
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_TS_TSANDADDR	1		/* timestamps and addresses */
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_TS_PRESPEC	3		/* specified modules only */
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* bits for security (not byte swapped) */
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_SECUR_UNCLASS	0x0000
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_SECUR_CONFID	0xf135
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_SECUR_EFTO	0x789a
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_SECUR_MMMM	0xbc4d
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_SECUR_RESTR	0xaf13
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_SECUR_SECRET	0xd788
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPOPT_SECUR_TOPSECRET	0x6bc5
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Internet implementation parameters.
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	MAXTTL		255		/* maximum time to live (seconds) */
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPDEFTTL	64		/* default ttl, from RFC 1340 */
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPFRAGTTL	60		/* time to live for frags, slowhz */
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IPTTLDEC	1		/* subtracted when forwarding */
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	IP_MSS		576		/* default maximum segment size */
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* in print-ip.c */
16453f17a9db278d33517d9888dd77848f554522a38JP Abgrallextern int nextproto4_cksum(const struct ip *, const u_int8_t *, u_int, u_int);
165