Blame view

include/net/ipv6.h 29.1 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>
08dcdbf6a   Eric Dumazet   ipv6: use a stron...
18
  #include <linux/jhash.h>
0aeea21ad   Reshetova, Elena   net, ipv6: conver...
19
  #include <linux/refcount.h>
20283d84c   Herbert Xu   [IPV6]: Remove ci...
20
  #include <net/if_inet6.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
  #include <net/ndisc.h>
  #include <net/flow.h>
1bd758eb1   Jiri Pirko   net: change name ...
23
  #include <net/flow_dissector.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  #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. */
c12b395a4   xeb@mail.ru   gre: Support GRE ...
40
  #define NEXTHDR_GRE		47	/* GRE header. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
42
43
44
45
  #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. */
280c571e1   Joe Stringer   net: Add NEXTHDR_...
46
  #define NEXTHDR_SCTP		132	/* SCTP message. */
2b741653b   Masahide NAKAMURA   [IPV6] MIP6: Add ...
47
  #define NEXTHDR_MOBILITY	135	/* Mobility header. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
49
  
  #define NEXTHDR_MAX		255
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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
76
77
  #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
78
79
80
81
  
  /*
   *	Addr scopes
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
82
83
84
  #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
85
86
87
88
89
90
91
  #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...
92
93
   *	Addr flags
   */
5ced13396   Linus Lüssing   ipv6: Add IPv6 mu...
94
95
96
97
98
99
  #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...
100
101
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
102
103
104
105
   *	fragmentation header
   */
  
  struct frag_hdr {
44473a6b2   Al Viro   [IPV6]: annotate ...
106
107
108
109
  	__u8	nexthdr;
  	__u8	reserved;
  	__be16	frag_off;
  	__be32	identification;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
  };
1431fb31e   Paul Durrant   xen-netback: fix ...
111
112
  #define	IP6_MF		0x0001
  #define	IP6_OFFSET	0xFFF8
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113

