Blame view

include/net/ipv6.h 18.6 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
  /*
   *	Linux INET6 implementation
   *
   *	Authors:
   *	Pedro Roque		<roque@di.fc.ul.pt>
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
8
9
10
11
12
13
14
15
16
17
   *	This program is free software; you can redistribute it and/or
   *      modify it under the terms of the GNU General Public License
   *      as published by the Free Software Foundation; either version
   *      2 of the License, or (at your option) any later version.
   */
  
  #ifndef _NET_IPV6_H
  #define _NET_IPV6_H
  
  #include <linux/ipv6.h>
  #include <linux/hardirq.h>
20283d84c   Herbert Xu   [IPV6]: Remove ci...
18
  #include <net/if_inet6.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  #include <net/ndisc.h>
  #include <net/flow.h>
  #include <net/snmp.h>
  
  #define SIN6_LEN_RFC2133	24
  
  #define IPV6_MAXPLEN		65535
  
  /*
   *	NextHeader field of IPv6 header
   */
  
  #define NEXTHDR_HOP		0	/* Hop-by-hop option header. */
  #define NEXTHDR_TCP		6	/* TCP segment. */
  #define NEXTHDR_UDP		17	/* UDP message. */
  #define NEXTHDR_IPV6		41	/* IPv6 in IPv6 */
  #define NEXTHDR_ROUTING		43	/* Routing header. */
  #define NEXTHDR_FRAGMENT	44	/* Fragmentation/reassembly header. */
  #define NEXTHDR_ESP		50	/* Encapsulating security payload. */
  #define NEXTHDR_AUTH		51	/* Authentication header. */
  #define NEXTHDR_ICMP		58	/* ICMP for IPv6. */
  #define NEXTHDR_NONE		59	/* No next header */
  #define NEXTHDR_DEST		60	/* Destination options header. */
2b741653b   Masahide NAKAMURA   [IPV6] MIP6: Add ...
42
  #define NEXTHDR_MOBILITY	135	/* Mobility header. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
  
  #define NEXTHDR_MAX		255
  
  
  
  #define IPV6_DEFAULT_HOPLIMIT   64
  #define IPV6_DEFAULT_MCASTHOPS	1
  
  /*
   *	Addr type
   *	
   *	type	-	unicast | multicast
   *	scope	-	local	| site	    | global
   *	v4	-	compat
   *	v4mapped
   *	any
   *	loopback
   */
  
  #define IPV6_ADDR_ANY		0x0000U
  
  #define IPV6_ADDR_UNICAST      	0x0001U	
  #define IPV6_ADDR_MULTICAST    	0x0002U	
  
  #define IPV6_ADDR_LOOPBACK	0x0010U
  #define IPV6_ADDR_LINKLOCAL	0x0020U
  #define IPV6_ADDR_SITELOCAL	0x0040U
  
  #define IPV6_ADDR_COMPATv4	0x0080U
  
  #define IPV6_ADDR_SCOPE_MASK	0x00f0U
  
  #define IPV6_ADDR_MAPPED	0x1000U
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76
77
78
79
  
  /*
   *	Addr scopes
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
82
  #define IPV6_ADDR_MC_SCOPE(a)	\
  	((a)->s6_addr[1] & 0x0f)	/* nonstandard */
  #define __IPV6_ADDR_SCOPE_INVALID	-1
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
83
84
85
86
87
88
89
  #define IPV6_ADDR_SCOPE_NODELOCAL	0x01
  #define IPV6_ADDR_SCOPE_LINKLOCAL	0x02
  #define IPV6_ADDR_SCOPE_SITELOCAL	0x05
  #define IPV6_ADDR_SCOPE_ORGLOCAL	0x08
  #define IPV6_ADDR_SCOPE_GLOBAL		0x0e
  
  /*
5ced13396   Linus Lüssing   ipv6: Add IPv6 mu...
90
91
   *	Addr flags
   */
5ced13396   Linus Lüssing   ipv6: Add IPv6 mu...
92
93
94
95
96
97
  #define IPV6_ADDR_MC_FLAG_TRANSIENT(a)	\
  	((a)->s6_addr[1] & 0x10)
  #define IPV6_ADDR_MC_FLAG_PREFIX(a)	\
  	((a)->s6_addr[1] & 0x20)
  #define IPV6_ADDR_MC_FLAG_RENDEZVOUS(a)	\
  	((a)->s6_addr[1] & 0x40)
5ced13396   Linus Lüssing   ipv6: Add IPv6 mu...
98
99
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
101
102
103
   *	fragmentation header
   */
  
  struct frag_hdr {
44473a6b2   Al Viro   [IPV6]: annotate ...
104
105
106
107
  	__u8	nexthdr;
  	__u8	reserved;
  	__be16	frag_off;
  	__be32	identification;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108
109
110
  };
  
  #define	IP6_MF	0x0001
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111
112
113
  #include <net/sock.h>
  
  /* sysctls */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
114
  extern int sysctl_mld_max_msf;
