1/*
2 *	common UDP/RAW code
3 *	Linux INET6 implementation
4 *
5 *	Authors:
6 *	Pedro Roque		<roque@di.fc.ul.pt>
7 *
8 *	This program is free software; you can redistribute it and/or
9 *      modify it under the terms of the GNU General Public License
10 *      as published by the Free Software Foundation; either version
11 *      2 of the License, or (at your option) any later version.
12 */
13
14#include <linux/capability.h>
15#include <linux/errno.h>
16#include <linux/types.h>
17#include <linux/kernel.h>
18#include <linux/interrupt.h>
19#include <linux/socket.h>
20#include <linux/sockios.h>
21#include <linux/in6.h>
22#include <linux/ipv6.h>
23#include <linux/route.h>
24#include <linux/slab.h>
25#include <linux/export.h>
26
27#include <net/ipv6.h>
28#include <net/ndisc.h>
29#include <net/addrconf.h>
30#include <net/transp_v6.h>
31#include <net/ip6_route.h>
32#include <net/tcp_states.h>
33#include <net/dsfield.h>
34
35#include <linux/errqueue.h>
36#include <asm/uaccess.h>
37
38static bool ipv6_mapped_addr_any(const struct in6_addr *a)
39{
40	return ipv6_addr_v4mapped(a) && (a->s6_addr32[3] == 0);
41}
42
43static int __ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
44{
45	struct sockaddr_in6	*usin = (struct sockaddr_in6 *) uaddr;
46	struct inet_sock	*inet = inet_sk(sk);
47	struct ipv6_pinfo	*np = inet6_sk(sk);
48	struct in6_addr	*daddr, *final_p, final;
49	struct dst_entry	*dst;
50	struct flowi6		fl6;
51	struct ip6_flowlabel	*flowlabel = NULL;
52	struct ipv6_txoptions	*opt;
53	int			addr_type;
54	int			err;
55
56	if (usin->sin6_family == AF_INET) {
57		if (__ipv6_only_sock(sk))
58			return -EAFNOSUPPORT;
59		err = __ip4_datagram_connect(sk, uaddr, addr_len);
60		goto ipv4_connected;
61	}
62
63	if (addr_len < SIN6_LEN_RFC2133)
64		return -EINVAL;
65
66	if (usin->sin6_family != AF_INET6)
67		return -EAFNOSUPPORT;
68
69	memset(&fl6, 0, sizeof(fl6));
70	if (np->sndflow) {
71		fl6.flowlabel = usin->sin6_flowinfo&IPV6_FLOWINFO_MASK;
72		if (fl6.flowlabel&IPV6_FLOWLABEL_MASK) {
73			flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);
74			if (!flowlabel)
75				return -EINVAL;
76		}
77	}
78
79	addr_type = ipv6_addr_type(&usin->sin6_addr);
80
81	if (addr_type == IPV6_ADDR_ANY) {
82		/*
83		 *	connect to self
84		 */
85		usin->sin6_addr.s6_addr[15] = 0x01;
86	}
87
88	daddr = &usin->sin6_addr;
89
90	if (addr_type == IPV6_ADDR_MAPPED) {
91		struct sockaddr_in sin;
92
93		if (__ipv6_only_sock(sk)) {
94			err = -ENETUNREACH;
95			goto out;
96		}
97		sin.sin_family = AF_INET;
98		sin.sin_addr.s_addr = daddr->s6_addr32[3];
99		sin.sin_port = usin->sin6_port;
100
101		err = __ip4_datagram_connect(sk,
102					     (struct sockaddr *) &sin,
103					     sizeof(sin));
104
105ipv4_connected:
106		if (err)
107			goto out;
108
109		ipv6_addr_set_v4mapped(inet->inet_daddr, &sk->sk_v6_daddr);
110
111		if (ipv6_addr_any(&np->saddr) ||
112		    ipv6_mapped_addr_any(&np->saddr))
113			ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr);
114
115		if (ipv6_addr_any(&sk->sk_v6_rcv_saddr) ||
116		    ipv6_mapped_addr_any(&sk->sk_v6_rcv_saddr)) {
117			ipv6_addr_set_v4mapped(inet->inet_rcv_saddr,
118					       &sk->sk_v6_rcv_saddr);
119			if (sk->sk_prot->rehash)
120				sk->sk_prot->rehash(sk);
121		}
122
123		goto out;
124	}
125
126	if (__ipv6_addr_needs_scope_id(addr_type)) {
127		if (addr_len >= sizeof(struct sockaddr_in6) &&
128		    usin->sin6_scope_id) {
129			if (sk->sk_bound_dev_if &&
130			    sk->sk_bound_dev_if != usin->sin6_scope_id) {
131				err = -EINVAL;
132				goto out;
133			}
134			sk->sk_bound_dev_if = usin->sin6_scope_id;
135		}
136
137		if (!sk->sk_bound_dev_if && (addr_type & IPV6_ADDR_MULTICAST))
138			sk->sk_bound_dev_if = np->mcast_oif;
139
140		/* Connect to link-local address requires an interface */
141		if (!sk->sk_bound_dev_if) {
142			err = -EINVAL;
143			goto out;
144		}
145	}
146
147	sk->sk_v6_daddr = *daddr;
148	np->flow_label = fl6.flowlabel;
149
150	inet->inet_dport = usin->sin6_port;
151
152	/*
153	 *	Check for a route to destination an obtain the
154	 *	destination cache for it.
155	 */
156
157	fl6.flowi6_proto = sk->sk_protocol;
158	fl6.daddr = sk->sk_v6_daddr;
159	fl6.saddr = np->saddr;
160	fl6.flowi6_oif = sk->sk_bound_dev_if;
161	fl6.flowi6_mark = sk->sk_mark;
162	fl6.fl6_dport = inet->inet_dport;
163	fl6.fl6_sport = inet->inet_sport;
164
165	if (!fl6.flowi6_oif)
166		fl6.flowi6_oif = np->sticky_pktinfo.ipi6_ifindex;
167
168	if (!fl6.flowi6_oif && (addr_type&IPV6_ADDR_MULTICAST))
169		fl6.flowi6_oif = np->mcast_oif;
170
171	security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
172
173	rcu_read_lock();
174	opt = flowlabel ? flowlabel->opt : rcu_dereference(np->opt);
175	final_p = fl6_update_dst(&fl6, opt, &final);
176	rcu_read_unlock();
177
178	dst = ip6_dst_lookup_flow(sk, &fl6, final_p);
179	err = 0;
180	if (IS_ERR(dst)) {
181		err = PTR_ERR(dst);
182		goto out;
183	}
184
185	/* source address lookup done in ip6_dst_lookup */
186
187	if (ipv6_addr_any(&np->saddr))
188		np->saddr = fl6.saddr;
189
190	if (ipv6_addr_any(&sk->sk_v6_rcv_saddr)) {
191		sk->sk_v6_rcv_saddr = fl6.saddr;
192		inet->inet_rcv_saddr = LOOPBACK4_IPV6;
193		if (sk->sk_prot->rehash)
194			sk->sk_prot->rehash(sk);
195	}
196
197	ip6_dst_store(sk, dst,
198		      ipv6_addr_equal(&fl6.daddr, &sk->sk_v6_daddr) ?
199		      &sk->sk_v6_daddr : NULL,
200#ifdef CONFIG_IPV6_SUBTREES
201		      ipv6_addr_equal(&fl6.saddr, &np->saddr) ?
202		      &np->saddr :
203#endif
204		      NULL);
205
206	sk->sk_state = TCP_ESTABLISHED;
207	sk_set_txhash(sk);
208out:
209	fl6_sock_release(flowlabel);
210	return err;
211}
212
213int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
214{
215	int res;
216
217	lock_sock(sk);
218	res = __ip6_datagram_connect(sk, uaddr, addr_len);
219	release_sock(sk);
220	return res;
221}
222EXPORT_SYMBOL_GPL(ip6_datagram_connect);
223
224int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *uaddr,
225				 int addr_len)
226{
227	DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, uaddr);
228	if (sin6->sin6_family != AF_INET6)
229		return -EAFNOSUPPORT;
230	return ip6_datagram_connect(sk, uaddr, addr_len);
231}
232EXPORT_SYMBOL_GPL(ip6_datagram_connect_v6_only);
233
234void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
235		     __be16 port, u32 info, u8 *payload)
236{
237	struct ipv6_pinfo *np  = inet6_sk(sk);
238	struct icmp6hdr *icmph = icmp6_hdr(skb);
239	struct sock_exterr_skb *serr;
240
241	if (!np->recverr)
242		return;
243
244	skb = skb_clone(skb, GFP_ATOMIC);
245	if (!skb)
246		return;
247
248	skb->protocol = htons(ETH_P_IPV6);
249
250	serr = SKB_EXT_ERR(skb);
251	serr->ee.ee_errno = err;
252	serr->ee.ee_origin = SO_EE_ORIGIN_ICMP6;
253	serr->ee.ee_type = icmph->icmp6_type;
254	serr->ee.ee_code = icmph->icmp6_code;
255	serr->ee.ee_pad = 0;
256	serr->ee.ee_info = info;
257	serr->ee.ee_data = 0;
258	serr->addr_offset = (u8 *)&(((struct ipv6hdr *)(icmph + 1))->daddr) -
259				  skb_network_header(skb);
260	serr->port = port;
261
262	__skb_pull(skb, payload - skb->data);
263	skb_reset_transport_header(skb);
264
265	if (sock_queue_err_skb(sk, skb))
266		kfree_skb(skb);
267}
268
269void ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info)
270{
271	const struct ipv6_pinfo *np = inet6_sk(sk);
272	struct sock_exterr_skb *serr;
273	struct ipv6hdr *iph;
274	struct sk_buff *skb;
275
276	if (!np->recverr)
277		return;
278
279	skb = alloc_skb(sizeof(struct ipv6hdr), GFP_ATOMIC);
280	if (!skb)
281		return;
282
283	skb->protocol = htons(ETH_P_IPV6);
284
285	skb_put(skb, sizeof(struct ipv6hdr));
286	skb_reset_network_header(skb);
287	iph = ipv6_hdr(skb);
288	iph->daddr = fl6->daddr;
289
290	serr = SKB_EXT_ERR(skb);
291	serr->ee.ee_errno = err;
292	serr->ee.ee_origin = SO_EE_ORIGIN_LOCAL;
293	serr->ee.ee_type = 0;
294	serr->ee.ee_code = 0;
295	serr->ee.ee_pad = 0;
296	serr->ee.ee_info = info;
297	serr->ee.ee_data = 0;
298	serr->addr_offset = (u8 *)&iph->daddr - skb_network_header(skb);
299	serr->port = fl6->fl6_dport;
300
301	__skb_pull(skb, skb_tail_pointer(skb) - skb->data);
302	skb_reset_transport_header(skb);
303
304	if (sock_queue_err_skb(sk, skb))
305		kfree_skb(skb);
306}
307
308void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu)
309{
310	struct ipv6_pinfo *np = inet6_sk(sk);
311	struct ipv6hdr *iph;
312	struct sk_buff *skb;
313	struct ip6_mtuinfo *mtu_info;
314
315	if (!np->rxopt.bits.rxpmtu)
316		return;
317
318	skb = alloc_skb(sizeof(struct ipv6hdr), GFP_ATOMIC);
319	if (!skb)
320		return;
321
322	skb_put(skb, sizeof(struct ipv6hdr));
323	skb_reset_network_header(skb);
324	iph = ipv6_hdr(skb);
325	iph->daddr = fl6->daddr;
326
327	mtu_info = IP6CBMTU(skb);
328
329	mtu_info->ip6m_mtu = mtu;
330	mtu_info->ip6m_addr.sin6_family = AF_INET6;
331	mtu_info->ip6m_addr.sin6_port = 0;
332	mtu_info->ip6m_addr.sin6_flowinfo = 0;
333	mtu_info->ip6m_addr.sin6_scope_id = fl6->flowi6_oif;
334	mtu_info->ip6m_addr.sin6_addr = ipv6_hdr(skb)->daddr;
335
336	__skb_pull(skb, skb_tail_pointer(skb) - skb->data);
337	skb_reset_transport_header(skb);
338
339	skb = xchg(&np->rxpmtu, skb);
340	kfree_skb(skb);
341}
342
343/* For some errors we have valid addr_offset even with zero payload and
344 * zero port. Also, addr_offset should be supported if port is set.
345 */
346static inline bool ipv6_datagram_support_addr(struct sock_exterr_skb *serr)
347{
348	return serr->ee.ee_origin == SO_EE_ORIGIN_ICMP6 ||
349	       serr->ee.ee_origin == SO_EE_ORIGIN_ICMP ||
350	       serr->ee.ee_origin == SO_EE_ORIGIN_LOCAL || serr->port;
351}
352
353/* IPv6 supports cmsg on all origins aside from SO_EE_ORIGIN_LOCAL.
354 *
355 * At one point, excluding local errors was a quick test to identify icmp/icmp6
356 * errors. This is no longer true, but the test remained, so the v6 stack,
357 * unlike v4, also honors cmsg requests on all wifi and timestamp errors.
358 *
359 * Timestamp code paths do not initialize the fields expected by cmsg:
360 * the PKTINFO fields in skb->cb[]. Fill those in here.
361 */
362static bool ip6_datagram_support_cmsg(struct sk_buff *skb,
363				      struct sock_exterr_skb *serr)
364{
365	if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP ||
366	    serr->ee.ee_origin == SO_EE_ORIGIN_ICMP6)
367		return true;
368
369	if (serr->ee.ee_origin == SO_EE_ORIGIN_LOCAL)
370		return false;
371
372	if (!skb->dev)
373		return false;
374
375	if (skb->protocol == htons(ETH_P_IPV6))
376		IP6CB(skb)->iif = skb->dev->ifindex;
377	else
378		PKTINFO_SKB_CB(skb)->ipi_ifindex = skb->dev->ifindex;
379
380	return true;
381}
382
383/*
384 *	Handle MSG_ERRQUEUE
385 */
386int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
387{
388	struct ipv6_pinfo *np = inet6_sk(sk);
389	struct sock_exterr_skb *serr;
390	struct sk_buff *skb;
391	DECLARE_SOCKADDR(struct sockaddr_in6 *, sin, msg->msg_name);
392	struct {
393		struct sock_extended_err ee;
394		struct sockaddr_in6	 offender;
395	} errhdr;
396	int err;
397	int copied;
398
399	err = -EAGAIN;
400	skb = sock_dequeue_err_skb(sk);
401	if (!skb)
402		goto out;
403
404	copied = skb->len;
405	if (copied > len) {
406		msg->msg_flags |= MSG_TRUNC;
407		copied = len;
408	}
409	err = skb_copy_datagram_msg(skb, 0, msg, copied);
410	if (err)
411		goto out_free_skb;
412
413	sock_recv_timestamp(msg, sk, skb);
414
415	serr = SKB_EXT_ERR(skb);
416
417	if (sin && ipv6_datagram_support_addr(serr)) {
418		const unsigned char *nh = skb_network_header(skb);
419		sin->sin6_family = AF_INET6;
420		sin->sin6_flowinfo = 0;
421		sin->sin6_port = serr->port;
422		if (skb->protocol == htons(ETH_P_IPV6)) {
423			const struct ipv6hdr *ip6h = container_of((struct in6_addr *)(nh + serr->addr_offset),
424								  struct ipv6hdr, daddr);
425			sin->sin6_addr = ip6h->daddr;
426			if (np->sndflow)
427				sin->sin6_flowinfo = ip6_flowinfo(ip6h);
428			sin->sin6_scope_id =
429				ipv6_iface_scope_id(&sin->sin6_addr,
430						    IP6CB(skb)->iif);
431		} else {
432			ipv6_addr_set_v4mapped(*(__be32 *)(nh + serr->addr_offset),
433					       &sin->sin6_addr);
434			sin->sin6_scope_id = 0;
435		}
436		*addr_len = sizeof(*sin);
437	}
438
439	memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err));
440	sin = &errhdr.offender;
441	memset(sin, 0, sizeof(*sin));
442
443	if (ip6_datagram_support_cmsg(skb, serr)) {
444		sin->sin6_family = AF_INET6;
445		if (np->rxopt.all)
446			ip6_datagram_recv_common_ctl(sk, msg, skb);
447		if (skb->protocol == htons(ETH_P_IPV6)) {
448			sin->sin6_addr = ipv6_hdr(skb)->saddr;
449			if (np->rxopt.all)
450				ip6_datagram_recv_specific_ctl(sk, msg, skb);
451			sin->sin6_scope_id =
452				ipv6_iface_scope_id(&sin->sin6_addr,
453						    IP6CB(skb)->iif);
454		} else {
455			ipv6_addr_set_v4mapped(ip_hdr(skb)->saddr,
456					       &sin->sin6_addr);
457			if (inet_sk(sk)->cmsg_flags)
458				ip_cmsg_recv(msg, skb);
459		}
460	}
461
462	put_cmsg(msg, SOL_IPV6, IPV6_RECVERR, sizeof(errhdr), &errhdr);
463
464	/* Now we could try to dump offended packet options */
465
466	msg->msg_flags |= MSG_ERRQUEUE;
467	err = copied;
468
469out_free_skb:
470	kfree_skb(skb);
471out:
472	return err;
473}
474EXPORT_SYMBOL_GPL(ipv6_recv_error);
475
476/*
477 *	Handle IPV6_RECVPATHMTU
478 */
479int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len,
480		     int *addr_len)
481{
482	struct ipv6_pinfo *np = inet6_sk(sk);
483	struct sk_buff *skb;
484	struct ip6_mtuinfo mtu_info;
485	DECLARE_SOCKADDR(struct sockaddr_in6 *, sin, msg->msg_name);
486	int err;
487	int copied;
488
489	err = -EAGAIN;
490	skb = xchg(&np->rxpmtu, NULL);
491	if (!skb)
492		goto out;
493
494	copied = skb->len;
495	if (copied > len) {
496		msg->msg_flags |= MSG_TRUNC;
497		copied = len;
498	}
499	err = skb_copy_datagram_msg(skb, 0, msg, copied);
500	if (err)
501		goto out_free_skb;
502
503	sock_recv_timestamp(msg, sk, skb);
504
505	memcpy(&mtu_info, IP6CBMTU(skb), sizeof(mtu_info));
506
507	if (sin) {
508		sin->sin6_family = AF_INET6;
509		sin->sin6_flowinfo = 0;
510		sin->sin6_port = 0;
511		sin->sin6_scope_id = mtu_info.ip6m_addr.sin6_scope_id;
512		sin->sin6_addr = mtu_info.ip6m_addr.sin6_addr;
513		*addr_len = sizeof(*sin);
514	}
515
516	put_cmsg(msg, SOL_IPV6, IPV6_PATHMTU, sizeof(mtu_info), &mtu_info);
517
518	err = copied;
519
520out_free_skb:
521	kfree_skb(skb);
522out:
523	return err;
524}
525
526
527void ip6_datagram_recv_common_ctl(struct sock *sk, struct msghdr *msg,
528				 struct sk_buff *skb)
529{
530	struct ipv6_pinfo *np = inet6_sk(sk);
531	bool is_ipv6 = skb->protocol == htons(ETH_P_IPV6);
532
533	if (np->rxopt.bits.rxinfo) {
534		struct in6_pktinfo src_info;
535
536		if (is_ipv6) {
537			src_info.ipi6_ifindex = IP6CB(skb)->iif;
538			src_info.ipi6_addr = ipv6_hdr(skb)->daddr;
539		} else {
540			src_info.ipi6_ifindex =
541				PKTINFO_SKB_CB(skb)->ipi_ifindex;
542			ipv6_addr_set_v4mapped(ip_hdr(skb)->daddr,
543					       &src_info.ipi6_addr);
544		}
545
546		if (src_info.ipi6_ifindex >= 0)
547			put_cmsg(msg, SOL_IPV6, IPV6_PKTINFO,
548				 sizeof(src_info), &src_info);
549	}
550}
551
552void ip6_datagram_recv_specific_ctl(struct sock *sk, struct msghdr *msg,
553				    struct sk_buff *skb)
554{
555	struct ipv6_pinfo *np = inet6_sk(sk);
556	struct inet6_skb_parm *opt = IP6CB(skb);
557	unsigned char *nh = skb_network_header(skb);
558
559	if (np->rxopt.bits.rxhlim) {
560		int hlim = ipv6_hdr(skb)->hop_limit;
561		put_cmsg(msg, SOL_IPV6, IPV6_HOPLIMIT, sizeof(hlim), &hlim);
562	}
563
564	if (np->rxopt.bits.rxtclass) {
565		int tclass = ipv6_get_dsfield(ipv6_hdr(skb));
566		put_cmsg(msg, SOL_IPV6, IPV6_TCLASS, sizeof(tclass), &tclass);
567	}
568
569	if (np->rxopt.bits.rxflow) {
570		__be32 flowinfo = ip6_flowinfo((struct ipv6hdr *)nh);
571		if (flowinfo)
572			put_cmsg(msg, SOL_IPV6, IPV6_FLOWINFO, sizeof(flowinfo), &flowinfo);
573	}
574
575	/* HbH is allowed only once */
576	if (np->rxopt.bits.hopopts && (opt->flags & IP6SKB_HOPBYHOP)) {
577		u8 *ptr = nh + sizeof(struct ipv6hdr);
578		put_cmsg(msg, SOL_IPV6, IPV6_HOPOPTS, (ptr[1]+1)<<3, ptr);
579	}
580
581	if (opt->lastopt &&
582	    (np->rxopt.bits.dstopts || np->rxopt.bits.srcrt)) {
583		/*
584		 * Silly enough, but we need to reparse in order to
585		 * report extension headers (except for HbH)
586		 * in order.
587		 *
588		 * Also note that IPV6_RECVRTHDRDSTOPTS is NOT
589		 * (and WILL NOT be) defined because
590		 * IPV6_RECVDSTOPTS is more generic. --yoshfuji
591		 */
592		unsigned int off = sizeof(struct ipv6hdr);
593		u8 nexthdr = ipv6_hdr(skb)->nexthdr;
594
595		while (off <= opt->lastopt) {
596			unsigned int len;
597			u8 *ptr = nh + off;
598
599			switch (nexthdr) {
600			case IPPROTO_DSTOPTS:
601				nexthdr = ptr[0];
602				len = (ptr[1] + 1) << 3;
603				if (np->rxopt.bits.dstopts)
604					put_cmsg(msg, SOL_IPV6, IPV6_DSTOPTS, len, ptr);
605				break;
606			case IPPROTO_ROUTING:
607				nexthdr = ptr[0];
608				len = (ptr[1] + 1) << 3;
609				if (np->rxopt.bits.srcrt)
610					put_cmsg(msg, SOL_IPV6, IPV6_RTHDR, len, ptr);
611				break;
612			case IPPROTO_AH:
613				nexthdr = ptr[0];
614				len = (ptr[1] + 2) << 2;
615				break;
616			default:
617				nexthdr = ptr[0];
618				len = (ptr[1] + 1) << 3;
619				break;
620			}
621
622			off += len;
623		}
624	}
625
626	/* socket options in old style */
627	if (np->rxopt.bits.rxoinfo) {
628		struct in6_pktinfo src_info;
629
630		src_info.ipi6_ifindex = opt->iif;
631		src_info.ipi6_addr = ipv6_hdr(skb)->daddr;
632		put_cmsg(msg, SOL_IPV6, IPV6_2292PKTINFO, sizeof(src_info), &src_info);
633	}
634	if (np->rxopt.bits.rxohlim) {
635		int hlim = ipv6_hdr(skb)->hop_limit;
636		put_cmsg(msg, SOL_IPV6, IPV6_2292HOPLIMIT, sizeof(hlim), &hlim);
637	}
638	if (np->rxopt.bits.ohopopts && (opt->flags & IP6SKB_HOPBYHOP)) {
639		u8 *ptr = nh + sizeof(struct ipv6hdr);
640		put_cmsg(msg, SOL_IPV6, IPV6_2292HOPOPTS, (ptr[1]+1)<<3, ptr);
641	}
642	if (np->rxopt.bits.odstopts && opt->dst0) {
643		u8 *ptr = nh + opt->dst0;
644		put_cmsg(msg, SOL_IPV6, IPV6_2292DSTOPTS, (ptr[1]+1)<<3, ptr);
645	}
646	if (np->rxopt.bits.osrcrt && opt->srcrt) {
647		struct ipv6_rt_hdr *rthdr = (struct ipv6_rt_hdr *)(nh + opt->srcrt);
648		put_cmsg(msg, SOL_IPV6, IPV6_2292RTHDR, (rthdr->hdrlen+1) << 3, rthdr);
649	}
650	if (np->rxopt.bits.odstopts && opt->dst1) {
651		u8 *ptr = nh + opt->dst1;
652		put_cmsg(msg, SOL_IPV6, IPV6_2292DSTOPTS, (ptr[1]+1)<<3, ptr);
653	}
654	if (np->rxopt.bits.rxorigdstaddr) {
655		struct sockaddr_in6 sin6;
656		__be16 *ports = (__be16 *) skb_transport_header(skb);
657
658		if (skb_transport_offset(skb) + 4 <= skb->len) {
659			/* All current transport protocols have the port numbers in the
660			 * first four bytes of the transport header and this function is
661			 * written with this assumption in mind.
662			 */
663
664			sin6.sin6_family = AF_INET6;
665			sin6.sin6_addr = ipv6_hdr(skb)->daddr;
666			sin6.sin6_port = ports[1];
667			sin6.sin6_flowinfo = 0;
668			sin6.sin6_scope_id =
669				ipv6_iface_scope_id(&ipv6_hdr(skb)->daddr,
670						    opt->iif);
671
672			put_cmsg(msg, SOL_IPV6, IPV6_ORIGDSTADDR, sizeof(sin6), &sin6);
673		}
674	}
675}
676
677void ip6_datagram_recv_ctl(struct sock *sk, struct msghdr *msg,
678			  struct sk_buff *skb)
679{
680	ip6_datagram_recv_common_ctl(sk, msg, skb);
681	ip6_datagram_recv_specific_ctl(sk, msg, skb);
682}
683EXPORT_SYMBOL_GPL(ip6_datagram_recv_ctl);
684
685int ip6_datagram_send_ctl(struct net *net, struct sock *sk,
686			  struct msghdr *msg, struct flowi6 *fl6,
687			  struct ipv6_txoptions *opt,
688			  int *hlimit, int *tclass, int *dontfrag)
689{
690	struct in6_pktinfo *src_info;
691	struct cmsghdr *cmsg;
692	struct ipv6_rt_hdr *rthdr;
693	struct ipv6_opt_hdr *hdr;
694	int len;
695	int err = 0;
696
697	for_each_cmsghdr(cmsg, msg) {
698		int addr_type;
699
700		if (!CMSG_OK(msg, cmsg)) {
701			err = -EINVAL;
702			goto exit_f;
703		}
704
705		if (cmsg->cmsg_level != SOL_IPV6)
706			continue;
707
708		switch (cmsg->cmsg_type) {
709		case IPV6_PKTINFO:
710		case IPV6_2292PKTINFO:
711		    {
712			struct net_device *dev = NULL;
713
714			if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct in6_pktinfo))) {
715				err = -EINVAL;
716				goto exit_f;
717			}
718
719			src_info = (struct in6_pktinfo *)CMSG_DATA(cmsg);
720
721			if (src_info->ipi6_ifindex) {
722				if (fl6->flowi6_oif &&
723				    src_info->ipi6_ifindex != fl6->flowi6_oif)
724					return -EINVAL;
725				fl6->flowi6_oif = src_info->ipi6_ifindex;
726			}
727
728			addr_type = __ipv6_addr_type(&src_info->ipi6_addr);
729
730			rcu_read_lock();
731			if (fl6->flowi6_oif) {
732				dev = dev_get_by_index_rcu(net, fl6->flowi6_oif);
733				if (!dev) {
734					rcu_read_unlock();
735					return -ENODEV;
736				}
737			} else if (addr_type & IPV6_ADDR_LINKLOCAL) {
738				rcu_read_unlock();
739				return -EINVAL;
740			}
741
742			if (addr_type != IPV6_ADDR_ANY) {
743				int strict = __ipv6_addr_src_scope(addr_type) <= IPV6_ADDR_SCOPE_LINKLOCAL;
744				if (!(inet_sk(sk)->freebind || inet_sk(sk)->transparent) &&
745				    !ipv6_chk_addr(net, &src_info->ipi6_addr,
746						   strict ? dev : NULL, 0) &&
747				    !ipv6_chk_acast_addr_src(net, dev,
748							     &src_info->ipi6_addr))
749					err = -EINVAL;
750				else
751					fl6->saddr = src_info->ipi6_addr;
752			}
753
754			rcu_read_unlock();
755
756			if (err)
757				goto exit_f;
758
759			break;
760		    }
761
762		case IPV6_FLOWINFO:
763			if (cmsg->cmsg_len < CMSG_LEN(4)) {
764				err = -EINVAL;
765				goto exit_f;
766			}
767
768			if (fl6->flowlabel&IPV6_FLOWINFO_MASK) {
769				if ((fl6->flowlabel^*(__be32 *)CMSG_DATA(cmsg))&~IPV6_FLOWINFO_MASK) {
770					err = -EINVAL;
771					goto exit_f;
772				}
773			}
774			fl6->flowlabel = IPV6_FLOWINFO_MASK & *(__be32 *)CMSG_DATA(cmsg);
775			break;
776
777		case IPV6_2292HOPOPTS:
778		case IPV6_HOPOPTS:
779			if (opt->hopopt || cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) {
780				err = -EINVAL;
781				goto exit_f;
782			}
783
784			hdr = (struct ipv6_opt_hdr *)CMSG_DATA(cmsg);
785			len = ((hdr->hdrlen + 1) << 3);
786			if (cmsg->cmsg_len < CMSG_LEN(len)) {
787				err = -EINVAL;
788				goto exit_f;
789			}
790			if (!ns_capable(net->user_ns, CAP_NET_RAW)) {
791				err = -EPERM;
792				goto exit_f;
793			}
794			opt->opt_nflen += len;
795			opt->hopopt = hdr;
796			break;
797
798		case IPV6_2292DSTOPTS:
799			if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) {
800				err = -EINVAL;
801				goto exit_f;
802			}
803
804			hdr = (struct ipv6_opt_hdr *)CMSG_DATA(cmsg);
805			len = ((hdr->hdrlen + 1) << 3);
806			if (cmsg->cmsg_len < CMSG_LEN(len)) {
807				err = -EINVAL;
808				goto exit_f;
809			}
810			if (!ns_capable(net->user_ns, CAP_NET_RAW)) {
811				err = -EPERM;
812				goto exit_f;
813			}
814			if (opt->dst1opt) {
815				err = -EINVAL;
816				goto exit_f;
817			}
818			opt->opt_flen += len;
819			opt->dst1opt = hdr;
820			break;
821
822		case IPV6_DSTOPTS:
823		case IPV6_RTHDRDSTOPTS:
824			if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) {
825				err = -EINVAL;
826				goto exit_f;
827			}
828
829			hdr = (struct ipv6_opt_hdr *)CMSG_DATA(cmsg);
830			len = ((hdr->hdrlen + 1) << 3);
831			if (cmsg->cmsg_len < CMSG_LEN(len)) {
832				err = -EINVAL;
833				goto exit_f;
834			}
835			if (!ns_capable(net->user_ns, CAP_NET_RAW)) {
836				err = -EPERM;
837				goto exit_f;
838			}
839			if (cmsg->cmsg_type == IPV6_DSTOPTS) {
840				opt->opt_flen += len;
841				opt->dst1opt = hdr;
842			} else {
843				opt->opt_nflen += len;
844				opt->dst0opt = hdr;
845			}
846			break;
847
848		case IPV6_2292RTHDR:
849		case IPV6_RTHDR:
850			if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_rt_hdr))) {
851				err = -EINVAL;
852				goto exit_f;
853			}
854
855			rthdr = (struct ipv6_rt_hdr *)CMSG_DATA(cmsg);
856
857			switch (rthdr->type) {
858#if IS_ENABLED(CONFIG_IPV6_MIP6)
859			case IPV6_SRCRT_TYPE_2:
860				if (rthdr->hdrlen != 2 ||
861				    rthdr->segments_left != 1) {
862					err = -EINVAL;
863					goto exit_f;
864				}
865				break;
866#endif
867			default:
868				err = -EINVAL;
869				goto exit_f;
870			}
871
872			len = ((rthdr->hdrlen + 1) << 3);
873
874			if (cmsg->cmsg_len < CMSG_LEN(len)) {
875				err = -EINVAL;
876				goto exit_f;
877			}
878
879			/* segments left must also match */
880			if ((rthdr->hdrlen >> 1) != rthdr->segments_left) {
881				err = -EINVAL;
882				goto exit_f;
883			}
884
885			opt->opt_nflen += len;
886			opt->srcrt = rthdr;
887
888			if (cmsg->cmsg_type == IPV6_2292RTHDR && opt->dst1opt) {
889				int dsthdrlen = ((opt->dst1opt->hdrlen+1)<<3);
890
891				opt->opt_nflen += dsthdrlen;
892				opt->dst0opt = opt->dst1opt;
893				opt->dst1opt = NULL;
894				opt->opt_flen -= dsthdrlen;
895			}
896
897			break;
898
899		case IPV6_2292HOPLIMIT:
900		case IPV6_HOPLIMIT:
901			if (cmsg->cmsg_len != CMSG_LEN(sizeof(int))) {
902				err = -EINVAL;
903				goto exit_f;
904			}
905
906			*hlimit = *(int *)CMSG_DATA(cmsg);
907			if (*hlimit < -1 || *hlimit > 0xff) {
908				err = -EINVAL;
909				goto exit_f;
910			}
911
912			break;
913
914		case IPV6_TCLASS:
915		    {
916			int tc;
917
918			err = -EINVAL;
919			if (cmsg->cmsg_len != CMSG_LEN(sizeof(int)))
920				goto exit_f;
921
922			tc = *(int *)CMSG_DATA(cmsg);
923			if (tc < -1 || tc > 0xff)
924				goto exit_f;
925
926			err = 0;
927			*tclass = tc;
928
929			break;
930		    }
931
932		case IPV6_DONTFRAG:
933		    {
934			int df;
935
936			err = -EINVAL;
937			if (cmsg->cmsg_len != CMSG_LEN(sizeof(int)))
938				goto exit_f;
939
940			df = *(int *)CMSG_DATA(cmsg);
941			if (df < 0 || df > 1)
942				goto exit_f;
943
944			err = 0;
945			*dontfrag = df;
946
947			break;
948		    }
949		default:
950			net_dbg_ratelimited("invalid cmsg type: %d\n",
951					    cmsg->cmsg_type);
952			err = -EINVAL;
953			goto exit_f;
954		}
955	}
956
957exit_f:
958	return err;
959}
960EXPORT_SYMBOL_GPL(ip6_datagram_send_ctl);
961
962void ip6_dgram_sock_seq_show(struct seq_file *seq, struct sock *sp,
963			     __u16 srcp, __u16 destp, int bucket)
964{
965	const struct in6_addr *dest, *src;
966
967	dest  = &sp->sk_v6_daddr;
968	src   = &sp->sk_v6_rcv_saddr;
969	seq_printf(seq,
970		   "%5d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
971		   "%02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d\n",
972		   bucket,
973		   src->s6_addr32[0], src->s6_addr32[1],
974		   src->s6_addr32[2], src->s6_addr32[3], srcp,
975		   dest->s6_addr32[0], dest->s6_addr32[1],
976		   dest->s6_addr32[2], dest->s6_addr32[3], destp,
977		   sp->sk_state,
978		   sk_wmem_alloc_get(sp),
979		   sk_rmem_alloc_get(sp),
980		   0, 0L, 0,
981		   from_kuid_munged(seq_user_ns(seq), sock_i_uid(sp)),
982		   0,
983		   sock_i_ino(sp),
984		   atomic_read(&sp->sk_refcnt), sp,
985		   atomic_read(&sp->sk_drops));
986}
987