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
43int 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 == NULL)
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	fl6.flowi6_uid = sock_i_uid(sk);
165
166	if (!fl6.flowi6_oif && (addr_type&IPV6_ADDR_MULTICAST))
167		fl6.flowi6_oif = np->mcast_oif;
168
169	security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
170
171	opt = flowlabel ? flowlabel->opt : np->opt;
172	final_p = fl6_update_dst(&fl6, opt, &final);
173
174	dst = ip6_dst_lookup_flow(sk, &fl6, final_p);
175	err = 0;
176	if (IS_ERR(dst)) {
177		err = PTR_ERR(dst);
178		goto out;
179	}
180
181	/* source address lookup done in ip6_dst_lookup */
182
183	if (ipv6_addr_any(&np->saddr))
184		np->saddr = fl6.saddr;
185
186	if (ipv6_addr_any(&sk->sk_v6_rcv_saddr)) {
187		sk->sk_v6_rcv_saddr = fl6.saddr;
188		inet->inet_rcv_saddr = LOOPBACK4_IPV6;
189		if (sk->sk_prot->rehash)
190			sk->sk_prot->rehash(sk);
191	}
192
193	ip6_dst_store(sk, dst,
194		      ipv6_addr_equal(&fl6.daddr, &sk->sk_v6_daddr) ?
195		      &sk->sk_v6_daddr : NULL,
196#ifdef CONFIG_IPV6_SUBTREES
197		      ipv6_addr_equal(&fl6.saddr, &np->saddr) ?
198		      &np->saddr :
199#endif
200		      NULL);
201
202	sk->sk_state = TCP_ESTABLISHED;
203	ip6_set_txhash(sk);
204out:
205	fl6_sock_release(flowlabel);
206	return err;
207}
208EXPORT_SYMBOL_GPL(ip6_datagram_connect);
209
210int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *uaddr,
211				 int addr_len)
212{
213	DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, uaddr);
214	if (sin6->sin6_family != AF_INET6)
215		return -EAFNOSUPPORT;
216	return ip6_datagram_connect(sk, uaddr, addr_len);
217}
218EXPORT_SYMBOL_GPL(ip6_datagram_connect_v6_only);
219
220void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
221		     __be16 port, u32 info, u8 *payload)
222{
223	struct ipv6_pinfo *np  = inet6_sk(sk);
224	struct icmp6hdr *icmph = icmp6_hdr(skb);
225	struct sock_exterr_skb *serr;
226
227	if (!np->recverr)
228		return;
229
230	skb = skb_clone(skb, GFP_ATOMIC);
231	if (!skb)
232		return;
233
234	skb->protocol = htons(ETH_P_IPV6);
235
236	serr = SKB_EXT_ERR(skb);
237	serr->ee.ee_errno = err;
238	serr->ee.ee_origin = SO_EE_ORIGIN_ICMP6;
239	serr->ee.ee_type = icmph->icmp6_type;
240	serr->ee.ee_code = icmph->icmp6_code;
241	serr->ee.ee_pad = 0;
242	serr->ee.ee_info = info;
243	serr->ee.ee_data = 0;
244	serr->addr_offset = (u8 *)&(((struct ipv6hdr *)(icmph + 1))->daddr) -
245				  skb_network_header(skb);
246	serr->port = port;
247
248	__skb_pull(skb, payload - skb->data);
249	skb_reset_transport_header(skb);
250
251	if (sock_queue_err_skb(sk, skb))
252		kfree_skb(skb);
253}
254
255void ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info)
256{
257	struct ipv6_pinfo *np = inet6_sk(sk);
258	struct sock_exterr_skb *serr;
259	struct ipv6hdr *iph;
260	struct sk_buff *skb;
261
262	if (!np->recverr)
263		return;
264
265	skb = alloc_skb(sizeof(struct ipv6hdr), GFP_ATOMIC);
266	if (!skb)
267		return;
268
269	skb->protocol = htons(ETH_P_IPV6);
270
271	skb_put(skb, sizeof(struct ipv6hdr));
272	skb_reset_network_header(skb);
273	iph = ipv6_hdr(skb);
274	iph->daddr = fl6->daddr;
275
276	serr = SKB_EXT_ERR(skb);
277	serr->ee.ee_errno = err;
278	serr->ee.ee_origin = SO_EE_ORIGIN_LOCAL;
279	serr->ee.ee_type = 0;
280	serr->ee.ee_code = 0;
281	serr->ee.ee_pad = 0;
282	serr->ee.ee_info = info;
283	serr->ee.ee_data = 0;
284	serr->addr_offset = (u8 *)&iph->daddr - skb_network_header(skb);
285	serr->port = fl6->fl6_dport;
286
287	__skb_pull(skb, skb_tail_pointer(skb) - skb->data);
288	skb_reset_transport_header(skb);
289
290	if (sock_queue_err_skb(sk, skb))
291		kfree_skb(skb);
292}
293
294void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu)
295{
296	struct ipv6_pinfo *np = inet6_sk(sk);
297	struct ipv6hdr *iph;
298	struct sk_buff *skb;
299	struct ip6_mtuinfo *mtu_info;
300
301	if (!np->rxopt.bits.rxpmtu)
302		return;
303
304	skb = alloc_skb(sizeof(struct ipv6hdr), GFP_ATOMIC);
305	if (!skb)
306		return;
307
308	skb_put(skb, sizeof(struct ipv6hdr));
309	skb_reset_network_header(skb);
310	iph = ipv6_hdr(skb);
311	iph->daddr = fl6->daddr;
312
313	mtu_info = IP6CBMTU(skb);
314
315	mtu_info->ip6m_mtu = mtu;
316	mtu_info->ip6m_addr.sin6_family = AF_INET6;
317	mtu_info->ip6m_addr.sin6_port = 0;
318	mtu_info->ip6m_addr.sin6_flowinfo = 0;
319	mtu_info->ip6m_addr.sin6_scope_id = fl6->flowi6_oif;
320	mtu_info->ip6m_addr.sin6_addr = ipv6_hdr(skb)->daddr;
321
322	__skb_pull(skb, skb_tail_pointer(skb) - skb->data);
323	skb_reset_transport_header(skb);
324
325	skb = xchg(&np->rxpmtu, skb);
326	kfree_skb(skb);
327}
328
329/*
330 *	Handle MSG_ERRQUEUE
331 */
332int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
333{
334	struct ipv6_pinfo *np = inet6_sk(sk);
335	struct sock_exterr_skb *serr;
336	struct sk_buff *skb;
337	DECLARE_SOCKADDR(struct sockaddr_in6 *, sin, msg->msg_name);
338	struct {
339		struct sock_extended_err ee;
340		struct sockaddr_in6	 offender;
341	} errhdr;
342	int err;
343	int copied;
344
345	err = -EAGAIN;
346	skb = sock_dequeue_err_skb(sk);
347	if (skb == NULL)
348		goto out;
349
350	copied = skb->len;
351	if (copied > len) {
352		msg->msg_flags |= MSG_TRUNC;
353		copied = len;
354	}
355	err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
356	if (err)
357		goto out_free_skb;
358
359	sock_recv_timestamp(msg, sk, skb);
360
361	serr = SKB_EXT_ERR(skb);
362
363	if (sin) {
364		const unsigned char *nh = skb_network_header(skb);
365		sin->sin6_family = AF_INET6;
366		sin->sin6_flowinfo = 0;
367		sin->sin6_port = serr->port;
368		if (skb->protocol == htons(ETH_P_IPV6)) {
369			const struct ipv6hdr *ip6h = container_of((struct in6_addr *)(nh + serr->addr_offset),
370								  struct ipv6hdr, daddr);
371			sin->sin6_addr = ip6h->daddr;
372			if (np->sndflow)
373				sin->sin6_flowinfo = ip6_flowinfo(ip6h);
374			sin->sin6_scope_id =
375				ipv6_iface_scope_id(&sin->sin6_addr,
376						    IP6CB(skb)->iif);
377		} else {
378			ipv6_addr_set_v4mapped(*(__be32 *)(nh + serr->addr_offset),
379					       &sin->sin6_addr);
380			sin->sin6_scope_id = 0;
381		}
382		*addr_len = sizeof(*sin);
383	}
384
385	memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err));
386	sin = &errhdr.offender;
387	sin->sin6_family = AF_UNSPEC;
388	if (serr->ee.ee_origin != SO_EE_ORIGIN_LOCAL) {
389		sin->sin6_family = AF_INET6;
390		sin->sin6_flowinfo = 0;
391		sin->sin6_port = 0;
392		if (np->rxopt.all)
393			ip6_datagram_recv_common_ctl(sk, msg, skb);
394		if (skb->protocol == htons(ETH_P_IPV6)) {
395			sin->sin6_addr = ipv6_hdr(skb)->saddr;
396			if (np->rxopt.all)
397				ip6_datagram_recv_specific_ctl(sk, msg, skb);
398			sin->sin6_scope_id =
399				ipv6_iface_scope_id(&sin->sin6_addr,
400						    IP6CB(skb)->iif);
401		} else {
402			struct inet_sock *inet = inet_sk(sk);
403
404			ipv6_addr_set_v4mapped(ip_hdr(skb)->saddr,
405					       &sin->sin6_addr);
406			sin->sin6_scope_id = 0;
407			if (inet->cmsg_flags)
408				ip_cmsg_recv(msg, skb);
409		}
410	}
411
412	put_cmsg(msg, SOL_IPV6, IPV6_RECVERR, sizeof(errhdr), &errhdr);
413
414	/* Now we could try to dump offended packet options */
415
416	msg->msg_flags |= MSG_ERRQUEUE;
417	err = copied;
418
419out_free_skb:
420	kfree_skb(skb);
421out:
422	return err;
423}
424EXPORT_SYMBOL_GPL(ipv6_recv_error);
425
426/*
427 *	Handle IPV6_RECVPATHMTU
428 */
429int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len,
430		     int *addr_len)
431{
432	struct ipv6_pinfo *np = inet6_sk(sk);
433	struct sk_buff *skb;
434	struct ip6_mtuinfo mtu_info;
435	DECLARE_SOCKADDR(struct sockaddr_in6 *, sin, msg->msg_name);
436	int err;
437	int copied;
438
439	err = -EAGAIN;
440	skb = xchg(&np->rxpmtu, NULL);
441	if (skb == NULL)
442		goto out;
443
444	copied = skb->len;
445	if (copied > len) {
446		msg->msg_flags |= MSG_TRUNC;
447		copied = len;
448	}
449	err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
450	if (err)
451		goto out_free_skb;
452
453	sock_recv_timestamp(msg, sk, skb);
454
455	memcpy(&mtu_info, IP6CBMTU(skb), sizeof(mtu_info));
456
457	if (sin) {
458		sin->sin6_family = AF_INET6;
459		sin->sin6_flowinfo = 0;
460		sin->sin6_port = 0;
461		sin->sin6_scope_id = mtu_info.ip6m_addr.sin6_scope_id;
462		sin->sin6_addr = mtu_info.ip6m_addr.sin6_addr;
463		*addr_len = sizeof(*sin);
464	}
465
466	put_cmsg(msg, SOL_IPV6, IPV6_PATHMTU, sizeof(mtu_info), &mtu_info);
467
468	err = copied;
469
470out_free_skb:
471	kfree_skb(skb);
472out:
473	return err;
474}
475
476
477void ip6_datagram_recv_common_ctl(struct sock *sk, struct msghdr *msg,
478				 struct sk_buff *skb)
479{
480	struct ipv6_pinfo *np = inet6_sk(sk);
481	bool is_ipv6 = skb->protocol == htons(ETH_P_IPV6);
482
483	if (np->rxopt.bits.rxinfo) {
484		struct in6_pktinfo src_info;
485
486		if (is_ipv6) {
487			src_info.ipi6_ifindex = IP6CB(skb)->iif;
488			src_info.ipi6_addr = ipv6_hdr(skb)->daddr;
489		} else {
490			src_info.ipi6_ifindex =
491				PKTINFO_SKB_CB(skb)->ipi_ifindex;
492			ipv6_addr_set_v4mapped(ip_hdr(skb)->daddr,
493					       &src_info.ipi6_addr);
494		}
495		put_cmsg(msg, SOL_IPV6, IPV6_PKTINFO, sizeof(src_info), &src_info);
496	}
497}
498
499void ip6_datagram_recv_specific_ctl(struct sock *sk, struct msghdr *msg,
500				    struct sk_buff *skb)
501{
502	struct ipv6_pinfo *np = inet6_sk(sk);
503	struct inet6_skb_parm *opt = IP6CB(skb);
504	unsigned char *nh = skb_network_header(skb);
505
506	if (np->rxopt.bits.rxhlim) {
507		int hlim = ipv6_hdr(skb)->hop_limit;
508		put_cmsg(msg, SOL_IPV6, IPV6_HOPLIMIT, sizeof(hlim), &hlim);
509	}
510
511	if (np->rxopt.bits.rxtclass) {
512		int tclass = ipv6_get_dsfield(ipv6_hdr(skb));
513		put_cmsg(msg, SOL_IPV6, IPV6_TCLASS, sizeof(tclass), &tclass);
514	}
515
516	if (np->rxopt.bits.rxflow) {
517		__be32 flowinfo = ip6_flowinfo((struct ipv6hdr *)nh);
518		if (flowinfo)
519			put_cmsg(msg, SOL_IPV6, IPV6_FLOWINFO, sizeof(flowinfo), &flowinfo);
520	}
521
522	/* HbH is allowed only once */
523	if (np->rxopt.bits.hopopts && opt->hop) {
524		u8 *ptr = nh + opt->hop;
525		put_cmsg(msg, SOL_IPV6, IPV6_HOPOPTS, (ptr[1]+1)<<3, ptr);
526	}
527
528	if (opt->lastopt &&
529	    (np->rxopt.bits.dstopts || np->rxopt.bits.srcrt)) {
530		/*
531		 * Silly enough, but we need to reparse in order to
532		 * report extension headers (except for HbH)
533		 * in order.
534		 *
535		 * Also note that IPV6_RECVRTHDRDSTOPTS is NOT
536		 * (and WILL NOT be) defined because
537		 * IPV6_RECVDSTOPTS is more generic. --yoshfuji
538		 */
539		unsigned int off = sizeof(struct ipv6hdr);
540		u8 nexthdr = ipv6_hdr(skb)->nexthdr;
541
542		while (off <= opt->lastopt) {
543			unsigned int len;
544			u8 *ptr = nh + off;
545
546			switch (nexthdr) {
547			case IPPROTO_DSTOPTS:
548				nexthdr = ptr[0];
549				len = (ptr[1] + 1) << 3;
550				if (np->rxopt.bits.dstopts)
551					put_cmsg(msg, SOL_IPV6, IPV6_DSTOPTS, len, ptr);
552				break;
553			case IPPROTO_ROUTING:
554				nexthdr = ptr[0];
555				len = (ptr[1] + 1) << 3;
556				if (np->rxopt.bits.srcrt)
557					put_cmsg(msg, SOL_IPV6, IPV6_RTHDR, len, ptr);
558				break;
559			case IPPROTO_AH:
560				nexthdr = ptr[0];
561				len = (ptr[1] + 2) << 2;
562				break;
563			default:
564				nexthdr = ptr[0];
565				len = (ptr[1] + 1) << 3;
566				break;
567			}
568
569			off += len;
570		}
571	}
572
573	/* socket options in old style */
574	if (np->rxopt.bits.rxoinfo) {
575		struct in6_pktinfo src_info;
576
577		src_info.ipi6_ifindex = opt->iif;
578		src_info.ipi6_addr = ipv6_hdr(skb)->daddr;
579		put_cmsg(msg, SOL_IPV6, IPV6_2292PKTINFO, sizeof(src_info), &src_info);
580	}
581	if (np->rxopt.bits.rxohlim) {
582		int hlim = ipv6_hdr(skb)->hop_limit;
583		put_cmsg(msg, SOL_IPV6, IPV6_2292HOPLIMIT, sizeof(hlim), &hlim);
584	}
585	if (np->rxopt.bits.ohopopts && opt->hop) {
586		u8 *ptr = nh + opt->hop;
587		put_cmsg(msg, SOL_IPV6, IPV6_2292HOPOPTS, (ptr[1]+1)<<3, ptr);
588	}
589	if (np->rxopt.bits.odstopts && opt->dst0) {
590		u8 *ptr = nh + opt->dst0;
591		put_cmsg(msg, SOL_IPV6, IPV6_2292DSTOPTS, (ptr[1]+1)<<3, ptr);
592	}
593	if (np->rxopt.bits.osrcrt && opt->srcrt) {
594		struct ipv6_rt_hdr *rthdr = (struct ipv6_rt_hdr *)(nh + opt->srcrt);
595		put_cmsg(msg, SOL_IPV6, IPV6_2292RTHDR, (rthdr->hdrlen+1) << 3, rthdr);
596	}
597	if (np->rxopt.bits.odstopts && opt->dst1) {
598		u8 *ptr = nh + opt->dst1;
599		put_cmsg(msg, SOL_IPV6, IPV6_2292DSTOPTS, (ptr[1]+1)<<3, ptr);
600	}
601	if (np->rxopt.bits.rxorigdstaddr) {
602		struct sockaddr_in6 sin6;
603		__be16 *ports = (__be16 *) skb_transport_header(skb);
604
605		if (skb_transport_offset(skb) + 4 <= skb->len) {
606			/* All current transport protocols have the port numbers in the
607			 * first four bytes of the transport header and this function is
608			 * written with this assumption in mind.
609			 */
610
611			sin6.sin6_family = AF_INET6;
612			sin6.sin6_addr = ipv6_hdr(skb)->daddr;
613			sin6.sin6_port = ports[1];
614			sin6.sin6_flowinfo = 0;
615			sin6.sin6_scope_id =
616				ipv6_iface_scope_id(&ipv6_hdr(skb)->daddr,
617						    opt->iif);
618
619			put_cmsg(msg, SOL_IPV6, IPV6_ORIGDSTADDR, sizeof(sin6), &sin6);
620		}
621	}
622}
623
624void ip6_datagram_recv_ctl(struct sock *sk, struct msghdr *msg,
625			  struct sk_buff *skb)
626{
627	ip6_datagram_recv_common_ctl(sk, msg, skb);
628	ip6_datagram_recv_specific_ctl(sk, msg, skb);
629}
630EXPORT_SYMBOL_GPL(ip6_datagram_recv_ctl);
631
632int ip6_datagram_send_ctl(struct net *net, struct sock *sk,
633			  struct msghdr *msg, struct flowi6 *fl6,
634			  struct ipv6_txoptions *opt,
635			  int *hlimit, int *tclass, int *dontfrag)
636{
637	struct in6_pktinfo *src_info;
638	struct cmsghdr *cmsg;
639	struct ipv6_rt_hdr *rthdr;
640	struct ipv6_opt_hdr *hdr;
641	int len;
642	int err = 0;
643
644	for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) {
645		int addr_type;
646
647		if (!CMSG_OK(msg, cmsg)) {
648			err = -EINVAL;
649			goto exit_f;
650		}
651
652		if (cmsg->cmsg_level != SOL_IPV6)
653			continue;
654
655		switch (cmsg->cmsg_type) {
656		case IPV6_PKTINFO:
657		case IPV6_2292PKTINFO:
658		    {
659			struct net_device *dev = NULL;
660
661			if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct in6_pktinfo))) {
662				err = -EINVAL;
663				goto exit_f;
664			}
665
666			src_info = (struct in6_pktinfo *)CMSG_DATA(cmsg);
667
668			if (src_info->ipi6_ifindex) {
669				if (fl6->flowi6_oif &&
670				    src_info->ipi6_ifindex != fl6->flowi6_oif)
671					return -EINVAL;
672				fl6->flowi6_oif = src_info->ipi6_ifindex;
673			}
674
675			addr_type = __ipv6_addr_type(&src_info->ipi6_addr);
676
677			rcu_read_lock();
678			if (fl6->flowi6_oif) {
679				dev = dev_get_by_index_rcu(net, fl6->flowi6_oif);
680				if (!dev) {
681					rcu_read_unlock();
682					return -ENODEV;
683				}
684			} else if (addr_type & IPV6_ADDR_LINKLOCAL) {
685				rcu_read_unlock();
686				return -EINVAL;
687			}
688
689			if (addr_type != IPV6_ADDR_ANY) {
690				int strict = __ipv6_addr_src_scope(addr_type) <= IPV6_ADDR_SCOPE_LINKLOCAL;
691				if (!(inet_sk(sk)->freebind || inet_sk(sk)->transparent) &&
692				    !ipv6_chk_addr(net, &src_info->ipi6_addr,
693						   strict ? dev : NULL, 0) &&
694				    !ipv6_chk_acast_addr_src(net, dev,
695							     &src_info->ipi6_addr))
696					err = -EINVAL;
697				else
698					fl6->saddr = src_info->ipi6_addr;
699			}
700
701			rcu_read_unlock();
702
703			if (err)
704				goto exit_f;
705
706			break;
707		    }
708
709		case IPV6_FLOWINFO:
710			if (cmsg->cmsg_len < CMSG_LEN(4)) {
711				err = -EINVAL;
712				goto exit_f;
713			}
714
715			if (fl6->flowlabel&IPV6_FLOWINFO_MASK) {
716				if ((fl6->flowlabel^*(__be32 *)CMSG_DATA(cmsg))&~IPV6_FLOWINFO_MASK) {
717					err = -EINVAL;
718					goto exit_f;
719				}
720			}
721			fl6->flowlabel = IPV6_FLOWINFO_MASK & *(__be32 *)CMSG_DATA(cmsg);
722			break;
723
724		case IPV6_2292HOPOPTS:
725		case IPV6_HOPOPTS:
726			if (opt->hopopt || cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) {
727				err = -EINVAL;
728				goto exit_f;
729			}
730
731			hdr = (struct ipv6_opt_hdr *)CMSG_DATA(cmsg);
732			len = ((hdr->hdrlen + 1) << 3);
733			if (cmsg->cmsg_len < CMSG_LEN(len)) {
734				err = -EINVAL;
735				goto exit_f;
736			}
737			if (!ns_capable(net->user_ns, CAP_NET_RAW)) {
738				err = -EPERM;
739				goto exit_f;
740			}
741			opt->opt_nflen += len;
742			opt->hopopt = hdr;
743			break;
744
745		case IPV6_2292DSTOPTS:
746			if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) {
747				err = -EINVAL;
748				goto exit_f;
749			}
750
751			hdr = (struct ipv6_opt_hdr *)CMSG_DATA(cmsg);
752			len = ((hdr->hdrlen + 1) << 3);
753			if (cmsg->cmsg_len < CMSG_LEN(len)) {
754				err = -EINVAL;
755				goto exit_f;
756			}
757			if (!ns_capable(net->user_ns, CAP_NET_RAW)) {
758				err = -EPERM;
759				goto exit_f;
760			}
761			if (opt->dst1opt) {
762				err = -EINVAL;
763				goto exit_f;
764			}
765			opt->opt_flen += len;
766			opt->dst1opt = hdr;
767			break;
768
769		case IPV6_DSTOPTS:
770		case IPV6_RTHDRDSTOPTS:
771			if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) {
772				err = -EINVAL;
773				goto exit_f;
774			}
775
776			hdr = (struct ipv6_opt_hdr *)CMSG_DATA(cmsg);
777			len = ((hdr->hdrlen + 1) << 3);
778			if (cmsg->cmsg_len < CMSG_LEN(len)) {
779				err = -EINVAL;
780				goto exit_f;
781			}
782			if (!ns_capable(net->user_ns, CAP_NET_RAW)) {
783				err = -EPERM;
784				goto exit_f;
785			}
786			if (cmsg->cmsg_type == IPV6_DSTOPTS) {
787				opt->opt_flen += len;
788				opt->dst1opt = hdr;
789			} else {
790				opt->opt_nflen += len;
791				opt->dst0opt = hdr;
792			}
793			break;
794
795		case IPV6_2292RTHDR:
796		case IPV6_RTHDR:
797			if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_rt_hdr))) {
798				err = -EINVAL;
799				goto exit_f;
800			}
801
802			rthdr = (struct ipv6_rt_hdr *)CMSG_DATA(cmsg);
803
804			switch (rthdr->type) {
805#if IS_ENABLED(CONFIG_IPV6_MIP6)
806			case IPV6_SRCRT_TYPE_2:
807				if (rthdr->hdrlen != 2 ||
808				    rthdr->segments_left != 1) {
809					err = -EINVAL;
810					goto exit_f;
811				}
812				break;
813#endif
814			default:
815				err = -EINVAL;
816				goto exit_f;
817			}
818
819			len = ((rthdr->hdrlen + 1) << 3);
820
821			if (cmsg->cmsg_len < CMSG_LEN(len)) {
822				err = -EINVAL;
823				goto exit_f;
824			}
825
826			/* segments left must also match */
827			if ((rthdr->hdrlen >> 1) != rthdr->segments_left) {
828				err = -EINVAL;
829				goto exit_f;
830			}
831
832			opt->opt_nflen += len;
833			opt->srcrt = rthdr;
834
835			if (cmsg->cmsg_type == IPV6_2292RTHDR && opt->dst1opt) {
836				int dsthdrlen = ((opt->dst1opt->hdrlen+1)<<3);
837
838				opt->opt_nflen += dsthdrlen;
839				opt->dst0opt = opt->dst1opt;
840				opt->dst1opt = NULL;
841				opt->opt_flen -= dsthdrlen;
842			}
843
844			break;
845
846		case IPV6_2292HOPLIMIT:
847		case IPV6_HOPLIMIT:
848			if (cmsg->cmsg_len != CMSG_LEN(sizeof(int))) {
849				err = -EINVAL;
850				goto exit_f;
851			}
852
853			*hlimit = *(int *)CMSG_DATA(cmsg);
854			if (*hlimit < -1 || *hlimit > 0xff) {
855				err = -EINVAL;
856				goto exit_f;
857			}
858
859			break;
860
861		case IPV6_TCLASS:
862		    {
863			int tc;
864
865			err = -EINVAL;
866			if (cmsg->cmsg_len != CMSG_LEN(sizeof(int)))
867				goto exit_f;
868
869			tc = *(int *)CMSG_DATA(cmsg);
870			if (tc < -1 || tc > 0xff)
871				goto exit_f;
872
873			err = 0;
874			*tclass = tc;
875
876			break;
877		    }
878
879		case IPV6_DONTFRAG:
880		    {
881			int df;
882
883			err = -EINVAL;
884			if (cmsg->cmsg_len != CMSG_LEN(sizeof(int)))
885				goto exit_f;
886
887			df = *(int *)CMSG_DATA(cmsg);
888			if (df < 0 || df > 1)
889				goto exit_f;
890
891			err = 0;
892			*dontfrag = df;
893
894			break;
895		    }
896		default:
897			LIMIT_NETDEBUG(KERN_DEBUG "invalid cmsg type: %d\n",
898				       cmsg->cmsg_type);
899			err = -EINVAL;
900			goto exit_f;
901		}
902	}
903
904exit_f:
905	return err;
906}
907EXPORT_SYMBOL_GPL(ip6_datagram_send_ctl);
908
909void ip6_dgram_sock_seq_show(struct seq_file *seq, struct sock *sp,
910			     __u16 srcp, __u16 destp, int bucket)
911{
912	const struct in6_addr *dest, *src;
913
914	dest  = &sp->sk_v6_daddr;
915	src   = &sp->sk_v6_rcv_saddr;
916	seq_printf(seq,
917		   "%5d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
918		   "%02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d\n",
919		   bucket,
920		   src->s6_addr32[0], src->s6_addr32[1],
921		   src->s6_addr32[2], src->s6_addr32[3], srcp,
922		   dest->s6_addr32[0], dest->s6_addr32[1],
923		   dest->s6_addr32[2], dest->s6_addr32[3], destp,
924		   sp->sk_state,
925		   sk_wmem_alloc_get(sp),
926		   sk_rmem_alloc_get(sp),
927		   0, 0L, 0,
928		   from_kuid_munged(seq_user_ns(seq), sock_i_uid(sp)),
929		   0,
930		   sock_i_ino(sp),
931		   atomic_read(&sp->sk_refcnt), sp,
932		   atomic_read(&sp->sk_drops));
933}
934