3d7cc2ba6   Pavel Emelyanov   [NETFILTER]: Swit...
115
  extern struct ctl_path net_ipv6_ctl_path[];
087fe2403   Denis V. Lunev   ipv6: added net a...
116
  #define _DEVINC(net, statname, modifier, idev, field)			\
14878f75a   David L Stevens   [IPV6]: Add ICMPM...
117
  ({									\
a11d206d0   YOSHIFUJI Hideaki   [IPV6]: Per-inter...
118
119
  	struct inet6_dev *_idev = (idev);				\
  	if (likely(_idev != NULL))					\
14878f75a   David L Stevens   [IPV6]: Add ICMPM...
120
  		SNMP_INC_STATS##modifier((_idev)->stats.statname, (field)); \
9261e5370   Denis V. Lunev   ipv6: making ip a...
121
  	SNMP_INC_STATS##modifier((net)->mib.statname##_statistics, (field));\
a11d206d0   YOSHIFUJI Hideaki   [IPV6]: Per-inter...
122
  })
14878f75a   David L Stevens   [IPV6]: Add ICMPM...
123

be281e554   Eric Dumazet   ipv6: reduce per ...
124
125
126
127
128
129
130
131
  /* per device counters are atomic_long_t */
  #define _DEVINCATOMIC(net, statname, modifier, idev, field)		\
  ({									\
  	struct inet6_dev *_idev = (idev);				\
  	if (likely(_idev != NULL))					\
  		SNMP_INC_STATS_ATOMIC_LONG((_idev)->stats.statname##dev, (field)); \
  	SNMP_INC_STATS##modifier((net)->mib.statname##_statistics, (field));\
  })
087fe2403   Denis V. Lunev   ipv6: added net a...
132
  #define _DEVADD(net, statname, modifier, idev, field, val)		\
8e7999c44   Pavel Emelyanov   [INET]: Consolida...
133
134
135
136
  ({									\
  	struct inet6_dev *_idev = (idev);				\
  	if (likely(_idev != NULL))					\
  		SNMP_ADD_STATS##modifier((_idev)->stats.statname, (field), (val)); \
9261e5370   Denis V. Lunev   ipv6: making ip a...
137
  	SNMP_ADD_STATS##modifier((net)->mib.statname##_statistics, (field), (val));\
8e7999c44   Pavel Emelyanov   [INET]: Consolida...
138
  })
edf391ff1   Neil Horman   snmp: add missing...
139
140
141
142
143
144
145
  #define _DEVUPD(net, statname, modifier, idev, field, val)		\
  ({									\
  	struct inet6_dev *_idev = (idev);				\
  	if (likely(_idev != NULL))					\
  		SNMP_UPD_PO_STATS##modifier((_idev)->stats.statname, field, (val)); \
  	SNMP_UPD_PO_STATS##modifier((net)->mib.statname##_statistics, field, (val));\
  })
14878f75a   David L Stevens   [IPV6]: Add ICMPM...
146
  /* MIBs */
14878f75a   David L Stevens   [IPV6]: Add ICMPM...
147

087fe2403   Denis V. Lunev   ipv6: added net a...
148
  #define IP6_INC_STATS(net, idev,field)		\
4ce3c183f   Eric Dumazet   snmp: 64bit ipsta...
149
  		_DEVINC(net, ipv6, 64, idev, field)
087fe2403   Denis V. Lunev   ipv6: added net a...
150
  #define IP6_INC_STATS_BH(net, idev,field)	\
4ce3c183f   Eric Dumazet   snmp: 64bit ipsta...
151
  		_DEVINC(net, ipv6, 64_BH, idev, field)
edf391ff1   Neil Horman   snmp: add missing...
152
  #define IP6_ADD_STATS(net, idev,field,val)	\
4ce3c183f   Eric Dumazet   snmp: 64bit ipsta...
153
  		_DEVADD(net, ipv6, 64, idev, field, val)
087fe2403   Denis V. Lunev   ipv6: added net a...
154
  #define IP6_ADD_STATS_BH(net, idev,field,val)	\
4ce3c183f   Eric Dumazet   snmp: 64bit ipsta...
155
  		_DEVADD(net, ipv6, 64_BH, idev, field, val)
edf391ff1   Neil Horman   snmp: add missing...
156
  #define IP6_UPD_PO_STATS(net, idev,field,val)   \
4ce3c183f   Eric Dumazet   snmp: 64bit ipsta...
157
  		_DEVUPD(net, ipv6, 64, idev, field, val)
edf391ff1   Neil Horman   snmp: add missing...
158
  #define IP6_UPD_PO_STATS_BH(net, idev,field,val)   \
4ce3c183f   Eric Dumazet   snmp: 64bit ipsta...
159
  		_DEVUPD(net, ipv6, 64_BH, idev, field, val)
087fe2403   Denis V. Lunev   ipv6: added net a...
160
  #define ICMP6_INC_STATS(net, idev, field)	\
be281e554   Eric Dumazet   ipv6: reduce per ...
161
  		_DEVINCATOMIC(net, icmpv6, , idev, field)
087fe2403   Denis V. Lunev   ipv6: added net a...
162
  #define ICMP6_INC_STATS_BH(net, idev, field)	\
be281e554   Eric Dumazet   ipv6: reduce per ...
163
  		_DEVINCATOMIC(net, icmpv6, _BH, idev, field)
087fe2403   Denis V. Lunev   ipv6: added net a...
164
165
  
  #define ICMP6MSGOUT_INC_STATS(net, idev, field)		\
be281e554   Eric Dumazet   ipv6: reduce per ...
166
  	_DEVINCATOMIC(net, icmpv6msg, , idev, field +256)
087fe2403   Denis V. Lunev   ipv6: added net a...
167
  #define ICMP6MSGOUT_INC_STATS_BH(net, idev, field)	\
be281e554   Eric Dumazet   ipv6: reduce per ...
168
  	_DEVINCATOMIC(net, icmpv6msg, _BH, idev, field +256)
087fe2403   Denis V. Lunev   ipv6: added net a...
169
  #define ICMP6MSGIN_INC_STATS_BH(net, idev, field)	\
be281e554   Eric Dumazet   ipv6: reduce per ...
170
  	_DEVINCATOMIC(net, icmpv6msg, _BH, idev, field)
14878f75a   David L Stevens   [IPV6]: Add ICMPM...
171

fd2c3ef76   Eric Dumazet   net: cleanup incl...
172
  struct ip6_ra_chain {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
173
174
175
176
177
178
179
180
181
182
183
184
185
  	struct ip6_ra_chain	*next;
  	struct sock		*sk;
  	int			sel;
  	void			(*destructor)(struct sock *);
  };
  
  extern struct ip6_ra_chain	*ip6_ra_chain;
  extern rwlock_t ip6_ra_lock;
  
  /*
     This structure is prepared by protocol, when parsing
     ancillary data and passed to IPv6.
   */
fd2c3ef76   Eric Dumazet   net: cleanup incl...
186
  struct ipv6_txoptions {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
187
188
189
190
191
192
193
194
195
196
197
  	/* Length of this structure */
  	int			tot_len;
  
  	/* length of extension headers   */
  
  	__u16			opt_flen;	/* after fragment hdr */
  	__u16			opt_nflen;	/* before fragment hdr */
  
  	struct ipv6_opt_hdr	*hopopt;
  	struct ipv6_opt_hdr	*dst0opt;
  	struct ipv6_rt_hdr	*srcrt;	/* Routing Header */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
198
199
200
201
  	struct ipv6_opt_hdr	*dst1opt;
  
  	/* Option buffer, as read by IPV6_PKTOPTIONS, starts here. */
  };
fd2c3ef76   Eric Dumazet   net: cleanup incl...
202
  struct ip6_flowlabel {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
203
  	struct ip6_flowlabel	*next;
90bcaf7b4   Al Viro   [IPV6]: flowlabel...
204
  	__be32			label;
db3459d1a   Eric Dumazet   [IPV6]: Some clea...
205
  	atomic_t		users;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
206
207
  	struct in6_addr		dst;
  	struct ipv6_txoptions	*opt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
208
209
210
211
212
  	unsigned long		linger;
  	u8			share;
  	u32			owner;
  	unsigned long		lastuse;
  	unsigned long		expires;
60e8fbc4c   Benjamin Thery   [NETNS][IPV6] flo...
213
  	struct net		*fl_net;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
214
  };
f3a7c66b5   Harvey Harrison   net: replace __co...
215
216
  #define IPV6_FLOWINFO_MASK	cpu_to_be32(0x0FFFFFFF)
  #define IPV6_FLOWLABEL_MASK	cpu_to_be32(0x000FFFFF)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
217

fd2c3ef76   Eric Dumazet   net: cleanup incl...
218
  struct ipv6_fl_socklist {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
219
220
221
  	struct ipv6_fl_socklist	*next;
  	struct ip6_flowlabel	*fl;
  };
90bcaf7b4   Al Viro   [IPV6]: flowlabel...
222
  extern struct ip6_flowlabel	*fl6_sock_lookup(struct sock *sk, __be32 label);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
223
224
225
226
227
  extern struct ipv6_txoptions	*fl6_merge_options(struct ipv6_txoptions * opt_space,
  						   struct ip6_flowlabel * fl,
  						   struct ipv6_txoptions * fopt);
  extern void			fl6_free_socklist(struct sock *sk);
  extern int			ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen);