e110861f8   Lorenzo Colitti   net: add a sysctl...
114
115
  #define IP6_REPLY_MARK(net, mark) \
  	((net)->ipv6.sysctl.fwmark_reflect ? (mark) : 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
116
117
118
  #include <net/sock.h>
  
  /* sysctls */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
119
  extern int sysctl_mld_max_msf;
2f711939d   Hannes Frederic Sowa   ipv6: add sysctl_...
120
  extern int sysctl_mld_qrv;
3d7cc2ba6   Pavel Emelyanov   [NETFILTER]: Swit...
121

13415e46c   Eric Dumazet   net: snmp: kill S...
122
  #define _DEVINC(net, statname, mod, idev, field)			\
14878f75a   David L Stevens   [IPV6]: Add ICMPM...
123
  ({									\
a11d206d0   YOSHIFUJI Hideaki   [IPV6]: Per-inter...
124
125
  	struct inet6_dev *_idev = (idev);				\
  	if (likely(_idev != NULL))					\
13415e46c   Eric Dumazet   net: snmp: kill S...
126
127
  		mod##SNMP_INC_STATS64((_idev)->stats.statname, (field));\
  	mod##SNMP_INC_STATS64((net)->mib.statname##_statistics, (field));\
a11d206d0   YOSHIFUJI Hideaki   [IPV6]: Per-inter...
128
  })
14878f75a   David L Stevens   [IPV6]: Add ICMPM...
129

be281e554   Eric Dumazet   ipv6: reduce per ...
130
  /* per device counters are atomic_long_t */
13415e46c   Eric Dumazet   net: snmp: kill S...
131
  #define _DEVINCATOMIC(net, statname, mod, idev, field)			\
be281e554   Eric Dumazet   ipv6: reduce per ...
132
133
134
135
  ({									\
  	struct inet6_dev *_idev = (idev);				\
  	if (likely(_idev != NULL))					\
  		SNMP_INC_STATS_ATOMIC_LONG((_idev)->stats.statname##dev, (field)); \
13415e46c   Eric Dumazet   net: snmp: kill S...
136
  	mod##SNMP_INC_STATS((net)->mib.statname##_statistics, (field));\
be281e554   Eric Dumazet   ipv6: reduce per ...
137
  })
2a24444f8   Eric Dumazet   ipv6: reduce perc...
138
139
140
141
142
143
144
145
  /* per device and per net counters are atomic_long_t */
  #define _DEVINC_ATOMIC_ATOMIC(net, statname, idev, field)		\
  ({									\
  	struct inet6_dev *_idev = (idev);				\
  	if (likely(_idev != NULL))					\
  		SNMP_INC_STATS_ATOMIC_LONG((_idev)->stats.statname##dev, (field)); \
  	SNMP_INC_STATS_ATOMIC_LONG((net)->mib.statname##_statistics, (field));\
  })
13415e46c   Eric Dumazet   net: snmp: kill S...
146
  #define _DEVADD(net, statname, mod, idev, field, val)			\
8e7999c44   Pavel Emelyanov   [INET]: Consolida...
147
148
149
  ({									\
  	struct inet6_dev *_idev = (idev);				\
  	if (likely(_idev != NULL))					\
13415e46c   Eric Dumazet   net: snmp: kill S...
150
151
  		mod##SNMP_ADD_STATS((_idev)->stats.statname, (field), (val)); \
  	mod##SNMP_ADD_STATS((net)->mib.statname##_statistics, (field), (val));\
8e7999c44   Pavel Emelyanov   [INET]: Consolida...
152
  })
13415e46c   Eric Dumazet   net: snmp: kill S...
153
  #define _DEVUPD(net, statname, mod, idev, field, val)			\
edf391ff1   Neil Horman   snmp: add missing...
154
155
156
  ({									\
  	struct inet6_dev *_idev = (idev);				\
  	if (likely(_idev != NULL))					\
13415e46c   Eric Dumazet   net: snmp: kill S...
157
158
  		mod##SNMP_UPD_PO_STATS((_idev)->stats.statname, field, (val)); \
  	mod##SNMP_UPD_PO_STATS((net)->mib.statname##_statistics, field, (val));\
edf391ff1   Neil Horman   snmp: add missing...
159
  })
14878f75a   David L Stevens   [IPV6]: Add ICMPM...
160
  /* MIBs */
14878f75a   David L Stevens   [IPV6]: Add ICMPM...
161

087fe2403   Denis V. Lunev   ipv6: added net a...
162
  #define IP6_INC_STATS(net, idev,field)		\
13415e46c   Eric Dumazet   net: snmp: kill S...
163
  		_DEVINC(net, ipv6, , idev, field)
1d0155035   Eric Dumazet   ipv6: rename IP6_...
164
  #define __IP6_INC_STATS(net, idev,field)	\
13415e46c   Eric Dumazet   net: snmp: kill S...
165
  		_DEVINC(net, ipv6, __, idev, field)
edf391ff1   Neil Horman   snmp: add missing...
166
  #define IP6_ADD_STATS(net, idev,field,val)	\
13415e46c   Eric Dumazet   net: snmp: kill S...
167
  		_DEVADD(net, ipv6, , idev, field, val)
1d0155035   Eric Dumazet   ipv6: rename IP6_...
168
  #define __IP6_ADD_STATS(net, idev,field,val)	\
13415e46c   Eric Dumazet   net: snmp: kill S...
169
  		_DEVADD(net, ipv6, __, idev, field, val)
edf391ff1   Neil Horman   snmp: add missing...
170
  #define IP6_UPD_PO_STATS(net, idev,field,val)   \
13415e46c   Eric Dumazet   net: snmp: kill S...
171
  		_DEVUPD(net, ipv6, , idev, field, val)
c2005eb01   Eric Dumazet   ipv6: rename IP6_...
172
  #define __IP6_UPD_PO_STATS(net, idev,field,val)   \
13415e46c   Eric Dumazet   net: snmp: kill S...
173
  		_DEVUPD(net, ipv6, __, idev, field, val)
087fe2403   Denis V. Lunev   ipv6: added net a...
174
  #define ICMP6_INC_STATS(net, idev, field)	\
be281e554   Eric Dumazet   ipv6: reduce per ...
175
  		_DEVINCATOMIC(net, icmpv6, , idev, field)
a16292a0f   Eric Dumazet   net: rename ICMP6...
176
  #define __ICMP6_INC_STATS(net, idev, field)	\
13415e46c   Eric Dumazet   net: snmp: kill S...
177
  		_DEVINCATOMIC(net, icmpv6, __, idev, field)
087fe2403   Denis V. Lunev   ipv6: added net a...
178
179
  
  #define ICMP6MSGOUT_INC_STATS(net, idev, field)		\
2a24444f8   Eric Dumazet   ipv6: reduce perc...
180
  	_DEVINC_ATOMIC_ATOMIC(net, icmpv6msg, idev, field +256)
f3832ed2c   Eric Dumazet   ipv6: kill ICMP6M...
181
  #define ICMP6MSGIN_INC_STATS(net, idev, field)	\
2a24444f8   Eric Dumazet   ipv6: reduce perc...
182
  	_DEVINC_ATOMIC_ATOMIC(net, icmpv6msg, idev, field)
14878f75a   David L Stevens   [IPV6]: Add ICMPM...
183

fd2c3ef76   Eric Dumazet   net: cleanup incl...
184
  struct ip6_ra_chain {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
185
186
187
188
189
190
191
192
193
194
195
196
197
  	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...
198
  struct ipv6_txoptions {
0aeea21ad   Reshetova, Elena   net, ipv6: conver...
199
  	refcount_t		refcnt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
200
201
202
203
204
205
206
207
208
209
210
  	/* 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
211
  	struct ipv6_opt_hdr	*dst1opt;
45f6fad84   Eric Dumazet   ipv6: add complet...
212
  	struct rcu_head		rcu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
213
214
  	/* Option buffer, as read by IPV6_PKTOPTIONS, starts here. */
  };
fd2c3ef76   Eric Dumazet   net: cleanup incl...
215
  struct ip6_flowlabel {
7f0e44ac9   Eric Dumazet   ipv6 flowlabel: a...
216
  	struct ip6_flowlabel __rcu *next;
90bcaf7b4   Al Viro   [IPV6]: flowlabel...
217
  	__be32			label;
db3459d1a   Eric Dumazet   [IPV6]: Some clea...
218
  	atomic_t		users;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
219
220
  	struct in6_addr		dst;
  	struct ipv6_txoptions	*opt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
221
  	unsigned long		linger;
d3aedd5eb   YOSHIFUJI Hideaki / 吉藤英明   ipv6 flowlabel: C...
222
  	struct rcu_head		rcu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
223
  	u8			share;
4f82f4573   Eric W. Biederman   net ip6 flowlabel...
224
225
226
227
  	union {
  		struct pid *pid;
  		kuid_t uid;
  	} owner;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
228
229
  	unsigned long		lastuse;
  	unsigned long		expires;
60e8fbc4c   Benjamin Thery   [NETNS][IPV6] flo...
230
  	struct net		*fl_net;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
231
  };
82a584b7c   Tom Herbert   ipv6: Flow label ...
232
233
234
  #define IPV6_FLOWINFO_MASK		cpu_to_be32(0x0FFFFFFF)
  #define IPV6_FLOWLABEL_MASK		cpu_to_be32(0x000FFFFF)
  #define IPV6_FLOWLABEL_STATELESS_FLAG	cpu_to_be32(0x00080000)
37cfee909   Florent Fourcot   ipv6: move IPV6_T...
235
  #define IPV6_TCLASS_MASK (IPV6_FLOWINFO_MASK & ~IPV6_FLOWLABEL_MASK)
d76ed22b2   Li RongQing   ipv6: move IPV6_T...
236
  #define IPV6_TCLASS_SHIFT	20
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
237

fd2c3ef76   Eric Dumazet   net: cleanup incl...
238
  struct ipv6_fl_socklist {
7f0e44ac9   Eric Dumazet   ipv6 flowlabel: a...
239
240
241
  	struct ipv6_fl_socklist	__rcu	*next;
  	struct ip6_flowlabel		*fl;
  	struct rcu_head			rcu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
242
  };
26879da58   Wei Wang   ipv6: add new str...
243
244
245
246
247
248
  struct ipcm6_cookie {
  	__s16 hlimit;
  	__s16 tclass;
  	__s8  dontfrag;
  	struct ipv6_txoptions *opt;
  };
45f6fad84   Eric Dumazet   ipv6: add complet...
249
250
251
252
253
254
  static inline struct ipv6_txoptions *txopt_get(const struct ipv6_pinfo *np)
  {
  	struct ipv6_txoptions *opt;
  
  	rcu_read_lock();
  	opt = rcu_dereference(np->opt);
e550785c3   Benjamin Poirier   ipv6: Annotate ch...
255
  	if (opt) {
0aeea21ad   Reshetova, Elena   net, ipv6: conver...
256
  		if (!refcount_inc_not_zero(&opt->refcnt))
e550785c3   Benjamin Poirier   ipv6: Annotate ch...
257
258
259
260
  			opt = NULL;
  		else
  			opt = rcu_pointer_handoff(opt);
  	}
45f6fad84   Eric Dumazet   ipv6: add complet...
261
262
263
264
265
266
  	rcu_read_unlock();
  	return opt;
  }
  
  static inline void txopt_put(struct ipv6_txoptions *opt)
  {
0aeea21ad   Reshetova, Elena   net, ipv6: conver...
267
  	if (opt && refcount_dec_and_test(&opt->refcnt))
45f6fad84   Eric Dumazet   ipv6: add complet...
268
269
  		kfree_rcu(opt, rcu);
  }
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
270
271
272
273
274
275
  struct ip6_flowlabel *fl6_sock_lookup(struct sock *sk, __be32 label);
  struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions *opt_space,
  					 struct ip6_flowlabel *fl,
  					 struct ipv6_txoptions *fopt);
  void fl6_free_socklist(struct sock *sk);
  int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen);
46e5f4017   Florent Fourcot   ipv6: add a flag ...
276
277
  int ipv6_flowlabel_opt_get(struct sock *sk, struct in6_flowlabel_req *freq,
  			   int flags);
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
278
279
  int ip6_flowlabel_init(void);
  void ip6_flowlabel_cleanup(void);
2295b3dd5   Ben Hutchings   ipv6: Fix getsock...
280
  bool ip6_autoflowlabel(struct net *net, const struct ipv6_pinfo *np);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
281
282
283
284
285
286
  
  static inline void fl6_sock_release(struct ip6_flowlabel *fl)
  {
  	if (fl)
  		atomic_dec(&fl->users);
  }
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
287
  void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info);
b94f1c090   David S. Miller   ipv6: Use icmpv6_...
288

6d0bfe226   Lorenzo Colitti   net: ipv6: Add IP...
289
290
  int icmpv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6,
  			       struct icmp6hdr *thdr, int len);
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
291
  int ip6_ra_control(struct sock *sk, int sel);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
292

5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
293
  int ipv6_parse_hopopts(struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
294

5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
295
296
297
298
299
  struct ipv6_txoptions *ipv6_dup_options(struct sock *sk,
  					struct ipv6_txoptions *opt);
  struct ipv6_txoptions *ipv6_renew_options(struct sock *sk,
  					  struct ipv6_txoptions *opt,
  					  int newtype,
8e39e96f2   Paul Moore   ipv6: make ipv6_r...
300
  					  struct ipv6_opt_hdr *newopt);
df9890c31   YOSHIFUJI Hideaki   [IPV6]: Fix sendi...
301
302
  struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space,
  					  struct ipv6_txoptions *opt);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
303

a224772db   Eric Dumazet   ipv6: add a struc...
304
305
  bool ipv6_opt_accepted(const struct sock *sk, const struct sk_buff *skb,
  		       const struct inet6_skb_parm *opt);
ceba1832b   Huw Davies   calipso: Set the ...
306
307
  struct ipv6_txoptions *ipv6_update_options(struct sock *sk,
  					   struct ipv6_txoptions *opt);
399c07def   Arnaldo Carvalho de Melo   [IPV6]: Export ip...
308

aeaf6e9d2   Shmulik Ladkani   ipv6: unify logic...
309
310
311
312
313
314
315
316
  static inline bool ipv6_accept_ra(struct inet6_dev *idev)
  {
  	/* If forwarding is enabled, RA are not accepted unless the special
  	 * hybrid mode (accept_ra=2) is enabled.
  	 */
  	return idev->cnf.forwarding ? idev->cnf.accept_ra == 2 :
  	    idev->cnf.accept_ra;
  }
c2a936600   Jesper Dangaard Brouer   net: increase fra...
317
318
  #define IPV6_FRAG_HIGH_THRESH	(4 * 1024*1024)	/* 4194304 */
  #define IPV6_FRAG_LOW_THRESH	(3 * 1024*1024)	/* 3145728 */
9874c41cd   Joe Perches   ipv6.h: reassembl...
319
  #define IPV6_FRAG_TIMEOUT	(60 * HZ)	/* 60 seconds */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
320

5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
321
  int __ipv6_addr_type(const struct in6_addr *addr);
b1cacb682   YOSHIFUJI Hideaki   [IPV6]: Make ipv6...
322
323
324
325
  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
326
327
328
  
  static inline int ipv6_addr_scope(const struct in6_addr *addr)
  {
b1cacb682   YOSHIFUJI Hideaki   [IPV6]: Make ipv6...
329
330
331
332
333
  	return __ipv6_addr_type(addr) & IPV6_ADDR_SCOPE_MASK;
  }
  
  static inline int __ipv6_addr_src_scope(int type)
  {
a02cec215   Eric Dumazet   net: return opera...
334
  	return (type == IPV6_ADDR_ANY) ? __IPV6_ADDR_SCOPE_INVALID : (type >> 16);
b1cacb682   YOSHIFUJI Hideaki   [IPV6]: Make ipv6...
335
336
337
338
339
  }
  
  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
340
  }
