xref: /kernel/linux/linux-5.10/include/net/ipv6.h (revision 8c2ecf20)
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 *	Linux INET6 implementation
4 *
5 *	Authors:
6 *	Pedro Roque		<roque@di.fc.ul.pt>
7 */
8
9#ifndef _NET_IPV6_H
10#define _NET_IPV6_H
11
12#include <linux/ipv6.h>
13#include <linux/hardirq.h>
14#include <linux/jhash.h>
15#include <linux/refcount.h>
16#include <linux/jump_label_ratelimit.h>
17#include <net/if_inet6.h>
18#include <net/ndisc.h>
19#include <net/flow.h>
20#include <net/flow_dissector.h>
21#include <net/snmp.h>
22#include <net/netns/hash.h>
23
24#define SIN6_LEN_RFC2133	24
25
26#define IPV6_MAXPLEN		65535
27
28/*
29 *	NextHeader field of IPv6 header
30 */
31
32#define NEXTHDR_HOP		0	/* Hop-by-hop option header. */
33#define NEXTHDR_TCP		6	/* TCP segment. */
34#define NEXTHDR_UDP		17	/* UDP message. */
35#define NEXTHDR_IPV6		41	/* IPv6 in IPv6 */
36#define NEXTHDR_ROUTING		43	/* Routing header. */
37#define NEXTHDR_FRAGMENT	44	/* Fragmentation/reassembly header. */
38#define NEXTHDR_GRE		47	/* GRE header. */
39#define NEXTHDR_ESP		50	/* Encapsulating security payload. */
40#define NEXTHDR_AUTH		51	/* Authentication header. */
41#define NEXTHDR_ICMP		58	/* ICMP for IPv6. */
42#define NEXTHDR_NONE		59	/* No next header */
43#define NEXTHDR_DEST		60	/* Destination options header. */
44#define NEXTHDR_SCTP		132	/* SCTP message. */
45#define NEXTHDR_MOBILITY	135	/* Mobility header. */
46
47#define NEXTHDR_MAX		255
48
49#define IPV6_DEFAULT_HOPLIMIT   64
50#define IPV6_DEFAULT_MCASTHOPS	1
51
52/* Limits on Hop-by-Hop and Destination options.
53 *
54 * Per RFC8200 there is no limit on the maximum number or lengths of options in
55 * Hop-by-Hop or Destination options other then the packet must fit in an MTU.
56 * We allow configurable limits in order to mitigate potential denial of
57 * service attacks.
58 *
59 * There are three limits that may be set:
60 *   - Limit the number of options in a Hop-by-Hop or Destination options
61 *     extension header
62 *   - Limit the byte length of a Hop-by-Hop or Destination options extension
63 *     header
64 *   - Disallow unknown options
65 *
66 * The limits are expressed in corresponding sysctls:
67 *
68 * ipv6.sysctl.max_dst_opts_cnt
69 * ipv6.sysctl.max_hbh_opts_cnt
70 * ipv6.sysctl.max_dst_opts_len
71 * ipv6.sysctl.max_hbh_opts_len
72 *
73 * max_*_opts_cnt is the number of TLVs that are allowed for Destination
74 * options or Hop-by-Hop options. If the number is less than zero then unknown
75 * TLVs are disallowed and the number of known options that are allowed is the
76 * absolute value. Setting the value to INT_MAX indicates no limit.
77 *
78 * max_*_opts_len is the length limit in bytes of a Destination or
79 * Hop-by-Hop options extension header. Setting the value to INT_MAX
80 * indicates no length limit.
81 *
82 * If a limit is exceeded when processing an extension header the packet is
83 * silently discarded.
84 */
85
86/* Default limits for Hop-by-Hop and Destination options */
87#define IP6_DEFAULT_MAX_DST_OPTS_CNT	 8
88#define IP6_DEFAULT_MAX_HBH_OPTS_CNT	 8
89#define IP6_DEFAULT_MAX_DST_OPTS_LEN	 INT_MAX /* No limit */
90#define IP6_DEFAULT_MAX_HBH_OPTS_LEN	 INT_MAX /* No limit */
91
92/*
93 *	Addr type
94 *
95 *	type	-	unicast | multicast
96 *	scope	-	local	| site	    | global
97 *	v4	-	compat
98 *	v4mapped
99 *	any
100 *	loopback
101 */
102
103#define IPV6_ADDR_ANY		0x0000U
104
105#define IPV6_ADDR_UNICAST	0x0001U
106#define IPV6_ADDR_MULTICAST	0x0002U
107
108#define IPV6_ADDR_LOOPBACK	0x0010U
109#define IPV6_ADDR_LINKLOCAL	0x0020U
110#define IPV6_ADDR_SITELOCAL	0x0040U
111
112#define IPV6_ADDR_COMPATv4	0x0080U
113
114#define IPV6_ADDR_SCOPE_MASK	0x00f0U
115
116#define IPV6_ADDR_MAPPED	0x1000U
117
118/*
119 *	Addr scopes
120 */
121#define IPV6_ADDR_MC_SCOPE(a)	\
122	((a)->s6_addr[1] & 0x0f)	/* nonstandard */
123#define __IPV6_ADDR_SCOPE_INVALID	-1
124#define IPV6_ADDR_SCOPE_NODELOCAL	0x01
125#define IPV6_ADDR_SCOPE_LINKLOCAL	0x02
126#define IPV6_ADDR_SCOPE_SITELOCAL	0x05
127#define IPV6_ADDR_SCOPE_ORGLOCAL	0x08
128#define IPV6_ADDR_SCOPE_GLOBAL		0x0e
129
130/*
131 *	Addr flags
132 */
133#define IPV6_ADDR_MC_FLAG_TRANSIENT(a)	\
134	((a)->s6_addr[1] & 0x10)
135#define IPV6_ADDR_MC_FLAG_PREFIX(a)	\
136	((a)->s6_addr[1] & 0x20)
137#define IPV6_ADDR_MC_FLAG_RENDEZVOUS(a)	\
138	((a)->s6_addr[1] & 0x40)
139
140/*
141 *	fragmentation header
142 */
143
144struct frag_hdr {
145	__u8	nexthdr;
146	__u8	reserved;
147	__be16	frag_off;
148	__be32	identification;
149};
150
151#define	IP6_MF		0x0001
152#define	IP6_OFFSET	0xFFF8
153
154struct ip6_fraglist_iter {
155	struct ipv6hdr	*tmp_hdr;
156	struct sk_buff	*frag;
157	int		offset;
158	unsigned int	hlen;
159	__be32		frag_id;
160	u8		nexthdr;
161};
162
163int ip6_fraglist_init(struct sk_buff *skb, unsigned int hlen, u8 *prevhdr,
164		      u8 nexthdr, __be32 frag_id,
165		      struct ip6_fraglist_iter *iter);
166void ip6_fraglist_prepare(struct sk_buff *skb, struct ip6_fraglist_iter *iter);
167
168static inline struct sk_buff *ip6_fraglist_next(struct ip6_fraglist_iter *iter)
169{
170	struct sk_buff *skb = iter->frag;
171
172	iter->frag = skb->next;
173	skb_mark_not_on_list(skb);
174
175	return skb;
176}
177
178struct ip6_frag_state {
179	u8		*prevhdr;
180	unsigned int	hlen;
181	unsigned int	mtu;
182	unsigned int	left;
183	int		offset;
184	int		ptr;
185	int		hroom;
186	int		troom;
187	__be32		frag_id;
188	u8		nexthdr;
189};
190
191void ip6_frag_init(struct sk_buff *skb, unsigned int hlen, unsigned int mtu,
192		   unsigned short needed_tailroom, int hdr_room, u8 *prevhdr,
193		   u8 nexthdr, __be32 frag_id, struct ip6_frag_state *state);
194struct sk_buff *ip6_frag_next(struct sk_buff *skb,
195			      struct ip6_frag_state *state);
196
197#define IP6_REPLY_MARK(net, mark) \
198	((net)->ipv6.sysctl.fwmark_reflect ? (mark) : 0)
199
200#include <net/sock.h>
201
202/* sysctls */
203extern int sysctl_mld_max_msf;
204extern int sysctl_mld_qrv;
205
206#define _DEVINC(net, statname, mod, idev, field)			\
207({									\
208	struct inet6_dev *_idev = (idev);				\
209	if (likely(_idev != NULL))					\
210		mod##SNMP_INC_STATS64((_idev)->stats.statname, (field));\
211	mod##SNMP_INC_STATS64((net)->mib.statname##_statistics, (field));\
212})
213
214/* per device counters are atomic_long_t */
215#define _DEVINCATOMIC(net, statname, mod, idev, field)			\
216({									\
217	struct inet6_dev *_idev = (idev);				\
218	if (likely(_idev != NULL))					\
219		SNMP_INC_STATS_ATOMIC_LONG((_idev)->stats.statname##dev, (field)); \
220	mod##SNMP_INC_STATS((net)->mib.statname##_statistics, (field));\
221})
222
223/* per device and per net counters are atomic_long_t */
224#define _DEVINC_ATOMIC_ATOMIC(net, statname, idev, field)		\
225({									\
226	struct inet6_dev *_idev = (idev);				\
227	if (likely(_idev != NULL))					\
228		SNMP_INC_STATS_ATOMIC_LONG((_idev)->stats.statname##dev, (field)); \
229	SNMP_INC_STATS_ATOMIC_LONG((net)->mib.statname##_statistics, (field));\
230})
231
232#define _DEVADD(net, statname, mod, idev, field, val)			\
233({									\
234	struct inet6_dev *_idev = (idev);				\
235	if (likely(_idev != NULL))					\
236		mod##SNMP_ADD_STATS((_idev)->stats.statname, (field), (val)); \
237	mod##SNMP_ADD_STATS((net)->mib.statname##_statistics, (field), (val));\
238})
239
240#define _DEVUPD(net, statname, mod, idev, field, val)			\
241({									\
242	struct inet6_dev *_idev = (idev);				\
243	if (likely(_idev != NULL))					\
244		mod##SNMP_UPD_PO_STATS((_idev)->stats.statname, field, (val)); \
245	mod##SNMP_UPD_PO_STATS((net)->mib.statname##_statistics, field, (val));\
246})
247
248/* MIBs */
249
250#define IP6_INC_STATS(net, idev,field)		\
251		_DEVINC(net, ipv6, , idev, field)
252#define __IP6_INC_STATS(net, idev,field)	\
253		_DEVINC(net, ipv6, __, idev, field)
254#define IP6_ADD_STATS(net, idev,field,val)	\
255		_DEVADD(net, ipv6, , idev, field, val)
256#define __IP6_ADD_STATS(net, idev,field,val)	\
257		_DEVADD(net, ipv6, __, idev, field, val)
258#define IP6_UPD_PO_STATS(net, idev,field,val)   \
259		_DEVUPD(net, ipv6, , idev, field, val)
260#define __IP6_UPD_PO_STATS(net, idev,field,val)   \
261		_DEVUPD(net, ipv6, __, idev, field, val)
262#define ICMP6_INC_STATS(net, idev, field)	\
263		_DEVINCATOMIC(net, icmpv6, , idev, field)
264#define __ICMP6_INC_STATS(net, idev, field)	\
265		_DEVINCATOMIC(net, icmpv6, __, idev, field)
266
267#define ICMP6MSGOUT_INC_STATS(net, idev, field)		\
268	_DEVINC_ATOMIC_ATOMIC(net, icmpv6msg, idev, field +256)
269#define ICMP6MSGIN_INC_STATS(net, idev, field)	\
270	_DEVINC_ATOMIC_ATOMIC(net, icmpv6msg, idev, field)
271
272struct ip6_ra_chain {
273	struct ip6_ra_chain	*next;
274	struct sock		*sk;
275	int			sel;
276	void			(*destructor)(struct sock *);
277};
278
279extern struct ip6_ra_chain	*ip6_ra_chain;
280extern rwlock_t ip6_ra_lock;
281
282/*
283   This structure is prepared by protocol, when parsing
284   ancillary data and passed to IPv6.
285 */
286
287struct ipv6_txoptions {
288	refcount_t		refcnt;
289	/* Length of this structure */
290	int			tot_len;
291
292	/* length of extension headers   */
293
294	__u16			opt_flen;	/* after fragment hdr */
295	__u16			opt_nflen;	/* before fragment hdr */
296
297	struct ipv6_opt_hdr	*hopopt;
298	struct ipv6_opt_hdr	*dst0opt;
299	struct ipv6_rt_hdr	*srcrt;	/* Routing Header */
300	struct ipv6_opt_hdr	*dst1opt;
301	struct rcu_head		rcu;
302	/* Option buffer, as read by IPV6_PKTOPTIONS, starts here. */
303};
304
305/* flowlabel_reflect sysctl values */
306enum flowlabel_reflect {
307	FLOWLABEL_REFLECT_ESTABLISHED		= 1,
308	FLOWLABEL_REFLECT_TCP_RESET		= 2,
309	FLOWLABEL_REFLECT_ICMPV6_ECHO_REPLIES	= 4,
310};
311
312struct ip6_flowlabel {
313	struct ip6_flowlabel __rcu *next;
314	__be32			label;
315	atomic_t		users;
316	struct in6_addr		dst;
317	struct ipv6_txoptions	*opt;
318	unsigned long		linger;
319	struct rcu_head		rcu;
320	u8			share;
321	union {
322		struct pid *pid;
323		kuid_t uid;
324	} owner;
325	unsigned long		lastuse;
326	unsigned long		expires;
327	struct net		*fl_net;
328};
329
330#define IPV6_FLOWINFO_MASK		cpu_to_be32(0x0FFFFFFF)
331#define IPV6_FLOWLABEL_MASK		cpu_to_be32(0x000FFFFF)
332#define IPV6_FLOWLABEL_STATELESS_FLAG	cpu_to_be32(0x00080000)
333
334#define IPV6_TCLASS_MASK (IPV6_FLOWINFO_MASK & ~IPV6_FLOWLABEL_MASK)
335#define IPV6_TCLASS_SHIFT	20
336
337struct ipv6_fl_socklist {
338	struct ipv6_fl_socklist	__rcu	*next;
339	struct ip6_flowlabel		*fl;
340	struct rcu_head			rcu;
341};
342
343struct ipcm6_cookie {
344	struct sockcm_cookie sockc;
345	__s16 hlimit;
346	__s16 tclass;
347	__s8  dontfrag;
348	struct ipv6_txoptions *opt;
349	__u16 gso_size;
350};
351
352static inline void ipcm6_init(struct ipcm6_cookie *ipc6)
353{
354	*ipc6 = (struct ipcm6_cookie) {
355		.hlimit = -1,
356		.tclass = -1,
357		.dontfrag = -1,
358	};
359}
360
361static inline void ipcm6_init_sk(struct ipcm6_cookie *ipc6,
362				 const struct ipv6_pinfo *np)
363{
364	*ipc6 = (struct ipcm6_cookie) {
365		.hlimit = -1,
366		.tclass = np->tclass,
367		.dontfrag = np->dontfrag,
368	};
369}
370
371static inline struct ipv6_txoptions *txopt_get(const struct ipv6_pinfo *np)
372{
373	struct ipv6_txoptions *opt;
374
375	rcu_read_lock();
376	opt = rcu_dereference(np->opt);
377	if (opt) {
378		if (!refcount_inc_not_zero(&opt->refcnt))
379			opt = NULL;
380		else
381			opt = rcu_pointer_handoff(opt);
382	}
383	rcu_read_unlock();
384	return opt;
385}
386
387static inline void txopt_put(struct ipv6_txoptions *opt)
388{
389	if (opt && refcount_dec_and_test(&opt->refcnt))
390		kfree_rcu(opt, rcu);
391}
392
393#if IS_ENABLED(CONFIG_IPV6)
394struct ip6_flowlabel *__fl6_sock_lookup(struct sock *sk, __be32 label);
395
396extern struct static_key_false_deferred ipv6_flowlabel_exclusive;
397static inline struct ip6_flowlabel *fl6_sock_lookup(struct sock *sk,
398						    __be32 label)
399{
400	if (static_branch_unlikely(&ipv6_flowlabel_exclusive.key) &&
401	    READ_ONCE(sock_net(sk)->ipv6.flowlabel_has_excl))
402		return __fl6_sock_lookup(sk, label) ? : ERR_PTR(-ENOENT);
403
404	return NULL;
405}
406#endif
407
408struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions *opt_space,
409					 struct ip6_flowlabel *fl,
410					 struct ipv6_txoptions *fopt);
411void fl6_free_socklist(struct sock *sk);
412int ipv6_flowlabel_opt(struct sock *sk, sockptr_t optval, int optlen);
413int ipv6_flowlabel_opt_get(struct sock *sk, struct in6_flowlabel_req *freq,
414			   int flags);
415int ip6_flowlabel_init(void);
416void ip6_flowlabel_cleanup(void);
417bool ip6_autoflowlabel(struct net *net, const struct ipv6_pinfo *np);
418
419static inline void fl6_sock_release(struct ip6_flowlabel *fl)
420{
421	if (fl)
422		atomic_dec(&fl->users);
423}
424
425void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info);
426
427void icmpv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6,
428				struct icmp6hdr *thdr, int len);
429
430int ip6_ra_control(struct sock *sk, int sel);
431
432int ipv6_parse_hopopts(struct sk_buff *skb);
433
434struct ipv6_txoptions *ipv6_dup_options(struct sock *sk,
435					struct ipv6_txoptions *opt);
436struct ipv6_txoptions *ipv6_renew_options(struct sock *sk,
437					  struct ipv6_txoptions *opt,
438					  int newtype,
439					  struct ipv6_opt_hdr *newopt);
440struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space,
441					  struct ipv6_txoptions *opt);
442
443bool ipv6_opt_accepted(const struct sock *sk, const struct sk_buff *skb,
444		       const struct inet6_skb_parm *opt);
445struct ipv6_txoptions *ipv6_update_options(struct sock *sk,
446					   struct ipv6_txoptions *opt);
447
448static inline bool ipv6_accept_ra(struct inet6_dev *idev)
449{
450	/* If forwarding is enabled, RA are not accepted unless the special
451	 * hybrid mode (accept_ra=2) is enabled.
452	 */
453	return idev->cnf.forwarding ? idev->cnf.accept_ra == 2 :
454	    idev->cnf.accept_ra;
455}
456
457#define IPV6_FRAG_HIGH_THRESH	(4 * 1024*1024)	/* 4194304 */
458#define IPV6_FRAG_LOW_THRESH	(3 * 1024*1024)	/* 3145728 */
459#define IPV6_FRAG_TIMEOUT	(60 * HZ)	/* 60 seconds */
460
461int __ipv6_addr_type(const struct in6_addr *addr);
462static inline int ipv6_addr_type(const struct in6_addr *addr)
463{
464	return __ipv6_addr_type(addr) & 0xffff;
465}
466
467static inline int ipv6_addr_scope(const struct in6_addr *addr)
468{
469	return __ipv6_addr_type(addr) & IPV6_ADDR_SCOPE_MASK;
470}
471
472static inline int __ipv6_addr_src_scope(int type)
473{
474	return (type == IPV6_ADDR_ANY) ? __IPV6_ADDR_SCOPE_INVALID : (type >> 16);
475}
476
477static inline int ipv6_addr_src_scope(const struct in6_addr *addr)
478{
479	return __ipv6_addr_src_scope(__ipv6_addr_type(addr));
480}
481
482static inline bool __ipv6_addr_needs_scope_id(int type)
483{
484	return type & IPV6_ADDR_LINKLOCAL ||
485	       (type & IPV6_ADDR_MULTICAST &&
486		(type & (IPV6_ADDR_LOOPBACK|IPV6_ADDR_LINKLOCAL)));
487}
488
489static inline __u32 ipv6_iface_scope_id(const struct in6_addr *addr, int iface)
490{
491	return __ipv6_addr_needs_scope_id(__ipv6_addr_type(addr)) ? iface : 0;
492}
493
494static inline int ipv6_addr_cmp(const struct in6_addr *a1, const struct in6_addr *a2)
495{
496	return memcmp(a1, a2, sizeof(struct in6_addr));
497}
498
499static inline bool
500ipv6_masked_addr_cmp(const struct in6_addr *a1, const struct in6_addr *m,
501		     const struct in6_addr *a2)
502{
503#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
504	const unsigned long *ul1 = (const unsigned long *)a1;
505	const unsigned long *ulm = (const unsigned long *)m;
506	const unsigned long *ul2 = (const unsigned long *)a2;
507
508	return !!(((ul1[0] ^ ul2[0]) & ulm[0]) |
509		  ((ul1[1] ^ ul2[1]) & ulm[1]));
510#else
511	return !!(((a1->s6_addr32[0] ^ a2->s6_addr32[0]) & m->s6_addr32[0]) |
512		  ((a1->s6_addr32[1] ^ a2->s6_addr32[1]) & m->s6_addr32[1]) |
513		  ((a1->s6_addr32[2] ^ a2->s6_addr32[2]) & m->s6_addr32[2]) |
514		  ((a1->s6_addr32[3] ^ a2->s6_addr32[3]) & m->s6_addr32[3]));
515#endif
516}
517
518static inline void ipv6_addr_prefix(struct in6_addr *pfx,
519				    const struct in6_addr *addr,
520				    int plen)
521{
522	/* caller must guarantee 0 <= plen <= 128 */
523	int o = plen >> 3,
524	    b = plen & 0x7;
525
526	memset(pfx->s6_addr, 0, sizeof(pfx->s6_addr));
527	memcpy(pfx->s6_addr, addr, o);
528	if (b != 0)
529		pfx->s6_addr[o] = addr->s6_addr[o] & (0xff00 >> b);
530}
531
532static inline void ipv6_addr_prefix_copy(struct in6_addr *addr,
533					 const struct in6_addr *pfx,
534					 int plen)
535{
536	/* caller must guarantee 0 <= plen <= 128 */
537	int o = plen >> 3,
538	    b = plen & 0x7;
539
540	memcpy(addr->s6_addr, pfx, o);
541	if (b != 0) {
542		addr->s6_addr[o] &= ~(0xff00 >> b);
543		addr->s6_addr[o] |= (pfx->s6_addr[o] & (0xff00 >> b));
544	}
545}
546
547static inline void __ipv6_addr_set_half(__be32 *addr,
548					__be32 wh, __be32 wl)
549{
550#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
551#if defined(__BIG_ENDIAN)
552	if (__builtin_constant_p(wh) && __builtin_constant_p(wl)) {
553		*(__force u64 *)addr = ((__force u64)(wh) << 32 | (__force u64)(wl));
554		return;
555	}
556#elif defined(__LITTLE_ENDIAN)
557	if (__builtin_constant_p(wl) && __builtin_constant_p(wh)) {
558		*(__force u64 *)addr = ((__force u64)(wl) << 32 | (__force u64)(wh));
559		return;
560	}
561#endif
562#endif
563	addr[0] = wh;
564	addr[1] = wl;
565}
566
567static inline void ipv6_addr_set(struct in6_addr *addr,
568				     __be32 w1, __be32 w2,
569				     __be32 w3, __be32 w4)
570{
571	__ipv6_addr_set_half(&addr->s6_addr32[0], w1, w2);
572	__ipv6_addr_set_half(&addr->s6_addr32[2], w3, w4);
573}
574
575static inline bool ipv6_addr_equal(const struct in6_addr *a1,
576				   const struct in6_addr *a2)
577{
578#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
579	const unsigned long *ul1 = (const unsigned long *)a1;
580	const unsigned long *ul2 = (const unsigned long *)a2;
581
582	return ((ul1[0] ^ ul2[0]) | (ul1[1] ^ ul2[1])) == 0UL;
583#else
584	return ((a1->s6_addr32[0] ^ a2->s6_addr32[0]) |
585		(a1->s6_addr32[1] ^ a2->s6_addr32[1]) |
586		(a1->s6_addr32[2] ^ a2->s6_addr32[2]) |
587		(a1->s6_addr32[3] ^ a2->s6_addr32[3])) == 0;
588#endif
589}
590
591#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
592static inline bool __ipv6_prefix_equal64_half(const __be64 *a1,
593					      const __be64 *a2,
594					      unsigned int len)
595{
596	if (len && ((*a1 ^ *a2) & cpu_to_be64((~0UL) << (64 - len))))
597		return false;
598	return true;
599}
600
601static inline bool ipv6_prefix_equal(const struct in6_addr *addr1,
602				     const struct in6_addr *addr2,
603				     unsigned int prefixlen)
604{
605	const __be64 *a1 = (const __be64 *)addr1;
606	const __be64 *a2 = (const __be64 *)addr2;
607
608	if (prefixlen >= 64) {
609		if (a1[0] ^ a2[0])
610			return false;
611		return __ipv6_prefix_equal64_half(a1 + 1, a2 + 1, prefixlen - 64);
612	}
613	return __ipv6_prefix_equal64_half(a1, a2, prefixlen);
614}
615#else
616static inline bool ipv6_prefix_equal(const struct in6_addr *addr1,
617				     const struct in6_addr *addr2,
618				     unsigned int prefixlen)
619{
620	const __be32 *a1 = addr1->s6_addr32;
621	const __be32 *a2 = addr2->s6_addr32;
622	unsigned int pdw, pbi;
623
624	/* check complete u32 in prefix */
625	pdw = prefixlen >> 5;
626	if (pdw && memcmp(a1, a2, pdw << 2))
627		return false;
628
629	/* check incomplete u32 in prefix */
630	pbi = prefixlen & 0x1f;
631	if (pbi && ((a1[pdw] ^ a2[pdw]) & htonl((0xffffffff) << (32 - pbi))))
632		return false;
633
634	return true;
635}
636#endif
637
638static inline bool ipv6_addr_any(const struct in6_addr *a)
639{
640#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
641	const unsigned long *ul = (const unsigned long *)a;
642
643	return (ul[0] | ul[1]) == 0UL;
644#else
645	return (a->s6_addr32[0] | a->s6_addr32[1] |
646		a->s6_addr32[2] | a->s6_addr32[3]) == 0;
647#endif
648}
649
650static inline u32 ipv6_addr_hash(const struct in6_addr *a)
651{
652#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
653	const unsigned long *ul = (const unsigned long *)a;
654	unsigned long x = ul[0] ^ ul[1];
655
656	return (u32)(x ^ (x >> 32));
657#else
658	return (__force u32)(a->s6_addr32[0] ^ a->s6_addr32[1] ^
659			     a->s6_addr32[2] ^ a->s6_addr32[3]);
660#endif
661}
662
663/* more secured version of ipv6_addr_hash() */
664static inline u32 __ipv6_addr_jhash(const struct in6_addr *a, const u32 initval)
665{
666	return jhash2((__force const u32 *)a->s6_addr32,
667		      ARRAY_SIZE(a->s6_addr32), initval);
668}
669
670static inline bool ipv6_addr_loopback(const struct in6_addr *a)
671{
672#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
673	const __be64 *be = (const __be64 *)a;
674
675	return (be[0] | (be[1] ^ cpu_to_be64(1))) == 0UL;
676#else
677	return (a->s6_addr32[0] | a->s6_addr32[1] |
678		a->s6_addr32[2] | (a->s6_addr32[3] ^ cpu_to_be32(1))) == 0;
679#endif
680}
681
682/*
683 * Note that we must __force cast these to unsigned long to make sparse happy,
684 * since all of the endian-annotated types are fixed size regardless of arch.
685 */
686static inline bool ipv6_addr_v4mapped(const struct in6_addr *a)
687{
688	return (
689#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
690		*(unsigned long *)a |
691#else
692		(__force unsigned long)(a->s6_addr32[0] | a->s6_addr32[1]) |
693#endif
694		(__force unsigned long)(a->s6_addr32[2] ^
695					cpu_to_be32(0x0000ffff))) == 0UL;
696}
697
698static inline bool ipv6_addr_v4mapped_loopback(const struct in6_addr *a)
699{
700	return ipv6_addr_v4mapped(a) && ipv4_is_loopback(a->s6_addr32[3]);
701}
702
703static inline u32 ipv6_portaddr_hash(const struct net *net,
704				     const struct in6_addr *addr6,
705				     unsigned int port)
706{
707	unsigned int hash, mix = net_hash_mix(net);
708
709	if (ipv6_addr_any(addr6))
710		hash = jhash_1word(0, mix);
711	else if (ipv6_addr_v4mapped(addr6))
712		hash = jhash_1word((__force u32)addr6->s6_addr32[3], mix);
713	else
714		hash = jhash2((__force u32 *)addr6->s6_addr32, 4, mix);
715
716	return hash ^ port;
717}
718
719/*
720 * Check for a RFC 4843 ORCHID address
721 * (Overlay Routable Cryptographic Hash Identifiers)
722 */
723static inline bool ipv6_addr_orchid(const struct in6_addr *a)
724{
725	return (a->s6_addr32[0] & htonl(0xfffffff0)) == htonl(0x20010010);
726}
727
728static inline bool ipv6_addr_is_multicast(const struct in6_addr *addr)
729{
730	return (addr->s6_addr32[0] & htonl(0xFF000000)) == htonl(0xFF000000);
731}
732
733static inline void ipv6_addr_set_v4mapped(const __be32 addr,
734					  struct in6_addr *v4mapped)
735{
736	ipv6_addr_set(v4mapped,
737			0, 0,
738			htonl(0x0000FFFF),
739			addr);
740}
741
742/*
743 * find the first different bit between two addresses
744 * length of address must be a multiple of 32bits
745 */
746static inline int __ipv6_addr_diff32(const void *token1, const void *token2, int addrlen)
747{
748	const __be32 *a1 = token1, *a2 = token2;
749	int i;
750
751	addrlen >>= 2;
752
753	for (i = 0; i < addrlen; i++) {
754		__be32 xb = a1[i] ^ a2[i];
755		if (xb)
756			return i * 32 + 31 - __fls(ntohl(xb));
757	}
758
759	/*
760	 *	we should *never* get to this point since that
761	 *	would mean the addrs are equal
762	 *
763	 *	However, we do get to it 8) And exacly, when
764	 *	addresses are equal 8)
765	 *
766	 *	ip route add 1111::/128 via ...
767	 *	ip route add 1111::/64 via ...
768	 *	and we are here.
769	 *
770	 *	Ideally, this function should stop comparison
771	 *	at prefix length. It does not, but it is still OK,
772	 *	if returned value is greater than prefix length.
773	 *					--ANK (980803)
774	 */
775	return addrlen << 5;
776}
777
778#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
779static inline int __ipv6_addr_diff64(const void *token1, const void *token2, int addrlen)
780{
781	const __be64 *a1 = token1, *a2 = token2;
782	int i;
783
784	addrlen >>= 3;
785
786	for (i = 0; i < addrlen; i++) {
787		__be64 xb = a1[i] ^ a2[i];
788		if (xb)
789			return i * 64 + 63 - __fls(be64_to_cpu(xb));
790	}
791
792	return addrlen << 6;
793}
794#endif
795
796static inline int __ipv6_addr_diff(const void *token1, const void *token2, int addrlen)
797{
798#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
799	if (__builtin_constant_p(addrlen) && !(addrlen & 7))
800		return __ipv6_addr_diff64(token1, token2, addrlen);
801#endif
802	return __ipv6_addr_diff32(token1, token2, addrlen);
803}
804
805static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_addr *a2)
806{
807	return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr));
808}
809
810__be32 ipv6_select_ident(struct net *net,
811			 const struct in6_addr *daddr,
812			 const struct in6_addr *saddr);
813__be32 ipv6_proxy_select_ident(struct net *net, struct sk_buff *skb);
814
815int ip6_dst_hoplimit(struct dst_entry *dst);
816
817static inline int ip6_sk_dst_hoplimit(struct ipv6_pinfo *np, struct flowi6 *fl6,
818				      struct dst_entry *dst)
819{
820	int hlimit;
821
822	if (ipv6_addr_is_multicast(&fl6->daddr))
823		hlimit = np->mcast_hops;
824	else
825		hlimit = np->hop_limit;
826	if (hlimit < 0)
827		hlimit = ip6_dst_hoplimit(dst);
828	return hlimit;
829}
830
831/* copy IPv6 saddr & daddr to flow_keys, possibly using 64bit load/store
832 * Equivalent to :	flow->v6addrs.src = iph->saddr;
833 *			flow->v6addrs.dst = iph->daddr;
834 */
835static inline void iph_to_flow_copy_v6addrs(struct flow_keys *flow,
836					    const struct ipv6hdr *iph)
837{
838	BUILD_BUG_ON(offsetof(typeof(flow->addrs), v6addrs.dst) !=
839		     offsetof(typeof(flow->addrs), v6addrs.src) +
840		     sizeof(flow->addrs.v6addrs.src));
841	memcpy(&flow->addrs.v6addrs, &iph->addrs, sizeof(flow->addrs.v6addrs));
842	flow->control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
843}
844
845#if IS_ENABLED(CONFIG_IPV6)
846
847static inline bool ipv6_can_nonlocal_bind(struct net *net,
848					  struct inet_sock *inet)
849{
850	return net->ipv6.sysctl.ip_nonlocal_bind ||
851		inet->freebind || inet->transparent;
852}
853
854/* Sysctl settings for net ipv6.auto_flowlabels */
855#define IP6_AUTO_FLOW_LABEL_OFF		0
856#define IP6_AUTO_FLOW_LABEL_OPTOUT	1
857#define IP6_AUTO_FLOW_LABEL_OPTIN	2
858#define IP6_AUTO_FLOW_LABEL_FORCED	3
859
860#define IP6_AUTO_FLOW_LABEL_MAX		IP6_AUTO_FLOW_LABEL_FORCED
861
862#define IP6_DEFAULT_AUTO_FLOW_LABELS	IP6_AUTO_FLOW_LABEL_OPTOUT
863
864static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb,
865					__be32 flowlabel, bool autolabel,
866					struct flowi6 *fl6)
867{
868	u32 hash;
869
870	/* @flowlabel may include more than a flow label, eg, the traffic class.
871	 * Here we want only the flow label value.
872	 */
873	flowlabel &= IPV6_FLOWLABEL_MASK;
874
875	if (flowlabel ||
876	    net->ipv6.sysctl.auto_flowlabels == IP6_AUTO_FLOW_LABEL_OFF ||
877	    (!autolabel &&
878	     net->ipv6.sysctl.auto_flowlabels != IP6_AUTO_FLOW_LABEL_FORCED))
879		return flowlabel;
880
881	hash = skb_get_hash_flowi6(skb, fl6);
882
883	/* Since this is being sent on the wire obfuscate hash a bit
884	 * to minimize possbility that any useful information to an
885	 * attacker is leaked. Only lower 20 bits are relevant.
886	 */
887	hash = rol32(hash, 16);
888
889	flowlabel = (__force __be32)hash & IPV6_FLOWLABEL_MASK;
890
891	if (net->ipv6.sysctl.flowlabel_state_ranges)
892		flowlabel |= IPV6_FLOWLABEL_STATELESS_FLAG;
893
894	return flowlabel;
895}
896
897static inline int ip6_default_np_autolabel(struct net *net)
898{
899	switch (net->ipv6.sysctl.auto_flowlabels) {
900	case IP6_AUTO_FLOW_LABEL_OFF:
901	case IP6_AUTO_FLOW_LABEL_OPTIN:
902	default:
903		return 0;
904	case IP6_AUTO_FLOW_LABEL_OPTOUT:
905	case IP6_AUTO_FLOW_LABEL_FORCED:
906		return 1;
907	}
908}
909#else
910static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb,
911					__be32 flowlabel, bool autolabel,
912					struct flowi6 *fl6)
913{
914	return flowlabel;
915}
916static inline int ip6_default_np_autolabel(struct net *net)
917{
918	return 0;
919}
920#endif
921
922#if IS_ENABLED(CONFIG_IPV6)
923static inline int ip6_multipath_hash_policy(const struct net *net)
924{
925	return net->ipv6.sysctl.multipath_hash_policy;
926}
927#else
928static inline int ip6_multipath_hash_policy(const struct net *net)
929{
930	return 0;
931}
932#endif
933
934/*
935 *	Header manipulation
936 */
937static inline void ip6_flow_hdr(struct ipv6hdr *hdr, unsigned int tclass,
938				__be32 flowlabel)
939{
940	*(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | flowlabel;
941}
942
943static inline __be32 ip6_flowinfo(const struct ipv6hdr *hdr)
944{
945	return *(__be32 *)hdr & IPV6_FLOWINFO_MASK;
946}
947
948static inline __be32 ip6_flowlabel(const struct ipv6hdr *hdr)
949{
950	return *(__be32 *)hdr & IPV6_FLOWLABEL_MASK;
951}
952
953static inline u8 ip6_tclass(__be32 flowinfo)
954{
955	return ntohl(flowinfo & IPV6_TCLASS_MASK) >> IPV6_TCLASS_SHIFT;
956}
957
958static inline __be32 ip6_make_flowinfo(unsigned int tclass, __be32 flowlabel)
959{
960	return htonl(tclass << IPV6_TCLASS_SHIFT) | flowlabel;
961}
962
963static inline __be32 flowi6_get_flowlabel(const struct flowi6 *fl6)
964{
965	return fl6->flowlabel & IPV6_FLOWLABEL_MASK;
966}
967
968/*
969 *	Prototypes exported by ipv6
970 */
971
972/*
973 *	rcv function (called from netdevice level)
974 */
975
976int ipv6_rcv(struct sk_buff *skb, struct net_device *dev,
977	     struct packet_type *pt, struct net_device *orig_dev);
978void ipv6_list_rcv(struct list_head *head, struct packet_type *pt,
979		   struct net_device *orig_dev);
980
981int ip6_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb);
982
983/*
984 *	upper-layer output functions
985 */
986int ip6_xmit(const struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
987	     __u32 mark, struct ipv6_txoptions *opt, int tclass, u32 priority);
988
989int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr);
990
991int ip6_append_data(struct sock *sk,
992		    int getfrag(void *from, char *to, int offset, int len,
993				int odd, struct sk_buff *skb),
994		    void *from, int length, int transhdrlen,
995		    struct ipcm6_cookie *ipc6, struct flowi6 *fl6,
996		    struct rt6_info *rt, unsigned int flags);
997
998int ip6_push_pending_frames(struct sock *sk);
999
1000void ip6_flush_pending_frames(struct sock *sk);
1001
1002int ip6_send_skb(struct sk_buff *skb);
1003
1004struct sk_buff *__ip6_make_skb(struct sock *sk, struct sk_buff_head *queue,
1005			       struct inet_cork_full *cork,
1006			       struct inet6_cork *v6_cork);
1007struct sk_buff *ip6_make_skb(struct sock *sk,
1008			     int getfrag(void *from, char *to, int offset,
1009					 int len, int odd, struct sk_buff *skb),
1010			     void *from, int length, int transhdrlen,
1011			     struct ipcm6_cookie *ipc6, struct flowi6 *fl6,
1012			     struct rt6_info *rt, unsigned int flags,
1013			     struct inet_cork_full *cork);
1014
1015static inline struct sk_buff *ip6_finish_skb(struct sock *sk)
1016{
1017	return __ip6_make_skb(sk, &sk->sk_write_queue, &inet_sk(sk)->cork,
1018			      &inet6_sk(sk)->cork);
1019}
1020
1021int ip6_dst_lookup(struct net *net, struct sock *sk, struct dst_entry **dst,
1022		   struct flowi6 *fl6);
1023struct dst_entry *ip6_dst_lookup_flow(struct net *net, const struct sock *sk, struct flowi6 *fl6,
1024				      const struct in6_addr *final_dst);
1025struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
1026					 const struct in6_addr *final_dst,
1027					 bool connected);
1028struct dst_entry *ip6_dst_lookup_tunnel(struct sk_buff *skb,
1029					struct net_device *dev,
1030					struct net *net, struct socket *sock,
1031					struct in6_addr *saddr,
1032					const struct ip_tunnel_info *info,
1033					u8 protocol, bool use_cache);
1034struct dst_entry *ip6_blackhole_route(struct net *net,
1035				      struct dst_entry *orig_dst);
1036
1037/*
1038 *	skb processing functions
1039 */
1040
1041int ip6_output(struct net *net, struct sock *sk, struct sk_buff *skb);
1042int ip6_forward(struct sk_buff *skb);
1043int ip6_input(struct sk_buff *skb);
1044int ip6_mc_input(struct sk_buff *skb);
1045void ip6_protocol_deliver_rcu(struct net *net, struct sk_buff *skb, int nexthdr,
1046			      bool have_final);
1047
1048int __ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
1049int ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
1050
1051/*
1052 *	Extension header (options) processing
1053 */
1054
1055void ipv6_push_nfrag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt,
1056			  u8 *proto, struct in6_addr **daddr_p,
1057			  struct in6_addr *saddr);
1058void ipv6_push_frag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt,
1059			 u8 *proto);
1060
1061int ipv6_skip_exthdr(const struct sk_buff *, int start, u8 *nexthdrp,
1062		     __be16 *frag_offp);
1063
1064bool ipv6_ext_hdr(u8 nexthdr);
1065
1066enum {
1067	IP6_FH_F_FRAG		= (1 << 0),
1068	IP6_FH_F_AUTH		= (1 << 1),
1069	IP6_FH_F_SKIP_RH	= (1 << 2),
1070};
1071
1072/* find specified header and get offset to it */
1073int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, int target,
1074		  unsigned short *fragoff, int *fragflg);
1075
1076int ipv6_find_tlv(const struct sk_buff *skb, int offset, int type);
1077
1078struct in6_addr *fl6_update_dst(struct flowi6 *fl6,
1079				const struct ipv6_txoptions *opt,
1080				struct in6_addr *orig);
1081
1082/*
1083 *	socket options (ipv6_sockglue.c)
1084 */
1085
1086int ipv6_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
1087		    unsigned int optlen);
1088int ipv6_getsockopt(struct sock *sk, int level, int optname,
1089		    char __user *optval, int __user *optlen);
1090
1091int __ip6_datagram_connect(struct sock *sk, struct sockaddr *addr,
1092			   int addr_len);
1093int ip6_datagram_connect(struct sock *sk, struct sockaddr *addr, int addr_len);
1094int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *addr,
1095				 int addr_len);
1096int ip6_datagram_dst_update(struct sock *sk, bool fix_sk_saddr);
1097void ip6_datagram_release_cb(struct sock *sk);
1098
1099int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len,
1100		    int *addr_len);
1101int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len,
1102		     int *addr_len);
1103void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port,
1104		     u32 info, u8 *payload);
1105void ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info);
1106void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu);
1107
1108void inet6_cleanup_sock(struct sock *sk);
1109void inet6_sock_destruct(struct sock *sk);
1110int inet6_release(struct socket *sock);
1111int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len);
1112int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
1113		  int peer);
1114int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
1115int inet6_compat_ioctl(struct socket *sock, unsigned int cmd,
1116		unsigned long arg);
1117
1118int inet6_hash_connect(struct inet_timewait_death_row *death_row,
1119			      struct sock *sk);
1120int inet6_sendmsg(struct socket *sock, struct msghdr *msg, size_t size);
1121int inet6_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
1122		  int flags);
1123
1124/*
1125 * reassembly.c
1126 */
1127extern const struct proto_ops inet6_stream_ops;
1128extern const struct proto_ops inet6_dgram_ops;
1129extern const struct proto_ops inet6_sockraw_ops;
1130
1131struct group_source_req;
1132struct group_filter;
1133
1134int ip6_mc_source(int add, int omode, struct sock *sk,
1135		  struct group_source_req *pgsr);
1136int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf,
1137		  struct sockaddr_storage *list);
1138int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf,
1139		  struct sockaddr_storage __user *p);
1140
1141#ifdef CONFIG_PROC_FS
1142int ac6_proc_init(struct net *net);
1143void ac6_proc_exit(struct net *net);
1144int raw6_proc_init(void);
1145void raw6_proc_exit(void);
1146int tcp6_proc_init(struct net *net);
1147void tcp6_proc_exit(struct net *net);
1148int udp6_proc_init(struct net *net);
1149void udp6_proc_exit(struct net *net);
1150int udplite6_proc_init(void);
1151void udplite6_proc_exit(void);
1152int ipv6_misc_proc_init(void);
1153void ipv6_misc_proc_exit(void);
1154int snmp6_register_dev(struct inet6_dev *idev);
1155int snmp6_unregister_dev(struct inet6_dev *idev);
1156
1157#else
1158static inline int ac6_proc_init(struct net *net) { return 0; }
1159static inline void ac6_proc_exit(struct net *net) { }
1160static inline int snmp6_register_dev(struct inet6_dev *idev) { return 0; }
1161static inline int snmp6_unregister_dev(struct inet6_dev *idev) { return 0; }
1162#endif
1163
1164#ifdef CONFIG_SYSCTL
1165struct ctl_table *ipv6_icmp_sysctl_init(struct net *net);
1166struct ctl_table *ipv6_route_sysctl_init(struct net *net);
1167int ipv6_sysctl_register(void);
1168void ipv6_sysctl_unregister(void);
1169#endif
1170
1171int ipv6_sock_mc_join(struct sock *sk, int ifindex,
1172		      const struct in6_addr *addr);
1173int ipv6_sock_mc_join_ssm(struct sock *sk, int ifindex,
1174			  const struct in6_addr *addr, unsigned int mode);
1175int ipv6_sock_mc_drop(struct sock *sk, int ifindex,
1176		      const struct in6_addr *addr);
1177
1178static inline int ip6_sock_set_v6only(struct sock *sk)
1179{
1180	if (inet_sk(sk)->inet_num)
1181		return -EINVAL;
1182	lock_sock(sk);
1183	sk->sk_ipv6only = true;
1184	release_sock(sk);
1185	return 0;
1186}
1187
1188static inline void ip6_sock_set_recverr(struct sock *sk)
1189{
1190	lock_sock(sk);
1191	inet6_sk(sk)->recverr = true;
1192	release_sock(sk);
1193}
1194
1195static inline int __ip6_sock_set_addr_preferences(struct sock *sk, int val)
1196{
1197	unsigned int pref = 0;
1198	unsigned int prefmask = ~0;
1199
1200	/* check PUBLIC/TMP/PUBTMP_DEFAULT conflicts */
1201	switch (val & (IPV6_PREFER_SRC_PUBLIC |
1202		       IPV6_PREFER_SRC_TMP |
1203		       IPV6_PREFER_SRC_PUBTMP_DEFAULT)) {
1204	case IPV6_PREFER_SRC_PUBLIC:
1205		pref |= IPV6_PREFER_SRC_PUBLIC;
1206		prefmask &= ~(IPV6_PREFER_SRC_PUBLIC |
1207			      IPV6_PREFER_SRC_TMP);
1208		break;
1209	case IPV6_PREFER_SRC_TMP:
1210		pref |= IPV6_PREFER_SRC_TMP;
1211		prefmask &= ~(IPV6_PREFER_SRC_PUBLIC |
1212			      IPV6_PREFER_SRC_TMP);
1213		break;
1214	case IPV6_PREFER_SRC_PUBTMP_DEFAULT:
1215		prefmask &= ~(IPV6_PREFER_SRC_PUBLIC |
1216			      IPV6_PREFER_SRC_TMP);
1217		break;
1218	case 0:
1219		break;
1220	default:
1221		return -EINVAL;
1222	}
1223
1224	/* check HOME/COA conflicts */
1225	switch (val & (IPV6_PREFER_SRC_HOME | IPV6_PREFER_SRC_COA)) {
1226	case IPV6_PREFER_SRC_HOME:
1227		prefmask &= ~IPV6_PREFER_SRC_COA;
1228		break;
1229	case IPV6_PREFER_SRC_COA:
1230		pref |= IPV6_PREFER_SRC_COA;
1231		break;
1232	case 0:
1233		break;
1234	default:
1235		return -EINVAL;
1236	}
1237
1238	/* check CGA/NONCGA conflicts */
1239	switch (val & (IPV6_PREFER_SRC_CGA|IPV6_PREFER_SRC_NONCGA)) {
1240	case IPV6_PREFER_SRC_CGA:
1241	case IPV6_PREFER_SRC_NONCGA:
1242	case 0:
1243		break;
1244	default:
1245		return -EINVAL;
1246	}
1247
1248	inet6_sk(sk)->srcprefs = (inet6_sk(sk)->srcprefs & prefmask) | pref;
1249	return 0;
1250}
1251
1252static inline int ip6_sock_set_addr_preferences(struct sock *sk, int val)
1253{
1254	int ret;
1255
1256	lock_sock(sk);
1257	ret = __ip6_sock_set_addr_preferences(sk, val);
1258	release_sock(sk);
1259	return ret;
1260}
1261
1262static inline void ip6_sock_set_recvpktinfo(struct sock *sk)
1263{
1264	lock_sock(sk);
1265	inet6_sk(sk)->rxopt.bits.rxinfo = true;
1266	release_sock(sk);
1267}
1268
1269#endif /* _NET_IPV6_H */
1270