0a3e78ac2   Daniel Lezcano   [IPV6]: make flow...
228
  extern int			ip6_flowlabel_init(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
229
230
231
232
233
234
235
  extern void			ip6_flowlabel_cleanup(void);
  
  static inline void fl6_sock_release(struct ip6_flowlabel *fl)
  {
  	if (fl)
  		atomic_dec(&fl->users);
  }
725a8ff04   Denis V. Lunev   ipv6: remove unus...
236
  extern int 			ip6_ra_control(struct sock *sk, int sel);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
237

e5bbef20e   Herbert Xu   [IPV6]: Replace s...
238
  extern int			ipv6_parse_hopopts(struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
239
240
  
  extern struct ipv6_txoptions *  ipv6_dup_options(struct sock *sk, struct ipv6_txoptions *opt);
333fad536   YOSHIFUJI Hideaki   [IPV6]: Support s...
241
242
243
244
  extern struct ipv6_txoptions *	ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt,
  						   int newtype,
  						   struct ipv6_opt_hdr __user *newopt,
  						   int newoptlen);
df9890c31   YOSHIFUJI Hideaki   [IPV6]: Fix sendi...
245
246
  struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space,
  					  struct ipv6_txoptions *opt);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
247

399c07def   Arnaldo Carvalho de Melo   [IPV6]: Export ip...
248
  extern int ipv6_opt_accepted(struct sock *sk, struct sk_buff *skb);