b7ef213ef   Hannes Frederic Sowa   ipv6: introdcue _...
341
342
343
344
345
346
347
348
349
350
351
  static inline bool __ipv6_addr_needs_scope_id(int type)
  {
  	return type & IPV6_ADDR_LINKLOCAL ||
  	       (type & IPV6_ADDR_MULTICAST &&
  		(type & (IPV6_ADDR_LOOPBACK|IPV6_ADDR_LINKLOCAL)));
  }
  
  static inline __u32 ipv6_iface_scope_id(const struct in6_addr *addr, int iface)
  {
  	return __ipv6_addr_needs_scope_id(__ipv6_addr_type(addr)) ? iface : 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
352
353
  static inline int ipv6_addr_cmp(const struct in6_addr *a1, const struct in6_addr *a2)
  {
db3459d1a   Eric Dumazet   [IPV6]: Some clea...
354
  	return memcmp(a1, a2, sizeof(struct in6_addr));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
355
  }
1a203cb33   Eric Dumazet   ipv6: optimize ip...
356
  static inline bool
f2ffd9eed   Patrick McHardy   [NETFILTER]: Move...
357
358
359
  ipv6_masked_addr_cmp(const struct in6_addr *a1, const struct in6_addr *m,
  		     const struct in6_addr *a2)
  {
1a203cb33   Eric Dumazet   ipv6: optimize ip...
360
361
362
363
364
365
366
367
  #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
  	const unsigned long *ul1 = (const unsigned long *)a1;
  	const unsigned long *ulm = (const unsigned long *)m;
  	const unsigned long *ul2 = (const unsigned long *)a2;
  
  	return !!(((ul1[0] ^ ul2[0]) & ulm[0]) |
  		  ((ul1[1] ^ ul2[1]) & ulm[1]));
  #else
a02cec215   Eric Dumazet   net: return opera...
368
369
370
371
  	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]));
1a203cb33   Eric Dumazet   ipv6: optimize ip...
372
  #endif
f2ffd9eed   Patrick McHardy   [NETFILTER]: Move...
373
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
374
375
376
377
378
379
380
  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...
381
  	memset(pfx->s6_addr, 0, sizeof(pfx->s6_addr));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
382
  	memcpy(pfx->s6_addr, addr, o);
db3459d1a   Eric Dumazet   [IPV6]: Some clea...
383
  	if (b != 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
384
  		pfx->s6_addr[o] = addr->s6_addr[o] & (0xff00 >> b);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
385
  }
818f1f3e7   Alexander Aring   ipv6: add ipv6_ad...
386
387
388
389
390
391
392
393
394
395
396
397
398
399
  static inline void ipv6_addr_prefix_copy(struct in6_addr *addr,
  					 const struct in6_addr *pfx,
  					 int plen)
  {
  	/* caller must guarantee 0 <= plen <= 128 */
  	int o = plen >> 3,
  	    b = plen & 0x7;
  
  	memcpy(addr->s6_addr, pfx, o);
  	if (b != 0) {
  		addr->s6_addr[o] &= ~(0xff00 >> b);
  		addr->s6_addr[o] |= (pfx->s6_addr[o] & (0xff00 >> b));
  	}
  }
