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