e5a2bb842   Pavel Emelyanov   [NETNS][FRAGS]: M...
249
  int ip6_frag_nqueues(struct net *net);
6ddc08222   Pavel Emelyanov   [NETNS][FRAGS]: M...
250
  int ip6_frag_mem(struct net *net);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
251

9874c41cd   Joe Perches   ipv6.h: reassembl...
252
253
254
  #define IPV6_FRAG_HIGH_THRESH	(256 * 1024)	/* 262144 */
  #define IPV6_FRAG_LOW_THRESH	(192 * 1024)	/* 196608 */
  #define IPV6_FRAG_TIMEOUT	(60 * HZ)	/* 60 seconds */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
255

b1cacb682   YOSHIFUJI Hideaki   [IPV6]: Make ipv6...
256
257
258
259
260
  extern int __ipv6_addr_type(const struct in6_addr *addr);
  static inline int ipv6_addr_type(const struct in6_addr *addr)
  {
  	return __ipv6_addr_type(addr) & 0xffff;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
261
262
263
  
  static inline int ipv6_addr_scope(const struct in6_addr *addr)
  {
b1cacb682   YOSHIFUJI Hideaki   [IPV6]: Make ipv6...
264
265
266
267
268
  	return __ipv6_addr_type(addr) & IPV6_ADDR_SCOPE_MASK;
  }
  
  static inline int __ipv6_addr_src_scope(int type)
  {
a02cec215   Eric Dumazet   net: return opera...
269
  	return (type == IPV6_ADDR_ANY) ? __IPV6_ADDR_SCOPE_INVALID : (type >> 16);
b1cacb682   YOSHIFUJI Hideaki   [IPV6]: Make ipv6...
270
271
272
273
274
  }
  
  static inline int ipv6_addr_src_scope(const struct in6_addr *addr)
  {
  	return __ipv6_addr_src_scope(__ipv6_addr_type(addr));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
275
276
277
278
  }
  
  static inline int ipv6_addr_cmp(const struct in6_addr *a1, const struct in6_addr *a2)
  {
db3459d1a   Eric Dumazet   [IPV6]: Some clea...
279
  	return memcmp(a1, a2, sizeof(struct in6_addr));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
280
  }
f2ffd9eed   Patrick McHardy   [NETFILTER]: Move...
281
282
283
284
  static inline int
  ipv6_masked_addr_cmp(const struct in6_addr *a1, const struct in6_addr *m,
  		     const struct in6_addr *a2)
  {
a02cec215   Eric Dumazet   net: return opera...
285
286
287
288
  	return !!(((a1->s6_addr32[0] ^ a2->s6_addr32[0]) & m->s6_addr32[0]) |
  		  ((a1->s6_addr32[1] ^ a2->s6_addr32[1]) & m->s6_addr32[1]) |
  		  ((a1->s6_addr32[2] ^ a2->s6_addr32[2]) & m->s6_addr32[2]) |
  		  ((a1->s6_addr32[3] ^ a2->s6_addr32[3]) & m->s6_addr32[3]));
f2ffd9eed   Patrick McHardy   [NETFILTER]: Move...
289
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
290
291
  static inline void ipv6_addr_copy(struct in6_addr *a1, const struct in6_addr *a2)
  {
db3459d1a   Eric Dumazet   [IPV6]: Some clea...
292
  	memcpy(a1, a2, sizeof(struct in6_addr));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
294
295
296
297
298
299
300
301
  }
  
  static inline void ipv6_addr_prefix(struct in6_addr *pfx, 
  				    const struct in6_addr *addr,
  				    int plen)
  {
  	/* caller must guarantee 0 <= plen <= 128 */
  	int o = plen >> 3,
  	    b = plen & 0x7;
db3459d1a   Eric Dumazet   [IPV6]: Some clea...
302
  	memset(pfx->s6_addr, 0, sizeof(pfx->s6_addr));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
303
  	memcpy(pfx->s6_addr, addr, o);
db3459d1a   Eric Dumazet   [IPV6]: Some clea...
304
  	if (b != 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
305
  		pfx->s6_addr[o] = addr->s6_addr[o] & (0xff00 >> b);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
306
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
307
  static inline void ipv6_addr_set(struct in6_addr *addr, 
48818f822   Al Viro   [IPV6]: struct in...
308
309
  				     __be32 w1, __be32 w2,
  				     __be32 w3, __be32 w4)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
310
311
312
313
314
315
  {
  	addr->s6_addr32[0] = w1;
  	addr->s6_addr32[1] = w2;
  	addr->s6_addr32[2] = w3;
  	addr->s6_addr32[3] = w4;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316
317
318
319
  
  static inline int ipv6_addr_equal(const struct in6_addr *a1,
  				  const struct in6_addr *a2)
  {
a02cec215   Eric Dumazet   net: return opera...
320
321
322
323
  	return ((a1->s6_addr32[0] ^ a2->s6_addr32[0]) |
  		(a1->s6_addr32[1] ^ a2->s6_addr32[1]) |
  		(a1->s6_addr32[2] ^ a2->s6_addr32[2]) |
  		(a1->s6_addr32[3] ^ a2->s6_addr32[3])) == 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
324
  }
48818f822   Al Viro   [IPV6]: struct in...
325
  static inline int __ipv6_prefix_equal(const __be32 *a1, const __be32 *a2,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
  				      unsigned int prefixlen)
  {
  	unsigned pdw, pbi;
  
  	/* check complete u32 in prefix */
  	pdw = prefixlen >> 5;
  	if (pdw && memcmp(a1, a2, pdw << 2))
  		return 0;
  
  	/* check incomplete u32 in prefix */
  	pbi = prefixlen & 0x1f;
  	if (pbi && ((a1[pdw] ^ a2[pdw]) & htonl((0xffffffff) << (32 - pbi))))
  		return 0;
  
  	return 1;
  }
  
  static inline int ipv6_prefix_equal(const struct in6_addr *a1,
  				    const struct in6_addr *a2,
  				    unsigned int prefixlen)
  {
  	return __ipv6_prefix_equal(a1->s6_addr32, a2->s6_addr32,
  				   prefixlen);
  }
2588fe1d7   Pavel Emelyanov   [INET]: Consolida...
350
  struct inet_frag_queue;
2588fe1d7   Pavel Emelyanov   [INET]: Consolida...
351

0b5ccb2ee   Patrick McHardy   ipv6: reassembly:...
352
353
354
  enum ip6_defrag_users {
  	IP6_DEFRAG_LOCAL_DELIVER,
  	IP6_DEFRAG_CONNTRACK_IN,
4be929be3   Alexey Dobriyan   kernel-wide: repl...
355
  	__IP6_DEFRAG_CONNTRACK_IN	= IP6_DEFRAG_CONNTRACK_IN + USHRT_MAX,
0b5ccb2ee   Patrick McHardy   ipv6: reassembly:...
356
  	IP6_DEFRAG_CONNTRACK_OUT,
4be929be3   Alexey Dobriyan   kernel-wide: repl...
357
  	__IP6_DEFRAG_CONNTRACK_OUT	= IP6_DEFRAG_CONNTRACK_OUT + USHRT_MAX,
8fa9ff684   Patrick McHardy   netfilter: fix cr...
358
  	IP6_DEFRAG_CONNTRACK_BRIDGE_IN,
4be929be3   Alexey Dobriyan   kernel-wide: repl...
359
  	__IP6_DEFRAG_CONNTRACK_BRIDGE_IN = IP6_DEFRAG_CONNTRACK_BRIDGE_IN + USHRT_MAX,
0b5ccb2ee   Patrick McHardy   ipv6: reassembly:...
360
  };
c6fda2822   Pavel Emelyanov   [INET]: Consolida...
361
362
  struct ip6_create_arg {
  	__be32 id;
0b5ccb2ee   Patrick McHardy   ipv6: reassembly:...
363
  	u32 user;
b71d1d426   Eric Dumazet   inet: constify ip...
364
365
  	const struct in6_addr *src;
  	const struct in6_addr *dst;
c6fda2822   Pavel Emelyanov   [INET]: Consolida...
366
367
368
  };
  
  void ip6_frag_init(struct inet_frag_queue *q, void *a);
abd6523d1   Pavel Emelyanov   [INET]: Consolida...
369
  int ip6_frag_match(struct inet_frag_queue *q, void *a);
c6fda2822   Pavel Emelyanov   [INET]: Consolida...
370

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
371
372
  static inline int ipv6_addr_any(const struct in6_addr *a)
  {
a02cec215   Eric Dumazet   net: return opera...
373
374
  	return (a->s6_addr32[0] | a->s6_addr32[1] |
  		a->s6_addr32[2] | a->s6_addr32[3]) == 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
375
  }
f630e43a2   YOSHIFUJI Hideaki   ipv6: Drop packet...
376
377
  static inline int ipv6_addr_loopback(const struct in6_addr *a)
  {
a02cec215   Eric Dumazet   net: return opera...
378
379
  	return (a->s6_addr32[0] | a->s6_addr32[1] |
  		a->s6_addr32[2] | (a->s6_addr32[3] ^ htonl(1))) == 0;
f630e43a2   YOSHIFUJI Hideaki   ipv6: Drop packet...
380
  }
e773e4faa   Brian Haley   [IPV6]: Add v4map...
381
382
  static inline int ipv6_addr_v4mapped(const struct in6_addr *a)
  {
a02cec215   Eric Dumazet   net: return opera...
383
384
  	return (a->s6_addr32[0] | a->s6_addr32[1] |
  		 (a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0;
e773e4faa   Brian Haley   [IPV6]: Add v4map...
385
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
386
  /*
99cd07a53   Juha-Matti Tapio   [IPV6]: Fix sourc...
387
388
389
390
391
   * Check for a RFC 4843 ORCHID address
   * (Overlay Routable Cryptographic Hash Identifiers)
   */
  static inline int ipv6_addr_orchid(const struct in6_addr *a)
  {
a02cec215   Eric Dumazet   net: return opera...
392
  	return (a->s6_addr32[0] & htonl(0xfffffff0)) == htonl(0x20010010);
99cd07a53   Juha-Matti Tapio   [IPV6]: Fix sourc...
393
  }
f15364bd4   Aurélien Charbon   IPv6 support for ...
394
395
396
397
398
399
400
401
  static inline void ipv6_addr_set_v4mapped(const __be32 addr,
  					  struct in6_addr *v4mapped)
  {
  	ipv6_addr_set(v4mapped,
  			0, 0,
  			htonl(0x0000FFFF),
  			addr);
  }
99cd07a53   Juha-Matti Tapio   [IPV6]: Fix sourc...
402
  /*
971f359dd   YOSHIFUJI Hideaki   [IPV6]: Put addr_...
403
404
405
406
407
   * find the first different bit between two addresses
   * length of address must be a multiple of 32bits
   */
  static inline int __ipv6_addr_diff(const void *token1, const void *token2, int addrlen)
  {
ef296f56f   Al Viro   [IPV6]: __ipv6_ad...
408
  	const __be32 *a1 = token1, *a2 = token2;
971f359dd   YOSHIFUJI Hideaki   [IPV6]: Put addr_...
409
410
411
412
413
  	int i;
  
  	addrlen >>= 2;
  
  	for (i = 0; i < addrlen; i++) {
ef296f56f   Al Viro   [IPV6]: __ipv6_ad...
414
415
  		__be32 xb = a1[i] ^ a2[i];
  		if (xb)
d57b8fb8a   YOSHIFUJI Hideaki / 吉藤英明   ipv6: Use __fls()...
416
  			return i * 32 + 31 - __fls(ntohl(xb));
971f359dd   YOSHIFUJI Hideaki   [IPV6]: Put addr_...
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
  	}
  
  	/*
  	 *	we should *never* get to this point since that 
  	 *	would mean the addrs are equal
  	 *
  	 *	However, we do get to it 8) And exacly, when
  	 *	addresses are equal 8)
  	 *
  	 *	ip route add 1111::/128 via ...
  	 *	ip route add 1111::/64 via ...
  	 *	and we are here.
  	 *
  	 *	Ideally, this function should stop comparison
  	 *	at prefix length. It does not, but it is still OK,
  	 *	if returned value is greater than prefix length.
  	 *					--ANK (980803)
  	 */
a02cec215   Eric Dumazet   net: return opera...
435
  	return addrlen << 5;
971f359dd   YOSHIFUJI Hideaki   [IPV6]: Put addr_...
436
437
438
439
440
441
  }
  
  static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_addr *a2)
  {
  	return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr));
  }
87c48fa3b   Eric Dumazet   ipv6: make fragme...
442
  extern void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt);
7ea2f2c5a   Sridhar Samudrala   udpv6: Remove unu...
443

971f359dd   YOSHIFUJI Hideaki   [IPV6]: Put addr_...
444
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
445
446
447
448
449
450
451
452
453
   *	Prototypes exported by ipv6
   */
  
  /*
   *	rcv function (called from netdevice level)
   */
  
  extern int			ipv6_rcv(struct sk_buff *skb, 
  					 struct net_device *dev, 
f2ccd8fa0   David S. Miller   [NET]: Kill skb->...
454
455
  					 struct packet_type *pt,
  					 struct net_device *orig_dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
456

b05e10669   Patrick McHardy   [IPV4/6]: Netfilt...
457
  extern int			ip6_rcv_finish(struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
458
459
460
461
462
  /*
   *	upper-layer output functions
   */
  extern int			ip6_xmit(struct sock *sk,
  					 struct sk_buff *skb,
4c9483b2f   David S. Miller   ipv6: Convert to ...
463
  					 struct flowi6 *fl6,
b903d324b   Eric Dumazet   ipv6: tcp: fix TC...
464
465
  					 struct ipv6_txoptions *opt,
  					 int tclass);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
466
467
468
469
  
  extern int			ip6_nd_hdr(struct sock *sk,
  					   struct sk_buff *skb,
  					   struct net_device *dev,
9acd9f3ae   YOSHIFUJI Hideaki   [IPV6]: Make addr...
470
471
  					   const struct in6_addr *saddr,
  					   const struct in6_addr *daddr,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
472
473
474
475
476
477
478
479
480
481
  					   int proto, int len);
  
  extern int			ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr);
  
  extern int			ip6_append_data(struct sock *sk,
  						int getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb),
  		    				void *from,
  						int length,
  						int transhdrlen,
  		      				int hlimit,
41a1f8ea4   YOSHIFUJI Hideaki   [IPV6]: Support I...
482
  		      				int tclass,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
483
  						struct ipv6_txoptions *opt,
4c9483b2f   David S. Miller   ipv6: Convert to ...
484
  						struct flowi6 *fl6,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
485
  						struct rt6_info *rt,
13b52cd44   Brian Haley   IPv6: Add dontfra...
486
487
  						unsigned int flags,
  						int dontfrag);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
488
489
490
491
492
493
494
  
  extern int			ip6_push_pending_frames(struct sock *sk);
  
  extern void			ip6_flush_pending_frames(struct sock *sk);
  
  extern int			ip6_dst_lookup(struct sock *sk,
  					       struct dst_entry **dst,
4c9483b2f   David S. Miller   ipv6: Convert to ...
495
  					       struct flowi6 *fl6);
68d0c6d34   David S. Miller   ipv6: Consolidate...
496
  extern struct dst_entry *	ip6_dst_lookup_flow(struct sock *sk,
4c9483b2f   David S. Miller   ipv6: Convert to ...
497
  						    struct flowi6 *fl6,
68d0c6d34   David S. Miller   ipv6: Consolidate...
498
  						    const struct in6_addr *final_dst,
a1414715f   David S. Miller   ipv6: Change fina...
499
  						    bool can_sleep);
68d0c6d34   David S. Miller   ipv6: Consolidate...
500
  extern struct dst_entry *	ip6_sk_dst_lookup_flow(struct sock *sk,
4c9483b2f   David S. Miller   ipv6: Convert to ...
501
  						       struct flowi6 *fl6,
68d0c6d34   David S. Miller   ipv6: Consolidate...
502
  						       const struct in6_addr *final_dst,
a1414715f   David S. Miller   ipv6: Change fina...
503
  						       bool can_sleep);
2774c131b   David S. Miller   xfrm: Handle blac...
504
505
  extern struct dst_entry *	ip6_blackhole_route(struct net *net,
  						    struct dst_entry *orig_dst);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
506
507
508
509
510
511
512
513
514
  
  /*
   *	skb processing functions
   */
  
  extern int			ip6_output(struct sk_buff *skb);
  extern int			ip6_forward(struct sk_buff *skb);
  extern int			ip6_input(struct sk_buff *skb);
  extern int			ip6_mc_input(struct sk_buff *skb);
ef76bc23e   Herbert Xu   [IPV6]: Add ip6_l...
515
516
  extern int			__ip6_local_out(struct sk_buff *skb);
  extern int			ip6_local_out(struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
517
518
519
  /*
   *	Extension header (options) processing
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
520
521
522
523
524
525
526
527
528
  extern void 			ipv6_push_nfrag_opts(struct sk_buff *skb,
  						     struct ipv6_txoptions *opt,
  						     u8 *proto,
  						     struct in6_addr **daddr_p);
  extern void			ipv6_push_frag_opts(struct sk_buff *skb,
  						    struct ipv6_txoptions *opt,
  						    u8 *proto);
  
  extern int			ipv6_skip_exthdr(const struct sk_buff *, int start,
0d3d077cd   Herbert Xu   [SELINUX]: Fix ip...
529
  					         u8 *nexthdrp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
530
531
  
  extern int 			ipv6_ext_hdr(u8 nexthdr);
c61a40432   Masahide NAKAMURA   [IPV6]: Find opti...
532
  extern int ipv6_find_tlv(struct sk_buff *skb, int offset, int type);
4c9483b2f   David S. Miller   ipv6: Convert to ...
533
  extern struct in6_addr *fl6_update_dst(struct flowi6 *fl6,
20c59de2e   Arnaud Ebalard   ipv6: Refactor up...
534
535
  				       const struct ipv6_txoptions *opt,
  				       struct in6_addr *orig);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
536
537
538
539
540
541
542
  /*
   *	socket options (ipv6_sockglue.c)
   */
  
  extern int			ipv6_setsockopt(struct sock *sk, int level, 
  						int optname,
  						char __user *optval, 
b7058842c   David S. Miller   net: Make setsock...
543
  						unsigned int optlen);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
544
545
546
547
  extern int			ipv6_getsockopt(struct sock *sk, int level, 
  						int optname,
  						char __user *optval, 
  						int __user *optlen);
3fdadf7d2   Dmitry Mishin   [NET]: {get|set}s...
548
549
550
551
  extern int			compat_ipv6_setsockopt(struct sock *sk,
  						int level,
  						int optname,
  						char __user *optval,
b7058842c   David S. Miller   net: Make setsock...
552
  						unsigned int optlen);
3fdadf7d2   Dmitry Mishin   [NET]: {get|set}s...
553
554
555
556
557
  extern int			compat_ipv6_getsockopt(struct sock *sk,
  						int level,
  						int optname,
  						char __user *optval,
  						int __user *optlen);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
558

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
559
560
561
562
  extern int			ip6_datagram_connect(struct sock *sk, 
  						     struct sockaddr *addr, int addr_len);
  
  extern int 			ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len);
4b340ae20   Brian Haley   IPv6: Complete IP...
563
  extern int 			ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len);
e69a4adc6   Al Viro   [IPV6]: Misc endi...
564
  extern void			ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
565
  						u32 info, u8 *payload);
4c9483b2f   David S. Miller   ipv6: Convert to ...
566
567
  extern void			ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info);
  extern void			ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
568
569
570
571
572
573
574
575
  
  extern int inet6_release(struct socket *sock);
  extern int inet6_bind(struct socket *sock, struct sockaddr *uaddr, 
  		      int addr_len);
  extern int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
  			 int *uaddr_len, int peer);
  extern int inet6_ioctl(struct socket *sock, unsigned int cmd, 
  		       unsigned long arg);