5206c579d   YOSHIFUJI Hideaki / 吉藤英明   ipv6: 64bit versi...
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
  static inline void __ipv6_addr_set_half(__be32 *addr,
  					__be32 wh, __be32 wl)
  {
  #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
  #if defined(__BIG_ENDIAN)
  	if (__builtin_constant_p(wh) && __builtin_constant_p(wl)) {
  		*(__force u64 *)addr = ((__force u64)(wh) << 32 | (__force u64)(wl));
  		return;
  	}
  #elif defined(__LITTLE_ENDIAN)
  	if (__builtin_constant_p(wl) && __builtin_constant_p(wh)) {
  		*(__force u64 *)addr = ((__force u64)(wl) << 32 | (__force u64)(wh));
  		return;
  	}
  #endif
  #endif
  	addr[0] = wh;
  	addr[1] = wl;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
419
  static inline void ipv6_addr_set(struct in6_addr *addr, 
48818f822   Al Viro   [IPV6]: struct in...
420
421
  				     __be32 w1, __be32 w2,
  				     __be32 w3, __be32 w4)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
422
  {
5206c579d   YOSHIFUJI Hideaki / 吉藤英明   ipv6: 64bit versi...
423
424
  	__ipv6_addr_set_half(&addr->s6_addr32[0], w1, w2);
  	__ipv6_addr_set_half(&addr->s6_addr32[2], w3, w4);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
425
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
426

92113bfde   Eric Dumazet   ipv6: bool conver...
427
428
  static inline bool ipv6_addr_equal(const struct in6_addr *a1,
  				   const struct in6_addr *a2)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
429
  {
1a203cb33   Eric Dumazet   ipv6: optimize ip...
430
431
432
433
434
435
  #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
  	const unsigned long *ul1 = (const unsigned long *)a1;
  	const unsigned long *ul2 = (const unsigned long *)a2;
  
  	return ((ul1[0] ^ ul2[0]) | (ul1[1] ^ ul2[1])) == 0UL;
  #else
a02cec215   Eric Dumazet   net: return opera...
436
437
438
439
  	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;
1a203cb33   Eric Dumazet   ipv6: optimize ip...
440
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
441
  }
38675170e   YOSHIFUJI Hideaki / 吉藤英明   ipv6: 64bit versi...
442
443
444
445
446
  #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
  static inline bool __ipv6_prefix_equal64_half(const __be64 *a1,
  					      const __be64 *a2,
  					      unsigned int len)
  {
512613d7d   Fabio Baltieri   ipv6: fix ipv6_pr...
447
  	if (len && ((*a1 ^ *a2) & cpu_to_be64((~0UL) << (64 - len))))
38675170e   YOSHIFUJI Hideaki / 吉藤英明   ipv6: 64bit versi...
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
  		return false;
  	return true;
  }
  
  static inline bool ipv6_prefix_equal(const struct in6_addr *addr1,
  				     const struct in6_addr *addr2,
  				     unsigned int prefixlen)
  {
  	const __be64 *a1 = (const __be64 *)addr1;
  	const __be64 *a2 = (const __be64 *)addr2;
  
  	if (prefixlen >= 64) {
  		if (a1[0] ^ a2[0])
  			return false;
  		return __ipv6_prefix_equal64_half(a1 + 1, a2 + 1, prefixlen - 64);
  	}
  	return __ipv6_prefix_equal64_half(a1, a2, prefixlen);
  }
  #else
2ef973320   YOSHIFUJI Hideaki / 吉藤英明   ipv6: Remove __ip...
467
468
469
  static inline bool ipv6_prefix_equal(const struct in6_addr *addr1,
  				     const struct in6_addr *addr2,
  				     unsigned int prefixlen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
470
  {
2ef973320   YOSHIFUJI Hideaki / 吉藤英明   ipv6: Remove __ip...
471
472
  	const __be32 *a1 = addr1->s6_addr32;
  	const __be32 *a2 = addr2->s6_addr32;
95c961747   Eric Dumazet   net: cleanup unsi...
473
  	unsigned int pdw, pbi;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
474
475
476
477
  
  	/* check complete u32 in prefix */
  	pdw = prefixlen >> 5;
  	if (pdw && memcmp(a1, a2, pdw << 2))
92113bfde   Eric Dumazet   ipv6: bool conver...
478
  		return false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
479
480
481
482
  
  	/* check incomplete u32 in prefix */
  	pbi = prefixlen & 0x1f;
  	if (pbi && ((a1[pdw] ^ a2[pdw]) & htonl((0xffffffff) << (32 - pbi))))
92113bfde   Eric Dumazet   ipv6: bool conver...
483
  		return false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
484

92113bfde   Eric Dumazet   ipv6: bool conver...
485
  	return true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
486
  }
38675170e   YOSHIFUJI Hideaki / 吉藤英明   ipv6: 64bit versi...
487
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
488

2588fe1d7   Pavel Emelyanov   [INET]: Consolida...
489
  struct inet_frag_queue;
2588fe1d7   Pavel Emelyanov   [INET]: Consolida...
490

0b5ccb2ee   Patrick McHardy   ipv6: reassembly:...
491
492
493
  enum ip6_defrag_users {
  	IP6_DEFRAG_LOCAL_DELIVER,
  	IP6_DEFRAG_CONNTRACK_IN,
4be929be3   Alexey Dobriyan   kernel-wide: repl...
494
  	__IP6_DEFRAG_CONNTRACK_IN	= IP6_DEFRAG_CONNTRACK_IN + USHRT_MAX,
0b5ccb2ee   Patrick McHardy   ipv6: reassembly:...
495
  	IP6_DEFRAG_CONNTRACK_OUT,
4be929be3   Alexey Dobriyan   kernel-wide: repl...
496
  	__IP6_DEFRAG_CONNTRACK_OUT	= IP6_DEFRAG_CONNTRACK_OUT + USHRT_MAX,
8fa9ff684   Patrick McHardy   netfilter: fix cr...
497
  	IP6_DEFRAG_CONNTRACK_BRIDGE_IN,
4be929be3   Alexey Dobriyan   kernel-wide: repl...
498
  	__IP6_DEFRAG_CONNTRACK_BRIDGE_IN = IP6_DEFRAG_CONNTRACK_BRIDGE_IN + USHRT_MAX,
0b5ccb2ee   Patrick McHardy   ipv6: reassembly:...
499
  };
36c777821   Florian Westphal   inet: frag: const...
500
  void ip6_frag_init(struct inet_frag_queue *q, const void *a);
9aee41eff   Eric Dumazet   inet: frags: use ...
501
  extern const struct rhashtable_params ip6_rhash_params;
c6fda2822   Pavel Emelyanov   [INET]: Consolida...
502

b836c99fd   Amerigo Wang   ipv6: unify connt...
503
504
505
506
507
  /*
   *	Equivalent of ipv4 struct ip
   */
  struct frag_queue {
  	struct inet_frag_queue	q;
b836c99fd   Amerigo Wang   ipv6: unify connt...
508
509
510
  	int			iif;
  	unsigned int		csum;
  	__u16			nhoffset;
eec2e6185   Hannes Frederic Sowa   ipv6: implement R...
511
  	u8			ecn;
b836c99fd   Amerigo Wang   ipv6: unify connt...
512
  };
673220d64   Eric Dumazet   inet: frags: add ...
513
  void ip6_expire_frag_queue(struct net *net, struct frag_queue *fq);
b836c99fd   Amerigo Wang   ipv6: unify connt...
514

92113bfde   Eric Dumazet   ipv6: bool conver...
515
  static inline bool ipv6_addr_any(const struct in6_addr *a)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
516
  {
1a203cb33   Eric Dumazet   ipv6: optimize ip...
517
518
519
520
521
  #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
  	const unsigned long *ul = (const unsigned long *)a;
  
  	return (ul[0] | ul[1]) == 0UL;
  #else
a02cec215   Eric Dumazet   net: return opera...
522
523
  	return (a->s6_addr32[0] | a->s6_addr32[1] |
  		a->s6_addr32[2] | a->s6_addr32[3]) == 0;
1a203cb33   Eric Dumazet   ipv6: optimize ip...
524
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
525
  }
ddbe50320   Eric Dumazet   ipv6: add ipv6_ad...
526
527
528
529
530
531
532
533
534
535
536
537
  static inline u32 ipv6_addr_hash(const struct in6_addr *a)
  {
  #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
  	const unsigned long *ul = (const unsigned long *)a;
  	unsigned long x = ul[0] ^ ul[1];
  
  	return (u32)(x ^ (x >> 32));
  #else
  	return (__force u32)(a->s6_addr32[0] ^ a->s6_addr32[1] ^
  			     a->s6_addr32[2] ^ a->s6_addr32[3]);
  #endif
  }
08dcdbf6a   Eric Dumazet   ipv6: use a stron...
538
  /* more secured version of ipv6_addr_hash() */
b50026b5a   Hannes Frederic Sowa   ipv6: split inet6...
539
  static inline u32 __ipv6_addr_jhash(const struct in6_addr *a, const u32 initval)
08dcdbf6a   Eric Dumazet   ipv6: use a stron...
540
541
542
543
544
545
  {
  	u32 v = (__force u32)a->s6_addr32[0] ^ (__force u32)a->s6_addr32[1];
  
  	return jhash_3words(v,
  			    (__force u32)a->s6_addr32[2],
  			    (__force u32)a->s6_addr32[3],
b50026b5a   Hannes Frederic Sowa   ipv6: split inet6...
546
  			    initval);
08dcdbf6a   Eric Dumazet   ipv6: use a stron...
547
  }
92113bfde   Eric Dumazet   ipv6: bool conver...
548
  static inline bool ipv6_addr_loopback(const struct in6_addr *a)
f630e43a2   YOSHIFUJI Hideaki   ipv6: Drop packet...
549
  {
e287656b3   YOSHIFUJI Hideaki / 吉藤英明   ipv6: 64bit versi...
550
  #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
1373a7739   Jeff Layton   net: clean up som...
551
  	const __be64 *be = (const __be64 *)a;
e287656b3   YOSHIFUJI Hideaki / 吉藤英明   ipv6: 64bit versi...
552

1373a7739   Jeff Layton   net: clean up som...
553
  	return (be[0] | (be[1] ^ cpu_to_be64(1))) == 0UL;
e287656b3   YOSHIFUJI Hideaki / 吉藤英明   ipv6: 64bit versi...
554
  #else
a02cec215   Eric Dumazet   net: return opera...
555
  	return (a->s6_addr32[0] | a->s6_addr32[1] |
1373a7739   Jeff Layton   net: clean up som...
556
  		a->s6_addr32[2] | (a->s6_addr32[3] ^ cpu_to_be32(1))) == 0;
e287656b3   YOSHIFUJI Hideaki / 吉藤英明   ipv6: 64bit versi...
557
  #endif
f630e43a2   YOSHIFUJI Hideaki   ipv6: Drop packet...
558
  }
1373a7739   Jeff Layton   net: clean up som...
559
560
561
562
  /*
   * Note that we must __force cast these to unsigned long to make sparse happy,
   * since all of the endian-annotated types are fixed size regardless of arch.
   */
92113bfde   Eric Dumazet   ipv6: bool conver...
563
  static inline bool ipv6_addr_v4mapped(const struct in6_addr *a)
e773e4faa   Brian Haley   [IPV6]: Add v4map...
564
  {
a04d40b89   YOSHIFUJI Hideaki / 吉藤英明   ipv6: 64bit versi...
565
566
  	return (
  #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
1373a7739   Jeff Layton   net: clean up som...
567
  		*(unsigned long *)a |
a04d40b89   YOSHIFUJI Hideaki / 吉藤英明   ipv6: 64bit versi...
568
  #else
1373a7739   Jeff Layton   net: clean up som...
569
  		(__force unsigned long)(a->s6_addr32[0] | a->s6_addr32[1]) |
a04d40b89   YOSHIFUJI Hideaki / 吉藤英明   ipv6: 64bit versi...
570
  #endif
1373a7739   Jeff Layton   net: clean up som...
571
572
  		(__force unsigned long)(a->s6_addr32[2] ^
  					cpu_to_be32(0x0000ffff))) == 0UL;
e773e4faa   Brian Haley   [IPV6]: Add v4map...
573
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
574
  /*
99cd07a53   Juha-Matti Tapio   [IPV6]: Fix sourc...
575
576
577
   * Check for a RFC 4843 ORCHID address
   * (Overlay Routable Cryptographic Hash Identifiers)
   */
92113bfde   Eric Dumazet   ipv6: bool conver...
578
  static inline bool ipv6_addr_orchid(const struct in6_addr *a)
99cd07a53   Juha-Matti Tapio   [IPV6]: Fix sourc...
579
  {
a02cec215   Eric Dumazet   net: return opera...
580
  	return (a->s6_addr32[0] & htonl(0xfffffff0)) == htonl(0x20010010);
99cd07a53   Juha-Matti Tapio   [IPV6]: Fix sourc...
581
  }
5c98631cc   Lorenzo Colitti   net: ipv6: Introd...
582
583
584
585
  static inline bool ipv6_addr_is_multicast(const struct in6_addr *addr)
  {
  	return (addr->s6_addr32[0] & htonl(0xFF000000)) == htonl(0xFF000000);
  }
f15364bd4   Aurélien Charbon   IPv6 support for ...
586
587
588
589
590
591
592
593
  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...
594
  /*
971f359dd   YOSHIFUJI Hideaki   [IPV6]: Put addr_...
595
596
597
   * find the first different bit between two addresses
   * length of address must be a multiple of 32bits
   */
9f2e73345   YOSHIFUJI Hideaki / 吉藤英明   ipv6: 64bit versi...
598
  static inline int __ipv6_addr_diff32(const void *token1, const void *token2, int addrlen)
971f359dd   YOSHIFUJI Hideaki   [IPV6]: Put addr_...
599
  {
ef296f56f   Al Viro   [IPV6]: __ipv6_ad...
600
  	const __be32 *a1 = token1, *a2 = token2;
971f359dd   YOSHIFUJI Hideaki   [IPV6]: Put addr_...
601
602
603
604
605
  	int i;
  
  	addrlen >>= 2;
  
  	for (i = 0; i < addrlen; i++) {
ef296f56f   Al Viro   [IPV6]: __ipv6_ad...
606
607
  		__be32 xb = a1[i] ^ a2[i];
  		if (xb)
d57b8fb8a   YOSHIFUJI Hideaki / 吉藤英明   ipv6: Use __fls()...
608
  			return i * 32 + 31 - __fls(ntohl(xb));
971f359dd   YOSHIFUJI Hideaki   [IPV6]: Put addr_...
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
  	}
  
  	/*
  	 *	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...
627
  	return addrlen << 5;
971f359dd   YOSHIFUJI Hideaki   [IPV6]: Put addr_...
628
  }
9f2e73345   YOSHIFUJI Hideaki / 吉藤英明   ipv6: 64bit versi...
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
  #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
  static inline int __ipv6_addr_diff64(const void *token1, const void *token2, int addrlen)
  {
  	const __be64 *a1 = token1, *a2 = token2;
  	int i;
  
  	addrlen >>= 3;
  
  	for (i = 0; i < addrlen; i++) {
  		__be64 xb = a1[i] ^ a2[i];
  		if (xb)
  			return i * 64 + 63 - __fls(be64_to_cpu(xb));
  	}
  
  	return addrlen << 6;
  }
  #endif
  
  static inline int __ipv6_addr_diff(const void *token1, const void *token2, int addrlen)
  {
  #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
  	if (__builtin_constant_p(addrlen) && !(addrlen & 7))
  		return __ipv6_addr_diff64(token1, token2, addrlen);
  #endif
  	return __ipv6_addr_diff32(token1, token2, addrlen);
  }
971f359dd   YOSHIFUJI Hideaki   [IPV6]: Put addr_...
655
656
657
658
  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));
  }
7f1598678   Eric Dumazet   ipv6: ipv6_select...
659
660
661
  __be32 ipv6_select_ident(struct net *net,
  			 const struct in6_addr *daddr,
  			 const struct in6_addr *saddr);
60335608e   Willem de Bruijn   net: accept UFO d...
662
  __be32 ipv6_proxy_select_ident(struct net *net, struct sk_buff *skb);
5188cd44c   Ben Hutchings   drivers/net, ipv6...
663

5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
664
  int ip6_dst_hoplimit(struct dst_entry *dst);
3ce9b35ff   Cong Wang   ipv6: move ip6_ds...
665

5c98631cc   Lorenzo Colitti   net: ipv6: Introd...
666
667
668
669
670
671
672
673
674
675
676
677
678
  static inline int ip6_sk_dst_hoplimit(struct ipv6_pinfo *np, struct flowi6 *fl6,
  				      struct dst_entry *dst)
  {
  	int hlimit;
  
  	if (ipv6_addr_is_multicast(&fl6->daddr))
  		hlimit = np->mcast_hops;
  	else
  		hlimit = np->hop_limit;
  	if (hlimit < 0)
  		hlimit = ip6_dst_hoplimit(dst);
  	return hlimit;
  }
c3f832418   Tom Herbert   net: Add full IPv...
679
680
681
682
683
684
685
686
687
688
689
690
691
  /* copy IPv6 saddr & daddr to flow_keys, possibly using 64bit load/store
   * Equivalent to :	flow->v6addrs.src = iph->saddr;
   *			flow->v6addrs.dst = iph->daddr;
   */
  static inline void iph_to_flow_copy_v6addrs(struct flow_keys *flow,
  					    const struct ipv6hdr *iph)
  {
  	BUILD_BUG_ON(offsetof(typeof(flow->addrs), v6addrs.dst) !=
  		     offsetof(typeof(flow->addrs), v6addrs.src) +
  		     sizeof(flow->addrs.v6addrs.src));
  	memcpy(&flow->addrs.v6addrs, &iph->saddr, sizeof(flow->addrs.v6addrs));
  	flow->control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
  }
a37934fc0   Florian Fainelli   net: provide stub...
692
  #if IS_ENABLED(CONFIG_IPV6)
42240901f   Tom Herbert   ipv6: Implement d...
693
694
695
696
697
698
699
700
  
  /* Sysctl settings for net ipv6.auto_flowlabels */
  #define IP6_AUTO_FLOW_LABEL_OFF		0
  #define IP6_AUTO_FLOW_LABEL_OPTOUT	1
  #define IP6_AUTO_FLOW_LABEL_OPTIN	2
  #define IP6_AUTO_FLOW_LABEL_FORCED	3
  
  #define IP6_AUTO_FLOW_LABEL_MAX		IP6_AUTO_FLOW_LABEL_FORCED
b56774163   Tom Herbert   ipv6: Enable auto...
701
  #define IP6_DEFAULT_AUTO_FLOW_LABELS	IP6_AUTO_FLOW_LABEL_OPTOUT
42240901f   Tom Herbert   ipv6: Implement d...
702

cb1ce2ef3   Tom Herbert   ipv6: Implement a...
703
  static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb,
67800f9b1   Tom Herbert   ipv6: Call skb_ge...
704
705
  					__be32 flowlabel, bool autolabel,
  					struct flowi6 *fl6)
cb1ce2ef3   Tom Herbert   ipv6: Implement a...
706
  {
42240901f   Tom Herbert   ipv6: Implement d...
707
  	u32 hash;
cb1ce2ef3   Tom Herbert   ipv6: Implement a...
708

90427ef5d   Dimitris Michailidis   ipv6: fix flow la...
709
710
711
712
  	/* @flowlabel may include more than a flow label, eg, the traffic class.
  	 * Here we want only the flow label value.
  	 */
  	flowlabel &= IPV6_FLOWLABEL_MASK;
42240901f   Tom Herbert   ipv6: Implement d...
713
714
715
716
717
  	if (flowlabel ||
  	    net->ipv6.sysctl.auto_flowlabels == IP6_AUTO_FLOW_LABEL_OFF ||
  	    (!autolabel &&
  	     net->ipv6.sysctl.auto_flowlabels != IP6_AUTO_FLOW_LABEL_FORCED))
  		return flowlabel;
cb1ce2ef3   Tom Herbert   ipv6: Implement a...
718

42240901f   Tom Herbert   ipv6: Implement d...
719
  	hash = skb_get_hash_flowi6(skb, fl6);
cb1ce2ef3   Tom Herbert   ipv6: Implement a...
720

42240901f   Tom Herbert   ipv6: Implement d...
721
722
723
724
  	/* Since this is being sent on the wire obfuscate hash a bit
  	 * to minimize possbility that any useful information to an
  	 * attacker is leaked. Only lower 20 bits are relevant.
  	 */
a5d33d38b   Colin Ian King   ipv6: fix useless...
725
  	hash = rol32(hash, 16);
82a584b7c   Tom Herbert   ipv6: Flow label ...
726

42240901f   Tom Herbert   ipv6: Implement d...
727
728
729
730
  	flowlabel = (__force __be32)hash & IPV6_FLOWLABEL_MASK;
  
  	if (net->ipv6.sysctl.flowlabel_state_ranges)
  		flowlabel |= IPV6_FLOWLABEL_STATELESS_FLAG;
cb1ce2ef3   Tom Herbert   ipv6: Implement a...
731
732
733
  
  	return flowlabel;
  }
42240901f   Tom Herbert   ipv6: Implement d...
734
735
736
737
738
739
740
741
742
743
744
745
746
  
  static inline int ip6_default_np_autolabel(struct net *net)
  {
  	switch (net->ipv6.sysctl.auto_flowlabels) {
  	case IP6_AUTO_FLOW_LABEL_OFF:
  	case IP6_AUTO_FLOW_LABEL_OPTIN:
  	default:
  		return 0;
  	case IP6_AUTO_FLOW_LABEL_OPTOUT:
  	case IP6_AUTO_FLOW_LABEL_FORCED:
  		return 1;
  	}
  }
a37934fc0   Florian Fainelli   net: provide stub...
747
748
749
  #else
  static inline void ip6_set_txhash(struct sock *sk) { }
  static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb,
42240901f   Tom Herbert   ipv6: Implement d...
750
751
  					__be32 flowlabel, bool autolabel,
  					struct flowi6 *fl6)
a37934fc0   Florian Fainelli   net: provide stub...
752
753
754
  {
  	return flowlabel;
  }
42240901f   Tom Herbert   ipv6: Implement d...
755
756
757
758
  static inline int ip6_default_np_autolabel(struct net *net)
  {
  	return 0;
  }
a37934fc0   Florian Fainelli   net: provide stub...
759
  #endif
cb1ce2ef3   Tom Herbert   ipv6: Implement a...
760

971f359dd   YOSHIFUJI Hideaki   [IPV6]: Put addr_...
761
  /*
3e4e4c1f2   YOSHIFUJI Hideaki / 吉藤英明   ipv6: Introduce i...
762
763
764
765
766
   *	Header manipulation
   */
  static inline void ip6_flow_hdr(struct ipv6hdr *hdr, unsigned int tclass,
  				__be32 flowlabel)
  {
07f623d3b   YOSHIFUJI Hideaki   ipv6: Fix endiane...
767
  	*(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | flowlabel;
3e4e4c1f2   YOSHIFUJI Hideaki / 吉藤英明   ipv6: Introduce i...
768
  }
6502ca527   YOSHIFUJI Hideaki / 吉藤英明   ipv6: Introduce i...
769
770
771
772
  static inline __be32 ip6_flowinfo(const struct ipv6hdr *hdr)
  {
  	return *(__be32 *)hdr & IPV6_FLOWINFO_MASK;
  }
3308de2b8   Florent Fourcot   ipv6: add ip6_flo...
773
774
775
776
  static inline __be32 ip6_flowlabel(const struct ipv6hdr *hdr)
  {
  	return *(__be32 *)hdr & IPV6_FLOWLABEL_MASK;
  }
d76ed22b2   Li RongQing   ipv6: move IPV6_T...
777
778
779
780
  static inline u8 ip6_tclass(__be32 flowinfo)
  {
  	return ntohl(flowinfo & IPV6_TCLASS_MASK) >> IPV6_TCLASS_SHIFT;
  }
eaa93bf4c   Daniel Borkmann   vxlan: fix popula...
781
782
783
784
785
  
  static inline __be32 ip6_make_flowinfo(unsigned int tclass, __be32 flowlabel)
  {
  	return htonl(tclass << IPV6_TCLASS_SHIFT) | flowlabel;
  }
3f8f52c5f   Michal Kubecek   ipv6: omit traffi...
786
787
788
789
  static inline __be32 flowi6_get_flowlabel(const struct flowi6 *fl6)
  {
  	return fl6->flowlabel & IPV6_FLOWLABEL_MASK;
  }
3e4e4c1f2   YOSHIFUJI Hideaki / 吉藤英明   ipv6: Introduce i...
790
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
791
792
793
794
795
796
   *	Prototypes exported by ipv6
   */
  
  /*
   *	rcv function (called from netdevice level)
   */
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
797
798
  int ipv6_rcv(struct sk_buff *skb, struct net_device *dev,
  	     struct packet_type *pt, struct net_device *orig_dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
799

0c4b51f00   Eric W. Biederman   netfilter: Pass n...
800
  int ip6_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb);
b05e10669   Patrick McHardy   [IPV4/6]: Netfilt...
801

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
802
803
804
  /*
   *	upper-layer output functions
   */
1c1e9d2b6   Eric Dumazet   ipv6: constify ip...
805
  int ip6_xmit(const struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
92e55f412   Pablo Neira   tcp: don't annota...
806
  	     __u32 mark, struct ipv6_txoptions *opt, int tclass);
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
807
808
809
810
811
812
  
  int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr);
  
  int ip6_append_data(struct sock *sk,
  		    int getfrag(void *from, char *to, int offset, int len,
  				int odd, struct sk_buff *skb),
26879da58   Wei Wang   ipv6: add new str...
813
814
815
  		    void *from, int length, int transhdrlen,
  		    struct ipcm6_cookie *ipc6, struct flowi6 *fl6,
  		    struct rt6_info *rt, unsigned int flags,
c14ac9451   Soheil Hassas Yeganeh   sock: enable time...
816
  		    const struct sockcm_cookie *sockc);
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
817
818
819
820
  
  int ip6_push_pending_frames(struct sock *sk);
  
  void ip6_flush_pending_frames(struct sock *sk);
6422398c2   Vlad Yasevich   ipv6: introduce i...
821
822
823
824
825
826
827
828
829
  int ip6_send_skb(struct sk_buff *skb);
  
  struct sk_buff *__ip6_make_skb(struct sock *sk, struct sk_buff_head *queue,
  			       struct inet_cork_full *cork,
  			       struct inet6_cork *v6_cork);
  struct sk_buff *ip6_make_skb(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,
26879da58   Wei Wang   ipv6: add new str...
830
831
  			     struct ipcm6_cookie *ipc6, struct flowi6 *fl6,
  			     struct rt6_info *rt, unsigned int flags,
c14ac9451   Soheil Hassas Yeganeh   sock: enable time...
832
  			     const struct sockcm_cookie *sockc);
6422398c2   Vlad Yasevich   ipv6: introduce i...
833
834
835
836
837
838
  
  static inline struct sk_buff *ip6_finish_skb(struct sock *sk)
  {
  	return __ip6_make_skb(sk, &sk->sk_write_queue, &inet_sk(sk)->cork,
  			      &inet6_sk(sk)->cork);
  }
343d60aad   Roopa Prabhu   ipv6: change ipv6...
839
840
  int ip6_dst_lookup(struct net *net, struct sock *sk, struct dst_entry **dst,
  		   struct flowi6 *fl6);
3aef934f4   Eric Dumazet   ipv6: constify ip...
841
  struct dst_entry *ip6_dst_lookup_flow(const struct sock *sk, struct flowi6 *fl6,
0e0d44ab4   Steffen Klassert   net: Remove FLOWI...
842
  				      const struct in6_addr *final_dst);
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
843
  struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
0e0d44ab4   Steffen Klassert   net: Remove FLOWI...
844
  					 const struct in6_addr *final_dst);
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
845
846
  struct dst_entry *ip6_blackhole_route(struct net *net,
  				      struct dst_entry *orig_dst);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
847
848
849
850
  
  /*
   *	skb processing functions
   */
ede2059db   Eric W. Biederman   dst: Pass net int...
851
  int ip6_output(struct net *net, struct sock *sk, struct sk_buff *skb);
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
852
853
854
  int ip6_forward(struct sk_buff *skb);
  int ip6_input(struct sk_buff *skb);
  int ip6_mc_input(struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
855

cf91a99da   Eric W. Biederman   ipv4, ipv6: Pass ...
856
  int __ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
33224b16f   Eric W. Biederman   ipv4, ipv6: Pass ...
857
  int ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
ef76bc23e   Herbert Xu   [IPV6]: Add ip6_l...
858

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
859
860
861
  /*
   *	Extension header (options) processing
   */
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
862
  void ipv6_push_nfrag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt,
613fa3ca9   David Lebrun   ipv6: add source ...
863
864
  			  u8 *proto, struct in6_addr **daddr_p,
  			  struct in6_addr *saddr);
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
865
866
  void ipv6_push_frag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt,
  			 u8 *proto);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
867

5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
868
869
  int ipv6_skip_exthdr(const struct sk_buff *, int start, u8 *nexthdrp,
  		     __be16 *frag_offp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
870

5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
871
  bool ipv6_ext_hdr(u8 nexthdr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
872

f8f626754   Jesse Gross   ipv6: Move ipv6_f...
873
  enum {
9195bb8e3   Ansis Atteka   ipv6: improve ipv...
874
875
876
  	IP6_FH_F_FRAG		= (1 << 0),
  	IP6_FH_F_AUTH		= (1 << 1),
  	IP6_FH_F_SKIP_RH	= (1 << 2),
f8f626754   Jesse Gross   ipv6: Move ipv6_f...
877
878
879
  };
  
  /* find specified header and get offset to it */
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
880
881
  int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, int target,
  		  unsigned short *fragoff, int *fragflg);
f8f626754   Jesse Gross   ipv6: Move ipv6_f...
882

0868383b8   Huw Davies   ipv6: constify th...
883
  int ipv6_find_tlv(const struct sk_buff *skb, int offset, int type);
c61a40432   Masahide NAKAMURA   [IPV6]: Find opti...
884

5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
885
886
887
  struct in6_addr *fl6_update_dst(struct flowi6 *fl6,
  				const struct ipv6_txoptions *opt,
  				struct in6_addr *orig);
20c59de2e   Arnaud Ebalard   ipv6: Refactor up...
888

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
889
890
891
  /*
   *	socket options (ipv6_sockglue.c)
   */
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
892
893
894
895
896
897
898
899
  int ipv6_setsockopt(struct sock *sk, int level, int optname,
  		    char __user *optval, unsigned int optlen);
  int ipv6_getsockopt(struct sock *sk, int level, int optname,
  		    char __user *optval, int __user *optlen);
  int compat_ipv6_setsockopt(struct sock *sk, int level, int optname,
  			   char __user *optval, unsigned int optlen);
  int compat_ipv6_getsockopt(struct sock *sk, int level, int optname,
  			   char __user *optval, int __user *optlen);
0382a25af   Guillaume Nault   l2tp: lock socket...
900
901
  int __ip6_datagram_connect(struct sock *sk, struct sockaddr *addr,
  			   int addr_len);
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
902
  int ip6_datagram_connect(struct sock *sk, struct sockaddr *addr, int addr_len);
82b276cd2   Hannes Frederic Sowa   ipv6: protect pro...
903
904
  int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *addr,
  				 int addr_len);
33c162a98   Martin KaFai Lau   ipv6: datagram: U...
905
  int ip6_datagram_dst_update(struct sock *sk, bool fix_sk_saddr);
e646b657f   Martin KaFai Lau   ipv6: udp: Do a r...
906
  void ip6_datagram_release_cb(struct sock *sk);
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
907

85fbaa750   Hannes Frederic Sowa   inet: fix addr_le...
908
909
910
911
  int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len,
  		    int *addr_len);
  int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len,
  		     int *addr_len);
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
912
913
914
915
916
917
918
919
920
921
922
923
  void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port,
  		     u32 info, u8 *payload);
  void ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info);
  void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu);
  
  int inet6_release(struct socket *sock);
  int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len);
  int inet6_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_len,
  		  int peer);
  int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
  
  int inet6_hash_connect(struct inet_timewait_death_row *death_row,
d8313f5ca   Arnaldo Carvalho de Melo   [INET6]: Generali...
924
  			      struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
925
926
927
  /*
   * reassembly.c
   */
90ddc4f04   Eric Dumazet   [NET]: move struc...
928
929
  extern const struct proto_ops inet6_stream_ops;
  extern const struct proto_ops inet6_dgram_ops;
77d4b1d36   Eric Dumazet   net: ping: do not...
930
  extern const struct proto_ops inet6_sockraw_ops;
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
931

14c850212   Arnaldo Carvalho de Melo   [INET_SOCK]: Move...
932
933
  struct group_source_req;
  struct group_filter;
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
934
935
936
937
938
  int ip6_mc_source(int add, int omode, struct sock *sk,
  		  struct group_source_req *pgsr);
  int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf);
  int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf,
  		  struct group_filter __user *optval, int __user *optlen);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
