xref: /linux/include/linux/ip.h (revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2)
1*1da177e4SLinus Torvalds /*
2*1da177e4SLinus Torvalds  * INET		An implementation of the TCP/IP protocol suite for the LINUX
3*1da177e4SLinus Torvalds  *		operating system.  INET is implemented using the  BSD Socket
4*1da177e4SLinus Torvalds  *		interface as the means of communication with the user level.
5*1da177e4SLinus Torvalds  *
6*1da177e4SLinus Torvalds  *		Definitions for the IP protocol.
7*1da177e4SLinus Torvalds  *
8*1da177e4SLinus Torvalds  * Version:	@(#)ip.h	1.0.2	04/28/93
9*1da177e4SLinus Torvalds  *
10*1da177e4SLinus Torvalds  * Authors:	Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
11*1da177e4SLinus Torvalds  *
12*1da177e4SLinus Torvalds  *		This program is free software; you can redistribute it and/or
13*1da177e4SLinus Torvalds  *		modify it under the terms of the GNU General Public License
14*1da177e4SLinus Torvalds  *		as published by the Free Software Foundation; either version
15*1da177e4SLinus Torvalds  *		2 of the License, or (at your option) any later version.
16*1da177e4SLinus Torvalds  */
17*1da177e4SLinus Torvalds #ifndef _LINUX_IP_H
18*1da177e4SLinus Torvalds #define _LINUX_IP_H
19*1da177e4SLinus Torvalds #include <asm/byteorder.h>
20*1da177e4SLinus Torvalds 
21*1da177e4SLinus Torvalds #define IPTOS_TOS_MASK		0x1E
22*1da177e4SLinus Torvalds #define IPTOS_TOS(tos)		((tos)&IPTOS_TOS_MASK)
23*1da177e4SLinus Torvalds #define	IPTOS_LOWDELAY		0x10
24*1da177e4SLinus Torvalds #define	IPTOS_THROUGHPUT	0x08
25*1da177e4SLinus Torvalds #define	IPTOS_RELIABILITY	0x04
26*1da177e4SLinus Torvalds #define	IPTOS_MINCOST		0x02
27*1da177e4SLinus Torvalds 
28*1da177e4SLinus Torvalds #define IPTOS_PREC_MASK		0xE0
29*1da177e4SLinus Torvalds #define IPTOS_PREC(tos)		((tos)&IPTOS_PREC_MASK)
30*1da177e4SLinus Torvalds #define IPTOS_PREC_NETCONTROL           0xe0
31*1da177e4SLinus Torvalds #define IPTOS_PREC_INTERNETCONTROL      0xc0
32*1da177e4SLinus Torvalds #define IPTOS_PREC_CRITIC_ECP           0xa0
33*1da177e4SLinus Torvalds #define IPTOS_PREC_FLASHOVERRIDE        0x80
34*1da177e4SLinus Torvalds #define IPTOS_PREC_FLASH                0x60
35*1da177e4SLinus Torvalds #define IPTOS_PREC_IMMEDIATE            0x40
36*1da177e4SLinus Torvalds #define IPTOS_PREC_PRIORITY             0x20
37*1da177e4SLinus Torvalds #define IPTOS_PREC_ROUTINE              0x00
38*1da177e4SLinus Torvalds 
39*1da177e4SLinus Torvalds 
40*1da177e4SLinus Torvalds /* IP options */
41*1da177e4SLinus Torvalds #define IPOPT_COPY		0x80
42*1da177e4SLinus Torvalds #define IPOPT_CLASS_MASK	0x60
43*1da177e4SLinus Torvalds #define IPOPT_NUMBER_MASK	0x1f
44*1da177e4SLinus Torvalds 
45*1da177e4SLinus Torvalds #define	IPOPT_COPIED(o)		((o)&IPOPT_COPY)
46*1da177e4SLinus Torvalds #define	IPOPT_CLASS(o)		((o)&IPOPT_CLASS_MASK)
47*1da177e4SLinus Torvalds #define	IPOPT_NUMBER(o)		((o)&IPOPT_NUMBER_MASK)
48*1da177e4SLinus Torvalds 
49*1da177e4SLinus Torvalds #define	IPOPT_CONTROL		0x00
50*1da177e4SLinus Torvalds #define	IPOPT_RESERVED1		0x20
51*1da177e4SLinus Torvalds #define	IPOPT_MEASUREMENT	0x40
52*1da177e4SLinus Torvalds #define	IPOPT_RESERVED2		0x60
53*1da177e4SLinus Torvalds 
54*1da177e4SLinus Torvalds #define IPOPT_END	(0 |IPOPT_CONTROL)
55*1da177e4SLinus Torvalds #define IPOPT_NOOP	(1 |IPOPT_CONTROL)
56*1da177e4SLinus Torvalds #define IPOPT_SEC	(2 |IPOPT_CONTROL|IPOPT_COPY)
57*1da177e4SLinus Torvalds #define IPOPT_LSRR	(3 |IPOPT_CONTROL|IPOPT_COPY)
58*1da177e4SLinus Torvalds #define IPOPT_TIMESTAMP	(4 |IPOPT_MEASUREMENT)
59*1da177e4SLinus Torvalds #define IPOPT_RR	(7 |IPOPT_CONTROL)
60*1da177e4SLinus Torvalds #define IPOPT_SID	(8 |IPOPT_CONTROL|IPOPT_COPY)
61*1da177e4SLinus Torvalds #define IPOPT_SSRR	(9 |IPOPT_CONTROL|IPOPT_COPY)
62*1da177e4SLinus Torvalds #define IPOPT_RA	(20|IPOPT_CONTROL|IPOPT_COPY)
63*1da177e4SLinus Torvalds 
64*1da177e4SLinus Torvalds #define IPVERSION	4
65*1da177e4SLinus Torvalds #define MAXTTL		255
66*1da177e4SLinus Torvalds #define IPDEFTTL	64
67*1da177e4SLinus Torvalds 
68*1da177e4SLinus Torvalds #define IPOPT_OPTVAL 0
69*1da177e4SLinus Torvalds #define IPOPT_OLEN   1
70*1da177e4SLinus Torvalds #define IPOPT_OFFSET 2
71*1da177e4SLinus Torvalds #define IPOPT_MINOFF 4
72*1da177e4SLinus Torvalds #define MAX_IPOPTLEN 40
73*1da177e4SLinus Torvalds #define IPOPT_NOP IPOPT_NOOP
74*1da177e4SLinus Torvalds #define IPOPT_EOL IPOPT_END
75*1da177e4SLinus Torvalds #define IPOPT_TS  IPOPT_TIMESTAMP
76*1da177e4SLinus Torvalds 
77*1da177e4SLinus Torvalds #define	IPOPT_TS_TSONLY		0		/* timestamps only */
78*1da177e4SLinus Torvalds #define	IPOPT_TS_TSANDADDR	1		/* timestamps and addresses */
79*1da177e4SLinus Torvalds #define	IPOPT_TS_PRESPEC	3		/* specified modules only */
80*1da177e4SLinus Torvalds 
81*1da177e4SLinus Torvalds #ifdef __KERNEL__
82*1da177e4SLinus Torvalds #include <linux/config.h>
83*1da177e4SLinus Torvalds #include <linux/types.h>
84*1da177e4SLinus Torvalds #include <net/sock.h>
85*1da177e4SLinus Torvalds #include <linux/igmp.h>
86*1da177e4SLinus Torvalds #include <net/flow.h>
87*1da177e4SLinus Torvalds 
88*1da177e4SLinus Torvalds struct ip_options {
89*1da177e4SLinus Torvalds   __u32		faddr;				/* Saved first hop address */
90*1da177e4SLinus Torvalds   unsigned char	optlen;
91*1da177e4SLinus Torvalds   unsigned char srr;
92*1da177e4SLinus Torvalds   unsigned char rr;
93*1da177e4SLinus Torvalds   unsigned char ts;
94*1da177e4SLinus Torvalds   unsigned char is_setbyuser:1,			/* Set by setsockopt?			*/
95*1da177e4SLinus Torvalds                 is_data:1,			/* Options in __data, rather than skb	*/
96*1da177e4SLinus Torvalds                 is_strictroute:1,		/* Strict source route			*/
97*1da177e4SLinus Torvalds                 srr_is_hit:1,			/* Packet destination addr was our one	*/
98*1da177e4SLinus Torvalds                 is_changed:1,			/* IP checksum more not valid		*/
99*1da177e4SLinus Torvalds                 rr_needaddr:1,			/* Need to record addr of outgoing dev	*/
100*1da177e4SLinus Torvalds                 ts_needtime:1,			/* Need to record timestamp		*/
101*1da177e4SLinus Torvalds                 ts_needaddr:1;			/* Need to record addr of outgoing dev  */
102*1da177e4SLinus Torvalds   unsigned char router_alert;
103*1da177e4SLinus Torvalds   unsigned char __pad1;
104*1da177e4SLinus Torvalds   unsigned char __pad2;
105*1da177e4SLinus Torvalds   unsigned char __data[0];
106*1da177e4SLinus Torvalds };
107*1da177e4SLinus Torvalds 
108*1da177e4SLinus Torvalds #define optlength(opt) (sizeof(struct ip_options) + opt->optlen)
109*1da177e4SLinus Torvalds 
110*1da177e4SLinus Torvalds struct ipv6_pinfo;
111*1da177e4SLinus Torvalds 
112*1da177e4SLinus Torvalds struct inet_sock {
113*1da177e4SLinus Torvalds 	/* sk and pinet6 has to be the first two members of inet_sock */
114*1da177e4SLinus Torvalds 	struct sock		sk;
115*1da177e4SLinus Torvalds #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
116*1da177e4SLinus Torvalds 	struct ipv6_pinfo	*pinet6;
117*1da177e4SLinus Torvalds #endif
118*1da177e4SLinus Torvalds 	/* Socket demultiplex comparisons on incoming packets. */
119*1da177e4SLinus Torvalds 	__u32			daddr;		/* Foreign IPv4 addr */
120*1da177e4SLinus Torvalds 	__u32			rcv_saddr;	/* Bound local IPv4 addr */
121*1da177e4SLinus Torvalds 	__u16			dport;		/* Destination port */
122*1da177e4SLinus Torvalds 	__u16			num;		/* Local port */
123*1da177e4SLinus Torvalds 	__u32			saddr;		/* Sending source */
124*1da177e4SLinus Torvalds 	__s16			uc_ttl;		/* Unicast TTL */
125*1da177e4SLinus Torvalds 	__u16			cmsg_flags;
126*1da177e4SLinus Torvalds 	struct ip_options	*opt;
127*1da177e4SLinus Torvalds 	__u16			sport;		/* Source port */
128*1da177e4SLinus Torvalds 	__u16			id;		/* ID counter for DF pkts */
129*1da177e4SLinus Torvalds 	__u8			tos;		/* TOS */
130*1da177e4SLinus Torvalds 	__u8			mc_ttl;		/* Multicasting TTL */
131*1da177e4SLinus Torvalds 	__u8			pmtudisc;
132*1da177e4SLinus Torvalds 	unsigned		recverr : 1,
133*1da177e4SLinus Torvalds 				freebind : 1,
134*1da177e4SLinus Torvalds 				hdrincl : 1,
135*1da177e4SLinus Torvalds 				mc_loop : 1;
136*1da177e4SLinus Torvalds 	int			mc_index;	/* Multicast device index */
137*1da177e4SLinus Torvalds 	__u32			mc_addr;
138*1da177e4SLinus Torvalds 	struct ip_mc_socklist	*mc_list;	/* Group array */
139*1da177e4SLinus Torvalds 	/*
140*1da177e4SLinus Torvalds 	 * Following members are used to retain the infomation to build
141*1da177e4SLinus Torvalds 	 * an ip header on each ip fragmentation while the socket is corked.
142*1da177e4SLinus Torvalds 	 */
143*1da177e4SLinus Torvalds 	struct {
144*1da177e4SLinus Torvalds 		unsigned int		flags;
145*1da177e4SLinus Torvalds 		unsigned int		fragsize;
146*1da177e4SLinus Torvalds 		struct ip_options	*opt;
147*1da177e4SLinus Torvalds 		struct rtable		*rt;
148*1da177e4SLinus Torvalds 		int			length; /* Total length of all frames */
149*1da177e4SLinus Torvalds 		u32			addr;
150*1da177e4SLinus Torvalds 		struct flowi		fl;
151*1da177e4SLinus Torvalds 	} cork;
152*1da177e4SLinus Torvalds };
153*1da177e4SLinus Torvalds 
154*1da177e4SLinus Torvalds #define IPCORK_OPT	1	/* ip-options has been held in ipcork.opt */
155*1da177e4SLinus Torvalds #define IPCORK_ALLFRAG	2	/* always fragment (for ipv6 for now) */
156*1da177e4SLinus Torvalds 
157*1da177e4SLinus Torvalds static inline struct inet_sock *inet_sk(const struct sock *sk)
158*1da177e4SLinus Torvalds {
159*1da177e4SLinus Torvalds 	return (struct inet_sock *)sk;
160*1da177e4SLinus Torvalds }
161*1da177e4SLinus Torvalds 
162*1da177e4SLinus Torvalds static inline void __inet_sk_copy_descendant(struct sock *sk_to,
163*1da177e4SLinus Torvalds 					     const struct sock *sk_from,
164*1da177e4SLinus Torvalds 					     const int ancestor_size)
165*1da177e4SLinus Torvalds {
166*1da177e4SLinus Torvalds 	memcpy(inet_sk(sk_to) + 1, inet_sk(sk_from) + 1,
167*1da177e4SLinus Torvalds 	       sk_from->sk_prot->obj_size - ancestor_size);
168*1da177e4SLinus Torvalds }
169*1da177e4SLinus Torvalds #if !(defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE))
170*1da177e4SLinus Torvalds static inline void inet_sk_copy_descendant(struct sock *sk_to,
171*1da177e4SLinus Torvalds 					   const struct sock *sk_from)
172*1da177e4SLinus Torvalds {
173*1da177e4SLinus Torvalds 	__inet_sk_copy_descendant(sk_to, sk_from, sizeof(struct inet_sock));
174*1da177e4SLinus Torvalds }
175*1da177e4SLinus Torvalds #endif
176*1da177e4SLinus Torvalds #endif
177*1da177e4SLinus Torvalds 
178*1da177e4SLinus Torvalds struct iphdr {
179*1da177e4SLinus Torvalds #if defined(__LITTLE_ENDIAN_BITFIELD)
180*1da177e4SLinus Torvalds 	__u8	ihl:4,
181*1da177e4SLinus Torvalds 		version:4;
182*1da177e4SLinus Torvalds #elif defined (__BIG_ENDIAN_BITFIELD)
183*1da177e4SLinus Torvalds 	__u8	version:4,
184*1da177e4SLinus Torvalds   		ihl:4;
185*1da177e4SLinus Torvalds #else
186*1da177e4SLinus Torvalds #error	"Please fix <asm/byteorder.h>"
187*1da177e4SLinus Torvalds #endif
188*1da177e4SLinus Torvalds 	__u8	tos;
189*1da177e4SLinus Torvalds 	__u16	tot_len;
190*1da177e4SLinus Torvalds 	__u16	id;
191*1da177e4SLinus Torvalds 	__u16	frag_off;
192*1da177e4SLinus Torvalds 	__u8	ttl;
193*1da177e4SLinus Torvalds 	__u8	protocol;
194*1da177e4SLinus Torvalds 	__u16	check;
195*1da177e4SLinus Torvalds 	__u32	saddr;
196*1da177e4SLinus Torvalds 	__u32	daddr;
197*1da177e4SLinus Torvalds 	/*The options start here. */
198*1da177e4SLinus Torvalds };
199*1da177e4SLinus Torvalds 
200*1da177e4SLinus Torvalds struct ip_auth_hdr {
201*1da177e4SLinus Torvalds 	__u8  nexthdr;
202*1da177e4SLinus Torvalds 	__u8  hdrlen;		/* This one is measured in 32 bit units! */
203*1da177e4SLinus Torvalds 	__u16 reserved;
204*1da177e4SLinus Torvalds 	__u32 spi;
205*1da177e4SLinus Torvalds 	__u32 seq_no;		/* Sequence number */
206*1da177e4SLinus Torvalds 	__u8  auth_data[0];	/* Variable len but >=4. Mind the 64 bit alignment! */
207*1da177e4SLinus Torvalds };
208*1da177e4SLinus Torvalds 
209*1da177e4SLinus Torvalds struct ip_esp_hdr {
210*1da177e4SLinus Torvalds 	__u32 spi;
211*1da177e4SLinus Torvalds 	__u32 seq_no;		/* Sequence number */
212*1da177e4SLinus Torvalds 	__u8  enc_data[0];	/* Variable len but >=8. Mind the 64 bit alignment! */
213*1da177e4SLinus Torvalds };
214*1da177e4SLinus Torvalds 
215*1da177e4SLinus Torvalds struct ip_comp_hdr {
216*1da177e4SLinus Torvalds 	__u8 nexthdr;
217*1da177e4SLinus Torvalds 	__u8 flags;
218*1da177e4SLinus Torvalds 	__u16 cpi;
219*1da177e4SLinus Torvalds };
220*1da177e4SLinus Torvalds 
221*1da177e4SLinus Torvalds #endif	/* _LINUX_IP_H */
222