d8313f5ca   Arnaldo Carvalho de Melo   [INET6]: Generali...
576
577
  extern int inet6_hash_connect(struct inet_timewait_death_row *death_row,
  			      struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
578
579
580
  /*
   * reassembly.c
   */
90ddc4f04   Eric Dumazet   [NET]: move struc...
581
582
  extern const struct proto_ops inet6_stream_ops;
  extern const struct proto_ops inet6_dgram_ops;
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
583

14c850212   Arnaldo Carvalho de Melo   [INET_SOCK]: Move...
584
585
  struct group_source_req;
  struct group_filter;
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
586
587
588
589
590
591
  extern int ip6_mc_source(int add, int omode, struct sock *sk,
  			 struct group_source_req *pgsr);
  extern int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf);
  extern int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf,
  			 struct group_filter __user *optval,
  			 int __user *optlen);
93c8b90f0   Ilpo Järvinen   ipv6: almost iden...
592
593
  extern unsigned int inet6_hash_frag(__be32 id, const struct in6_addr *saddr,
  				    const struct in6_addr *daddr, u32 rnd);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
594
595
  
  #ifdef CONFIG_PROC_FS
6ab57e7e7   Daniel Lezcano   [NETNS][IPV6] any...
596
597
  extern int  ac6_proc_init(struct net *net);
  extern void ac6_proc_exit(struct net *net);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