939
940
  
  #ifdef CONFIG_PROC_FS
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
941
942
943
944
945
946
947
948
949
950
951
952
953
954
  int ac6_proc_init(struct net *net);
  void ac6_proc_exit(struct net *net);
  int raw6_proc_init(void);
  void raw6_proc_exit(void);
  int tcp6_proc_init(struct net *net);
  void tcp6_proc_exit(struct net *net);
  int udp6_proc_init(struct net *net);
  void udp6_proc_exit(struct net *net);
  int udplite6_proc_init(void);
  void udplite6_proc_exit(void);
  int ipv6_misc_proc_init(void);
  void ipv6_misc_proc_exit(void);
  int snmp6_register_dev(struct inet6_dev *idev);
  int snmp6_unregister_dev(struct inet6_dev *idev);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
955

7f7d9a6b9   Herbert Xu   [IPV6]: Consolida...
956
  #else
6ab57e7e7   Daniel Lezcano   [NETNS][IPV6] any...
957
958
959
960
  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...
961
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
962

20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
963
  #ifdef CONFIG_SYSCTL
9e8cda3ba   Joe Perches   ipv6: Convert use...
964
  extern struct ctl_table ipv6_route_table_template[];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
965

5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
966
967
968
969
  struct ctl_table *ipv6_icmp_sysctl_init(struct net *net);
  struct ctl_table *ipv6_route_sysctl_init(struct net *net);
  int ipv6_sysctl_register(void);
  void ipv6_sysctl_unregister(void);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
970
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
971

46a4dee07   Madhu Challa   igmp v6: add __ip...
972
973
  int ipv6_sock_mc_join(struct sock *sk, int ifindex,
  		      const struct in6_addr *addr);
46a4dee07   Madhu Challa   igmp v6: add __ip...
974
975
  int ipv6_sock_mc_drop(struct sock *sk, int ifindex,
  		      const struct in6_addr *addr);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
976
  #endif /* _NET_IPV6_H */