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