598
599
  extern int  raw6_proc_init(void);
  extern void raw6_proc_exit(void);
6f8b13bcb   Daniel Lezcano   [NETNS][IPV6] tcp...
600
601
  extern int  tcp6_proc_init(struct net *net);
  extern void tcp6_proc_exit(struct net *net);
0c96d8c50   Daniel Lezcano   [NETNS][IPV6] udp...
602
603
  extern int  udp6_proc_init(struct net *net);
  extern void udp6_proc_exit(struct net *net);
ba4e58eca   Gerrit Renker   [NET]: Supporting...
604
605
  extern int  udplite6_proc_init(void);
  extern void udplite6_proc_exit(void);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
606
607
  extern int  ipv6_misc_proc_init(void);
  extern void ipv6_misc_proc_exit(void);
7f7d9a6b9   Herbert Xu   [IPV6]: Consolida...
608
609
  extern int snmp6_register_dev(struct inet6_dev *idev);
  extern int snmp6_unregister_dev(struct inet6_dev *idev);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
610

7f7d9a6b9   Herbert Xu   [IPV6]: Consolida...
611
  #else
6ab57e7e7   Daniel Lezcano   [NETNS][IPV6] any...
612
613
614
615
  static inline int ac6_proc_init(struct net *net) { return 0; }
  static inline void ac6_proc_exit(struct net *net) { }
  static inline int snmp6_register_dev(struct inet6_dev *idev) { return 0; }
  static inline int snmp6_unregister_dev(struct inet6_dev *idev) { return 0; }
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
616
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
617

20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
618
  #ifdef CONFIG_SYSCTL
760f2d018   Daniel Lezcano   [NETNS][IPV6]: Ma...
619
620
  extern ctl_table ipv6_route_table_template[];
  extern ctl_table ipv6_icmp_table_template[];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
621

6de1a9104   Daniel Lezcano   [IPV6]: Fix sysct...
622
623
  extern struct ctl_table *ipv6_icmp_sysctl_init(struct net *net);
  extern struct ctl_table *ipv6_route_sysctl_init(struct net *net);
291480c09   Daniel Lezcano   [NETNS][IPV6]: Ma...
624
  extern int ipv6_sysctl_register(void);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
625
  extern void ipv6_sysctl_unregister(void);
eeb61f719   Al Viro   missing bits of n...
626
627
  extern int ipv6_static_sysctl_register(void);
  extern void ipv6_static_sysctl_unregister(void);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
628
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
629

20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
630
  #endif /* _NET_IPV6_H */