1/*
2 *	Linux INET6 implementation
3 *
4 *	Authors:
5 *	Pedro Roque		<roque@di.fc.ul.pt>
6 *
7 *	This program is free software; you can redistribute it and/or
8 *      modify it under the terms of the GNU General Public License
9 *      as published by the Free Software Foundation; either version
10 *      2 of the License, or (at your option) any later version.
11 */
12
13#ifndef _NET_IPV6_H
14#define _NET_IPV6_H
15
16#include <linux/ipv6.h>
17#include <linux/hardirq.h>
18#include <linux/jhash.h>
19#include <net/if_inet6.h>
20#include <net/ndisc.h>
21#include <net/flow.h>
22#include <net/flow_keys.h>
23#include <net/snmp.h>
24
25#define SIN6_LEN_RFC2133	24
26
27#define IPV6_MAXPLEN		65535
28
29/*
30 *	NextHeader field of IPv6 header
31 */
32
33#define NEXTHDR_HOP		0	/* Hop-by-hop option header. */
34#define NEXTHDR_TCP		6	/* TCP segment. */
35#define NEXTHDR_UDP		17	/* UDP message. */
36#define NEXTHDR_IPV6		41	/* IPv6 in IPv6 */
37#define NEXTHDR_ROUTING		43	/* Routing header. */
38#define NEXTHDR_FRAGMENT	44	/* Fragmentation/reassembly header. */
39#define NEXTHDR_GRE		47	/* GRE header. */
40#define NEXTHDR_ESP		50	/* Encapsulating security payload. */
41#define NEXTHDR_AUTH		51	/* Authentication header. */
42#define NEXTHDR_ICMP		58	/* ICMP for IPv6. */
43#define NEXTHDR_NONE		59	/* No next header */
44#define NEXTHDR_DEST		60	/* Destination options header. */
45#define NEXTHDR_SCTP		132	/* SCTP message. */
46#define NEXTHDR_MOBILITY	135	/* Mobility header. */
47
48#define NEXTHDR_MAX		255
49
50#define IPV6_DEFAULT_HOPLIMIT   64
51#define IPV6_DEFAULT_MCASTHOPS	1
52
53/*
54 *	Addr type
55 *
56 *	type	-	unicast | multicast
57 *	scope	-	local	| site	    | global
58 *	v4	-	compat
59 *	v4mapped
60 *	any
61 *	loopback
62 */
63
64#define IPV6_ADDR_ANY		0x0000U
65
66#define IPV6_ADDR_UNICAST      	0x0001U
67#define IPV6_ADDR_MULTICAST    	0x0002U
68
69#define IPV6_ADDR_LOOPBACK	0x0010U
70#define IPV6_ADDR_LINKLOCAL	0x0020U
71#define IPV6_ADDR_SITELOCAL	0x0040U
72
73#define IPV6_ADDR_COMPATv4	0x0080U
74
75#define IPV6_ADDR_SCOPE_MASK	0x00f0U
76
77#define IPV6_ADDR_MAPPED	0x1000U
78
79/*
80 *	Addr scopes
81 */
82#define IPV6_ADDR_MC_SCOPE(a)	\
83	((a)->s6_addr[1] & 0x0f)	/* nonstandard */
84#define __IPV6_ADDR_SCOPE_INVALID	-1
85#define IPV6_ADDR_SCOPE_NODELOCAL	0x01
86#define IPV6_ADDR_SCOPE_LINKLOCAL	0x02
87#define IPV6_ADDR_SCOPE_SITELOCAL	0x05
88#define IPV6_ADDR_SCOPE_ORGLOCAL	0x08
89#define IPV6_ADDR_SCOPE_GLOBAL		0x0e
90
91/*
92 *	Addr flags
93 */
94#define IPV6_ADDR_MC_FLAG_TRANSIENT(a)	\
95	((a)->s6_addr[1] & 0x10)
96#define IPV6_ADDR_MC_FLAG_PREFIX(a)	\
97	((a)->s6_addr[1] & 0x20)
98#define IPV6_ADDR_MC_FLAG_RENDEZVOUS(a)	\
99	((a)->s6_addr[1] & 0x40)
100
101/*
102 *	fragmentation header
103 */
104
105struct frag_hdr {
106	__u8	nexthdr;
107	__u8	reserved;
108	__be16	frag_off;
109	__be32	identification;
110};
111
112#define	IP6_MF		0x0001
113#define	IP6_OFFSET	0xFFF8
114
115#define IP6_REPLY_MARK(net, mark) \
116	((net)->ipv6.sysctl.fwmark_reflect ? (mark) : 0)
117
118#include <net/sock.h>
119
120/* sysctls */
121extern int sysctl_mld_max_msf;
122extern int sysctl_mld_qrv;
123
124#define _DEVINC(net, statname, modifier, idev, field)			\
125({									\
126	struct inet6_dev *_idev = (idev);				\
127	if (likely(_idev != NULL))					\
128		SNMP_INC_STATS##modifier((_idev)->stats.statname, (field)); \
129	SNMP_INC_STATS##modifier((net)->mib.statname##_statistics, (field));\
130})
131
132/* per device counters are atomic_long_t */
133#define _DEVINCATOMIC(net, statname, modifier, idev, field)		\
134({									\
135	struct inet6_dev *_idev = (idev);				\
136	if (likely(_idev != NULL))					\
137		SNMP_INC_STATS_ATOMIC_LONG((_idev)->stats.statname##dev, (field)); \
138	SNMP_INC_STATS##modifier((net)->mib.statname##_statistics, (field));\
139})
140
141/* per device and per net counters are atomic_long_t */
142#define _DEVINC_ATOMIC_ATOMIC(net, statname, idev, field)		\
143({									\
144	struct inet6_dev *_idev = (idev);				\
145	if (likely(_idev != NULL))					\
146		SNMP_INC_STATS_ATOMIC_LONG((_idev)->stats.statname##dev, (field)); \
147	SNMP_INC_STATS_ATOMIC_LONG((net)->mib.statname##_statistics, (field));\
148})
149
150#define _DEVADD(net, statname, modifier, idev, field, val)		\
151({									\
152	struct inet6_dev *_idev = (idev);				\
153	if (likely(_idev != NULL))					\
154		SNMP_ADD_STATS##modifier((_idev)->stats.statname, (field), (val)); \
155	SNMP_ADD_STATS##modifier((net)->mib.statname##_statistics, (field), (val));\
156})
157
158#define _DEVUPD(net, statname, modifier, idev, field, val)		\
159({									\
160	struct inet6_dev *_idev = (idev);				\
161	if (likely(_idev != NULL))					\
162		SNMP_UPD_PO_STATS##modifier((_idev)->stats.statname, field, (val)); \
163	SNMP_UPD_PO_STATS##modifier((net)->mib.statname##_statistics, field, (val));\
164})
165
166/* MIBs */
167
168#define IP6_INC_STATS(net, idev,field)		\
169		_DEVINC(net, ipv6, 64, idev, field)
170#define IP6_INC_STATS_BH(net, idev,field)	\
171		_DEVINC(net, ipv6, 64_BH, idev, field)
172#define IP6_ADD_STATS(net, idev,field,val)	\
173		_DEVADD(net, ipv6, 64, idev, field, val)
174#define IP6_ADD_STATS_BH(net, idev,field,val)	\
175		_DEVADD(net, ipv6, 64_BH, idev, field, val)
176#define IP6_UPD_PO_STATS(net, idev,field,val)   \
177		_DEVUPD(net, ipv6, 64, idev, field, val)
178#define IP6_UPD_PO_STATS_BH(net, idev,field,val)   \
179		_DEVUPD(net, ipv6, 64_BH, idev, field, val)
180#define ICMP6_INC_STATS(net, idev, field)	\
181		_DEVINCATOMIC(net, icmpv6, , idev, field)
182#define ICMP6_INC_STATS_BH(net, idev, field)	\
183		_DEVINCATOMIC(net, icmpv6, _BH, idev, field)
184
185#define ICMP6MSGOUT_INC_STATS(net, idev, field)		\
186	_DEVINC_ATOMIC_ATOMIC(net, icmpv6msg, idev, field +256)
187#define ICMP6MSGOUT_INC_STATS_BH(net, idev, field)	\
188	_DEVINC_ATOMIC_ATOMIC(net, icmpv6msg, idev, field +256)
189#define ICMP6MSGIN_INC_STATS_BH(net, idev, field)	\
190	_DEVINC_ATOMIC_ATOMIC(net, icmpv6msg, idev, field)
191
192struct ip6_ra_chain {
193	struct ip6_ra_chain	*next;
194	struct sock		*sk;
195	int			sel;
196	void			(*destructor)(struct sock *);
197};
198
199extern struct ip6_ra_chain	*ip6_ra_chain;
200extern rwlock_t ip6_ra_lock;
201
202/*
203   This structure is prepared by protocol, when parsing
204   ancillary data and passed to IPv6.
205 */
206
207struct ipv6_txoptions {
208	atomic_t		refcnt;
209	/* Length of this structure */
210	int			tot_len;
211
212	/* length of extension headers   */
213
214	__u16			opt_flen;	/* after fragment hdr */
215	__u16			opt_nflen;	/* before fragment hdr */
216
217	struct ipv6_opt_hdr	*hopopt;
218	struct ipv6_opt_hdr	*dst0opt;
219	struct ipv6_rt_hdr	*srcrt;	/* Routing Header */
220	struct ipv6_opt_hdr	*dst1opt;
221	struct rcu_head		rcu;
222	/* Option buffer, as read by IPV6_PKTOPTIONS, starts here. */
223};
224
225struct ip6_flowlabel {
226	struct ip6_flowlabel __rcu *next;
227	__be32			label;
228	atomic_t		users;
229	struct in6_addr		dst;
230	struct ipv6_txoptions	*opt;
231	unsigned long		linger;
232	struct rcu_head		rcu;
233	u8			share;
234	union {
235		struct pid *pid;
236		kuid_t uid;
237	} owner;
238	unsigned long		lastuse;
239	unsigned long		expires;
240	struct net		*fl_net;
241};
242
243#define IPV6_FLOWINFO_MASK	cpu_to_be32(0x0FFFFFFF)
244#define IPV6_FLOWLABEL_MASK	cpu_to_be32(0x000FFFFF)
245#define IPV6_TCLASS_MASK (IPV6_FLOWINFO_MASK & ~IPV6_FLOWLABEL_MASK)
246#define IPV6_TCLASS_SHIFT	20
247
248struct ipv6_fl_socklist {
249	struct ipv6_fl_socklist	__rcu	*next;
250	struct ip6_flowlabel		*fl;
251	struct rcu_head			rcu;
252};
253
254static inline struct ipv6_txoptions *txopt_get(const struct ipv6_pinfo *np)
255{
256	struct ipv6_txoptions *opt;
257
258	rcu_read_lock();
259	opt = rcu_dereference(np->opt);
260	if (opt && !atomic_inc_not_zero(&opt->refcnt))
261		opt = NULL;
262	rcu_read_unlock();
263	return opt;
264}
265
266static inline void txopt_put(struct ipv6_txoptions *opt)
267{
268	if (opt && atomic_dec_and_test(&opt->refcnt))
269		kfree_rcu(opt, rcu);
270}
271
272struct ip6_flowlabel *fl6_sock_lookup(struct sock *sk, __be32 label);
273struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions *opt_space,
274					 struct ip6_flowlabel *fl,
275					 struct ipv6_txoptions *fopt);
276void fl6_free_socklist(struct sock *sk);
277int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen);
278int ipv6_flowlabel_opt_get(struct sock *sk, struct in6_flowlabel_req *freq,
279			   int flags);
280int ip6_flowlabel_init(void);
281void ip6_flowlabel_cleanup(void);
282
283static inline void fl6_sock_release(struct ip6_flowlabel *fl)
284{
285	if (fl)
286		atomic_dec(&fl->users);
287}
288
289void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info);
290
291int icmpv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6,
292			       struct icmp6hdr *thdr, int len);
293
294int ip6_ra_control(struct sock *sk, int sel);
295
296int ipv6_parse_hopopts(struct sk_buff *skb);
297
298struct ipv6_txoptions *ipv6_dup_options(struct sock *sk,
299					struct ipv6_txoptions *opt);
300struct ipv6_txoptions *ipv6_renew_options(struct sock *sk,
301					  struct ipv6_txoptions *opt,
302					  int newtype,
303					  struct ipv6_opt_hdr __user *newopt,
304					  int newoptlen);
305struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space,
306					  struct ipv6_txoptions *opt);
307
308bool ipv6_opt_accepted(const struct sock *sk, const struct sk_buff *skb,
309		       const struct inet6_skb_parm *opt);
310
311static inline bool ipv6_accept_ra(struct inet6_dev *idev)
312{
313	/* If forwarding is enabled, RA are not accepted unless the special
314	 * hybrid mode (accept_ra=2) is enabled.
315	 */
316	return idev->cnf.forwarding ? idev->cnf.accept_ra == 2 :
317	    idev->cnf.accept_ra;
318}
319
320#if IS_ENABLED(CONFIG_IPV6)
321static inline int ip6_frag_mem(struct net *net)
322{
323	return sum_frag_mem_limit(&net->ipv6.frags);
324}
325#endif
326
327#define IPV6_FRAG_HIGH_THRESH	(4 * 1024*1024)	/* 4194304 */
328#define IPV6_FRAG_LOW_THRESH	(3 * 1024*1024)	/* 3145728 */
329#define IPV6_FRAG_TIMEOUT	(60 * HZ)	/* 60 seconds */
330
331int __ipv6_addr_type(const struct in6_addr *addr);
332static inline int ipv6_addr_type(const struct in6_addr *addr)
333{
334	return __ipv6_addr_type(addr) & 0xffff;
335}
336
337static inline int ipv6_addr_scope(const struct in6_addr *addr)
338{
339	return __ipv6_addr_type(addr) & IPV6_ADDR_SCOPE_MASK;
340}
341
342static inline int __ipv6_addr_src_scope(int type)
343{
344	return (type == IPV6_ADDR_ANY) ? __IPV6_ADDR_SCOPE_INVALID : (type >> 16);
345}
346
347static inline int ipv6_addr_src_scope(const struct in6_addr *addr)
348{
349	return __ipv6_addr_src_scope(__ipv6_addr_type(addr));
350}
351
352static inline bool __ipv6_addr_needs_scope_id(int type)
353{
354	return type & IPV6_ADDR_LINKLOCAL ||
355	       (type & IPV6_ADDR_MULTICAST &&
356		(type & (IPV6_ADDR_LOOPBACK|IPV6_ADDR_LINKLOCAL)));
357}
358
359static inline __u32 ipv6_iface_scope_id(const struct in6_addr *addr, int iface)
360{
361	return __ipv6_addr_needs_scope_id(__ipv6_addr_type(addr)) ? iface : 0;
362}
363
364static inline int ipv6_addr_cmp(const struct in6_addr *a1, const struct in6_addr *a2)
365{
366	return memcmp(a1, a2, sizeof(struct in6_addr));
367}
368
369static inline bool
370ipv6_masked_addr_cmp(const struct in6_addr *a1, const struct in6_addr *m,
371		     const struct in6_addr *a2)
372{
373#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
374	const unsigned long *ul1 = (const unsigned long *)a1;
375	const unsigned long *ulm = (const unsigned long *)m;
376	const unsigned long *ul2 = (const unsigned long *)a2;
377
378	return !!(((ul1[0] ^ ul2[0]) & ulm[0]) |
379		  ((ul1[1] ^ ul2[1]) & ulm[1]));
380#else
381	return !!(((a1->s6_addr32[0] ^ a2->s6_addr32[0]) & m->s6_addr32[0]) |
382		  ((a1->s6_addr32[1] ^ a2->s6_addr32[1]) & m->s6_addr32[1]) |
383		  ((a1->s6_addr32[2] ^ a2->s6_addr32[2]) & m->s6_addr32[2]) |
384		  ((a1->s6_addr32[3] ^ a2->s6_addr32[3]) & m->s6_addr32[3]));
385#endif
386}
387
388static inline void ipv6_addr_prefix(struct in6_addr *pfx,
389				    const struct in6_addr *addr,
390				    int plen)
391{
392	/* caller must guarantee 0 <= plen <= 128 */
393	int o = plen >> 3,
394	    b = plen & 0x7;
395
396	memset(pfx->s6_addr, 0, sizeof(pfx->s6_addr));
397	memcpy(pfx->s6_addr, addr, o);
398	if (b != 0)
399		pfx->s6_addr[o] = addr->s6_addr[o] & (0xff00 >> b);
400}
401
402static inline void __ipv6_addr_set_half(__be32 *addr,
403					__be32 wh, __be32 wl)
404{
405#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
406#if defined(__BIG_ENDIAN)
407	if (__builtin_constant_p(wh) && __builtin_constant_p(wl)) {
408		*(__force u64 *)addr = ((__force u64)(wh) << 32 | (__force u64)(wl));
409		return;
410	}
411#elif defined(__LITTLE_ENDIAN)
412	if (__builtin_constant_p(wl) && __builtin_constant_p(wh)) {
413		*(__force u64 *)addr = ((__force u64)(wl) << 32 | (__force u64)(wh));
414		return;
415	}
416#endif
417#endif
418	addr[0] = wh;
419	addr[1] = wl;
420}
421
422static inline void ipv6_addr_set(struct in6_addr *addr,
423				     __be32 w1, __be32 w2,
424				     __be32 w3, __be32 w4)
425{
426	__ipv6_addr_set_half(&addr->s6_addr32[0], w1, w2);
427	__ipv6_addr_set_half(&addr->s6_addr32[2], w3, w4);
428}
429
430static inline bool ipv6_addr_equal(const struct in6_addr *a1,
431				   const struct in6_addr *a2)
432{
433#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
434	const unsigned long *ul1 = (const unsigned long *)a1;
435	const unsigned long *ul2 = (const unsigned long *)a2;
436
437	return ((ul1[0] ^ ul2[0]) | (ul1[1] ^ ul2[1])) == 0UL;
438#else
439	return ((a1->s6_addr32[0] ^ a2->s6_addr32[0]) |
440		(a1->s6_addr32[1] ^ a2->s6_addr32[1]) |
441		(a1->s6_addr32[2] ^ a2->s6_addr32[2]) |
442		(a1->s6_addr32[3] ^ a2->s6_addr32[3])) == 0;
443#endif
444}
445
446#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
447static inline bool __ipv6_prefix_equal64_half(const __be64 *a1,
448					      const __be64 *a2,
449					      unsigned int len)
450{
451	if (len && ((*a1 ^ *a2) & cpu_to_be64((~0UL) << (64 - len))))
452		return false;
453	return true;
454}
455
456static inline bool ipv6_prefix_equal(const struct in6_addr *addr1,
457				     const struct in6_addr *addr2,
458				     unsigned int prefixlen)
459{
460	const __be64 *a1 = (const __be64 *)addr1;
461	const __be64 *a2 = (const __be64 *)addr2;
462
463	if (prefixlen >= 64) {
464		if (a1[0] ^ a2[0])
465			return false;
466		return __ipv6_prefix_equal64_half(a1 + 1, a2 + 1, prefixlen - 64);
467	}
468	return __ipv6_prefix_equal64_half(a1, a2, prefixlen);
469}
470#else
471static inline bool ipv6_prefix_equal(const struct in6_addr *addr1,
472				     const struct in6_addr *addr2,
473				     unsigned int prefixlen)
474{
475	const __be32 *a1 = addr1->s6_addr32;
476	const __be32 *a2 = addr2->s6_addr32;
477	unsigned int pdw, pbi;
478
479	/* check complete u32 in prefix */
480	pdw = prefixlen >> 5;
481	if (pdw && memcmp(a1, a2, pdw << 2))
482		return false;
483
484	/* check incomplete u32 in prefix */
485	pbi = prefixlen & 0x1f;
486	if (pbi && ((a1[pdw] ^ a2[pdw]) & htonl((0xffffffff) << (32 - pbi))))
487		return false;
488
489	return true;
490}
491#endif
492
493struct inet_frag_queue;
494
495enum ip6_defrag_users {
496	IP6_DEFRAG_LOCAL_DELIVER,
497	IP6_DEFRAG_CONNTRACK_IN,
498	__IP6_DEFRAG_CONNTRACK_IN	= IP6_DEFRAG_CONNTRACK_IN + USHRT_MAX,
499	IP6_DEFRAG_CONNTRACK_OUT,
500	__IP6_DEFRAG_CONNTRACK_OUT	= IP6_DEFRAG_CONNTRACK_OUT + USHRT_MAX,
501	IP6_DEFRAG_CONNTRACK_BRIDGE_IN,
502	__IP6_DEFRAG_CONNTRACK_BRIDGE_IN = IP6_DEFRAG_CONNTRACK_BRIDGE_IN + USHRT_MAX,
503};
504
505struct ip6_create_arg {
506	__be32 id;
507	u32 user;
508	const struct in6_addr *src;
509	const struct in6_addr *dst;
510	int iif;
511	u8 ecn;
512};
513
514void ip6_frag_init(struct inet_frag_queue *q, const void *a);
515bool ip6_frag_match(const struct inet_frag_queue *q, const void *a);
516
517/*
518 *	Equivalent of ipv4 struct ip
519 */
520struct frag_queue {
521	struct inet_frag_queue	q;
522
523	__be32			id;		/* fragment id		*/
524	u32			user;
525	struct in6_addr		saddr;
526	struct in6_addr		daddr;
527
528	int			iif;
529	unsigned int		csum;
530	__u16			nhoffset;
531	u8			ecn;
532};
533
534void ip6_expire_frag_queue(struct net *net, struct frag_queue *fq,
535			   struct inet_frags *frags);
536
537static inline bool ipv6_addr_any(const struct in6_addr *a)
538{
539#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
540	const unsigned long *ul = (const unsigned long *)a;
541
542	return (ul[0] | ul[1]) == 0UL;
543#else
544	return (a->s6_addr32[0] | a->s6_addr32[1] |
545		a->s6_addr32[2] | a->s6_addr32[3]) == 0;
546#endif
547}
548
549static inline u32 ipv6_addr_hash(const struct in6_addr *a)
550{
551#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
552	const unsigned long *ul = (const unsigned long *)a;
553	unsigned long x = ul[0] ^ ul[1];
554
555	return (u32)(x ^ (x >> 32));
556#else
557	return (__force u32)(a->s6_addr32[0] ^ a->s6_addr32[1] ^
558			     a->s6_addr32[2] ^ a->s6_addr32[3]);
559#endif
560}
561
562/* more secured version of ipv6_addr_hash() */
563static inline u32 __ipv6_addr_jhash(const struct in6_addr *a, const u32 initval)
564{
565	u32 v = (__force u32)a->s6_addr32[0] ^ (__force u32)a->s6_addr32[1];
566
567	return jhash_3words(v,
568			    (__force u32)a->s6_addr32[2],
569			    (__force u32)a->s6_addr32[3],
570			    initval);
571}
572
573static inline bool ipv6_addr_loopback(const struct in6_addr *a)
574{
575#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
576	const __be64 *be = (const __be64 *)a;
577
578	return (be[0] | (be[1] ^ cpu_to_be64(1))) == 0UL;
579#else
580	return (a->s6_addr32[0] | a->s6_addr32[1] |
581		a->s6_addr32[2] | (a->s6_addr32[3] ^ cpu_to_be32(1))) == 0;
582#endif
583}
584
585/*
586 * Note that we must __force cast these to unsigned long to make sparse happy,
587 * since all of the endian-annotated types are fixed size regardless of arch.
588 */
589static inline bool ipv6_addr_v4mapped(const struct in6_addr *a)
590{
591	return (
592#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
593		*(unsigned long *)a |
594#else
595		(__force unsigned long)(a->s6_addr32[0] | a->s6_addr32[1]) |
596#endif
597		(__force unsigned long)(a->s6_addr32[2] ^
598					cpu_to_be32(0x0000ffff))) == 0UL;
599}
600
601/*
602 * Check for a RFC 4843 ORCHID address
603 * (Overlay Routable Cryptographic Hash Identifiers)
604 */
605static inline bool ipv6_addr_orchid(const struct in6_addr *a)
606{
607	return (a->s6_addr32[0] & htonl(0xfffffff0)) == htonl(0x20010010);
608}
609
610static inline bool ipv6_addr_is_multicast(const struct in6_addr *addr)
611{
612	return (addr->s6_addr32[0] & htonl(0xFF000000)) == htonl(0xFF000000);
613}
614
615static inline void ipv6_addr_set_v4mapped(const __be32 addr,
616					  struct in6_addr *v4mapped)
617{
618	ipv6_addr_set(v4mapped,
619			0, 0,
620			htonl(0x0000FFFF),
621			addr);
622}
623
624/*
625 * find the first different bit between two addresses
626 * length of address must be a multiple of 32bits
627 */
628static inline int __ipv6_addr_diff32(const void *token1, const void *token2, int addrlen)
629{
630	const __be32 *a1 = token1, *a2 = token2;
631	int i;
632
633	addrlen >>= 2;
634
635	for (i = 0; i < addrlen; i++) {
636		__be32 xb = a1[i] ^ a2[i];
637		if (xb)
638			return i * 32 + 31 - __fls(ntohl(xb));
639	}
640
641	/*
642	 *	we should *never* get to this point since that
643	 *	would mean the addrs are equal
644	 *
645	 *	However, we do get to it 8) And exacly, when
646	 *	addresses are equal 8)
647	 *
648	 *	ip route add 1111::/128 via ...
649	 *	ip route add 1111::/64 via ...
650	 *	and we are here.
651	 *
652	 *	Ideally, this function should stop comparison
653	 *	at prefix length. It does not, but it is still OK,
654	 *	if returned value is greater than prefix length.
655	 *					--ANK (980803)
656	 */
657	return addrlen << 5;
658}
659
660#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
661static inline int __ipv6_addr_diff64(const void *token1, const void *token2, int addrlen)
662{
663	const __be64 *a1 = token1, *a2 = token2;
664	int i;
665
666	addrlen >>= 3;
667
668	for (i = 0; i < addrlen; i++) {
669		__be64 xb = a1[i] ^ a2[i];
670		if (xb)
671			return i * 64 + 63 - __fls(be64_to_cpu(xb));
672	}
673
674	return addrlen << 6;
675}
676#endif
677
678static inline int __ipv6_addr_diff(const void *token1, const void *token2, int addrlen)
679{
680#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
681	if (__builtin_constant_p(addrlen) && !(addrlen & 7))
682		return __ipv6_addr_diff64(token1, token2, addrlen);
683#endif
684	return __ipv6_addr_diff32(token1, token2, addrlen);
685}
686
687static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_addr *a2)
688{
689	return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr));
690}
691
692void ipv6_select_ident(struct net *net, struct frag_hdr *fhdr,
693		       struct rt6_info *rt);
694void ipv6_proxy_select_ident(struct net *net, struct sk_buff *skb);
695
696int ip6_dst_hoplimit(struct dst_entry *dst);
697
698static inline int ip6_sk_dst_hoplimit(struct ipv6_pinfo *np, struct flowi6 *fl6,
699				      struct dst_entry *dst)
700{
701	int hlimit;
702
703	if (ipv6_addr_is_multicast(&fl6->daddr))
704		hlimit = np->mcast_hops;
705	else
706		hlimit = np->hop_limit;
707	if (hlimit < 0)
708		hlimit = ip6_dst_hoplimit(dst);
709	return hlimit;
710}
711
712#if IS_ENABLED(CONFIG_IPV6)
713static inline void ip6_set_txhash(struct sock *sk)
714{
715	struct inet_sock *inet = inet_sk(sk);
716	struct ipv6_pinfo *np = inet6_sk(sk);
717	struct flow_keys keys;
718
719	keys.src = (__force __be32)ipv6_addr_hash(&np->saddr);
720	keys.dst = (__force __be32)ipv6_addr_hash(&sk->sk_v6_daddr);
721	keys.port16[0] = inet->inet_sport;
722	keys.port16[1] = inet->inet_dport;
723
724	sk->sk_txhash = flow_hash_from_keys(&keys);
725}
726
727static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb,
728					__be32 flowlabel, bool autolabel)
729{
730	if (!flowlabel && (autolabel || net->ipv6.sysctl.auto_flowlabels)) {
731		u32 hash;
732
733		hash = skb_get_hash(skb);
734
735		/* Since this is being sent on the wire obfuscate hash a bit
736		 * to minimize possbility that any useful information to an
737		 * attacker is leaked. Only lower 20 bits are relevant.
738		 */
739		hash ^= hash >> 12;
740
741		flowlabel = (__force __be32)hash & IPV6_FLOWLABEL_MASK;
742	}
743
744	return flowlabel;
745}
746#else
747static inline void ip6_set_txhash(struct sock *sk) { }
748static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb,
749					__be32 flowlabel, bool autolabel)
750{
751	return flowlabel;
752}
753#endif
754
755
756/*
757 *	Header manipulation
758 */
759static inline void ip6_flow_hdr(struct ipv6hdr *hdr, unsigned int tclass,
760				__be32 flowlabel)
761{
762	*(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | flowlabel;
763}
764
765static inline __be32 ip6_flowinfo(const struct ipv6hdr *hdr)
766{
767	return *(__be32 *)hdr & IPV6_FLOWINFO_MASK;
768}
769
770static inline __be32 ip6_flowlabel(const struct ipv6hdr *hdr)
771{
772	return *(__be32 *)hdr & IPV6_FLOWLABEL_MASK;
773}
774
775static inline u8 ip6_tclass(__be32 flowinfo)
776{
777	return ntohl(flowinfo & IPV6_TCLASS_MASK) >> IPV6_TCLASS_SHIFT;
778}
779/*
780 *	Prototypes exported by ipv6
781 */
782
783/*
784 *	rcv function (called from netdevice level)
785 */
786
787int ipv6_rcv(struct sk_buff *skb, struct net_device *dev,
788	     struct packet_type *pt, struct net_device *orig_dev);
789
790int ip6_rcv_finish(struct sock *sk, struct sk_buff *skb);
791
792/*
793 *	upper-layer output functions
794 */
795int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
796	     struct ipv6_txoptions *opt, int tclass);
797
798int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr);
799
800int ip6_append_data(struct sock *sk,
801		    int getfrag(void *from, char *to, int offset, int len,
802				int odd, struct sk_buff *skb),
803		    void *from, int length, int transhdrlen, int hlimit,
804		    int tclass, struct ipv6_txoptions *opt, struct flowi6 *fl6,
805		    struct rt6_info *rt, unsigned int flags, int dontfrag);
806
807int ip6_push_pending_frames(struct sock *sk);
808
809void ip6_flush_pending_frames(struct sock *sk);
810
811int ip6_send_skb(struct sk_buff *skb);
812
813struct sk_buff *__ip6_make_skb(struct sock *sk, struct sk_buff_head *queue,
814			       struct inet_cork_full *cork,
815			       struct inet6_cork *v6_cork);
816struct sk_buff *ip6_make_skb(struct sock *sk,
817			     int getfrag(void *from, char *to, int offset,
818					 int len, int odd, struct sk_buff *skb),
819			     void *from, int length, int transhdrlen,
820			     int hlimit, int tclass, struct ipv6_txoptions *opt,
821			     struct flowi6 *fl6, struct rt6_info *rt,
822			     unsigned int flags, int dontfrag);
823
824static inline struct sk_buff *ip6_finish_skb(struct sock *sk)
825{
826	return __ip6_make_skb(sk, &sk->sk_write_queue, &inet_sk(sk)->cork,
827			      &inet6_sk(sk)->cork);
828}
829
830int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi6 *fl6);
831struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
832				      const struct in6_addr *final_dst);
833struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
834					 const struct in6_addr *final_dst);
835struct dst_entry *ip6_blackhole_route(struct net *net,
836				      struct dst_entry *orig_dst);
837
838/*
839 *	skb processing functions
840 */
841
842int ip6_output(struct sock *sk, struct sk_buff *skb);
843int ip6_forward(struct sk_buff *skb);
844int ip6_input(struct sk_buff *skb);
845int ip6_mc_input(struct sk_buff *skb);
846
847int __ip6_local_out(struct sk_buff *skb);
848int ip6_local_out_sk(struct sock *sk, struct sk_buff *skb);
849int ip6_local_out(struct sk_buff *skb);
850
851/*
852 *	Extension header (options) processing
853 */
854
855void ipv6_push_nfrag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt,
856			  u8 *proto, struct in6_addr **daddr_p);
857void ipv6_push_frag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt,
858			 u8 *proto);
859
860int ipv6_skip_exthdr(const struct sk_buff *, int start, u8 *nexthdrp,
861		     __be16 *frag_offp);
862
863bool ipv6_ext_hdr(u8 nexthdr);
864
865enum {
866	IP6_FH_F_FRAG		= (1 << 0),
867	IP6_FH_F_AUTH		= (1 << 1),
868	IP6_FH_F_SKIP_RH	= (1 << 2),
869};
870
871/* find specified header and get offset to it */
872int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, int target,
873		  unsigned short *fragoff, int *fragflg);
874
875int ipv6_find_tlv(struct sk_buff *skb, int offset, int type);
876
877struct in6_addr *fl6_update_dst(struct flowi6 *fl6,
878				const struct ipv6_txoptions *opt,
879				struct in6_addr *orig);
880
881/*
882 *	socket options (ipv6_sockglue.c)
883 */
884
885int ipv6_setsockopt(struct sock *sk, int level, int optname,
886		    char __user *optval, unsigned int optlen);
887int ipv6_getsockopt(struct sock *sk, int level, int optname,
888		    char __user *optval, int __user *optlen);
889int compat_ipv6_setsockopt(struct sock *sk, int level, int optname,
890			   char __user *optval, unsigned int optlen);
891int compat_ipv6_getsockopt(struct sock *sk, int level, int optname,
892			   char __user *optval, int __user *optlen);
893
894int ip6_datagram_connect(struct sock *sk, struct sockaddr *addr, int addr_len);
895int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *addr,
896				 int addr_len);
897
898int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len,
899		    int *addr_len);
900int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len,
901		     int *addr_len);
902void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port,
903		     u32 info, u8 *payload);
904void ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info);
905void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu);
906
907int inet6_release(struct socket *sock);
908int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len);
909int inet6_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_len,
910		  int peer);
911int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
912
913int inet6_hash_connect(struct inet_timewait_death_row *death_row,
914			      struct sock *sk);
915
916/*
917 * reassembly.c
918 */
919extern const struct proto_ops inet6_stream_ops;
920extern const struct proto_ops inet6_dgram_ops;
921
922struct group_source_req;
923struct group_filter;
924
925int ip6_mc_source(int add, int omode, struct sock *sk,
926		  struct group_source_req *pgsr);
927int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf);
928int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf,
929		  struct group_filter __user *optval, int __user *optlen);
930
931#ifdef CONFIG_PROC_FS
932int ac6_proc_init(struct net *net);
933void ac6_proc_exit(struct net *net);
934int raw6_proc_init(void);
935void raw6_proc_exit(void);
936int tcp6_proc_init(struct net *net);
937void tcp6_proc_exit(struct net *net);
938int udp6_proc_init(struct net *net);
939void udp6_proc_exit(struct net *net);
940int udplite6_proc_init(void);
941void udplite6_proc_exit(void);
942int ipv6_misc_proc_init(void);
943void ipv6_misc_proc_exit(void);
944int snmp6_register_dev(struct inet6_dev *idev);
945int snmp6_unregister_dev(struct inet6_dev *idev);
946
947#else
948static inline int ac6_proc_init(struct net *net) { return 0; }
949static inline void ac6_proc_exit(struct net *net) { }
950static inline int snmp6_register_dev(struct inet6_dev *idev) { return 0; }
951static inline int snmp6_unregister_dev(struct inet6_dev *idev) { return 0; }
952#endif
953
954#ifdef CONFIG_SYSCTL
955extern struct ctl_table ipv6_route_table_template[];
956
957struct ctl_table *ipv6_icmp_sysctl_init(struct net *net);
958struct ctl_table *ipv6_route_sysctl_init(struct net *net);
959int ipv6_sysctl_register(void);
960void ipv6_sysctl_unregister(void);
961#endif
962
963int ipv6_sock_mc_join(struct sock *sk, int ifindex,
964		      const struct in6_addr *addr);
965int ipv6_sock_mc_drop(struct sock *sk, int ifindex,
966		      const struct in6_addr *addr);
967#endif /* _NET_IPV6_H */
968