xref: /openbmc/linux/net/dccp/ipv6.c (revision dcc32f4f)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *	DCCP over IPv6
4  *	Linux INET6 implementation
5  *
6  *	Based on net/dccp6/ipv6.c
7  *
8  *	Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
9  */
10 
11 #include <linux/module.h>
12 #include <linux/random.h>
13 #include <linux/slab.h>
14 #include <linux/xfrm.h>
15 #include <linux/string.h>
16 
17 #include <net/addrconf.h>
18 #include <net/inet_common.h>
19 #include <net/inet_hashtables.h>
20 #include <net/inet_sock.h>
21 #include <net/inet6_connection_sock.h>
22 #include <net/inet6_hashtables.h>
23 #include <net/ip6_route.h>
24 #include <net/ipv6.h>
25 #include <net/protocol.h>
26 #include <net/transp_v6.h>
27 #include <net/ip6_checksum.h>
28 #include <net/xfrm.h>
29 #include <net/secure_seq.h>
30 #include <net/sock.h>
31 
32 #include "dccp.h"
33 #include "ipv6.h"
34 #include "feat.h"
35 
36 /* The per-net dccp.v6_ctl_sk is used for sending RSTs and ACKs */
37 
38 static const struct inet_connection_sock_af_ops dccp_ipv6_mapped;
39 static const struct inet_connection_sock_af_ops dccp_ipv6_af_ops;
40 
41 /* add pseudo-header to DCCP checksum stored in skb->csum */
42 static inline __sum16 dccp_v6_csum_finish(struct sk_buff *skb,
43 				      const struct in6_addr *saddr,
44 				      const struct in6_addr *daddr)
45 {
46 	return csum_ipv6_magic(saddr, daddr, skb->len, IPPROTO_DCCP, skb->csum);
47 }
48 
49 static inline void dccp_v6_send_check(struct sock *sk, struct sk_buff *skb)
50 {
51 	struct ipv6_pinfo *np = inet6_sk(sk);
52 	struct dccp_hdr *dh = dccp_hdr(skb);
53 
54 	dccp_csum_outgoing(skb);
55 	dh->dccph_checksum = dccp_v6_csum_finish(skb, &np->saddr, &sk->sk_v6_daddr);
56 }
57 
58 static inline __u64 dccp_v6_init_sequence(struct sk_buff *skb)
59 {
60 	return secure_dccpv6_sequence_number(ipv6_hdr(skb)->daddr.s6_addr32,
61 					     ipv6_hdr(skb)->saddr.s6_addr32,
62 					     dccp_hdr(skb)->dccph_dport,
63 					     dccp_hdr(skb)->dccph_sport     );
64 
65 }
66 
67 static int dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
68 			u8 type, u8 code, int offset, __be32 info)
69 {
70 	const struct ipv6hdr *hdr = (const struct ipv6hdr *)skb->data;
71 	const struct dccp_hdr *dh;
72 	struct dccp_sock *dp;
73 	struct ipv6_pinfo *np;
74 	struct sock *sk;
75 	int err;
76 	__u64 seq;
77 	struct net *net = dev_net(skb->dev);
78 
79 	/* Only need dccph_dport & dccph_sport which are the first
80 	 * 4 bytes in dccp header.
81 	 * Our caller (icmpv6_notify()) already pulled 8 bytes for us.
82 	 */
83 	BUILD_BUG_ON(offsetofend(struct dccp_hdr, dccph_sport) > 8);
84 	BUILD_BUG_ON(offsetofend(struct dccp_hdr, dccph_dport) > 8);
85 	dh = (struct dccp_hdr *)(skb->data + offset);
86 
87 	sk = __inet6_lookup_established(net, &dccp_hashinfo,
88 					&hdr->daddr, dh->dccph_dport,
89 					&hdr->saddr, ntohs(dh->dccph_sport),
90 					inet6_iif(skb), 0);
91 
92 	if (!sk) {
93 		__ICMP6_INC_STATS(net, __in6_dev_get(skb->dev),
94 				  ICMP6_MIB_INERRORS);
95 		return -ENOENT;
96 	}
97 
98 	if (sk->sk_state == DCCP_TIME_WAIT) {
99 		inet_twsk_put(inet_twsk(sk));
100 		return 0;
101 	}
102 	seq = dccp_hdr_seq(dh);
103 	if (sk->sk_state == DCCP_NEW_SYN_RECV) {
104 		dccp_req_err(sk, seq);
105 		return 0;
106 	}
107 
108 	bh_lock_sock(sk);
109 	if (sock_owned_by_user(sk))
110 		__NET_INC_STATS(net, LINUX_MIB_LOCKDROPPEDICMPS);
111 
112 	if (sk->sk_state == DCCP_CLOSED)
113 		goto out;
114 
115 	dp = dccp_sk(sk);
116 	if ((1 << sk->sk_state) & ~(DCCPF_REQUESTING | DCCPF_LISTEN) &&
117 	    !between48(seq, dp->dccps_awl, dp->dccps_awh)) {
118 		__NET_INC_STATS(net, LINUX_MIB_OUTOFWINDOWICMPS);
119 		goto out;
120 	}
121 
122 	np = inet6_sk(sk);
123 
124 	if (type == NDISC_REDIRECT) {
125 		if (!sock_owned_by_user(sk)) {
126 			struct dst_entry *dst = __sk_dst_check(sk, np->dst_cookie);
127 
128 			if (dst)
129 				dst->ops->redirect(dst, sk, skb);
130 		}
131 		goto out;
132 	}
133 
134 	if (type == ICMPV6_PKT_TOOBIG) {
135 		struct dst_entry *dst = NULL;
136 
137 		if (!ip6_sk_accept_pmtu(sk))
138 			goto out;
139 
140 		if (sock_owned_by_user(sk))
141 			goto out;
142 		if ((1 << sk->sk_state) & (DCCPF_LISTEN | DCCPF_CLOSED))
143 			goto out;
144 
145 		dst = inet6_csk_update_pmtu(sk, ntohl(info));
146 		if (!dst)
147 			goto out;
148 
149 		if (inet_csk(sk)->icsk_pmtu_cookie > dst_mtu(dst))
150 			dccp_sync_mss(sk, dst_mtu(dst));
151 		goto out;
152 	}
153 
154 	icmpv6_err_convert(type, code, &err);
155 
156 	/* Might be for an request_sock */
157 	switch (sk->sk_state) {
158 	case DCCP_REQUESTING:
159 	case DCCP_RESPOND:  /* Cannot happen.
160 			       It can, it SYNs are crossed. --ANK */
161 		if (!sock_owned_by_user(sk)) {
162 			__DCCP_INC_STATS(DCCP_MIB_ATTEMPTFAILS);
163 			sk->sk_err = err;
164 			/*
165 			 * Wake people up to see the error
166 			 * (see connect in sock.c)
167 			 */
168 			sk->sk_error_report(sk);
169 			dccp_done(sk);
170 		} else
171 			sk->sk_err_soft = err;
172 		goto out;
173 	}
174 
175 	if (!sock_owned_by_user(sk) && np->recverr) {
176 		sk->sk_err = err;
177 		sk->sk_error_report(sk);
178 	} else
179 		sk->sk_err_soft = err;
180 
181 out:
182 	bh_unlock_sock(sk);
183 	sock_put(sk);
184 	return 0;
185 }
186 
187 
188 static int dccp_v6_send_response(const struct sock *sk, struct request_sock *req)
189 {
190 	struct inet_request_sock *ireq = inet_rsk(req);
191 	struct ipv6_pinfo *np = inet6_sk(sk);
192 	struct sk_buff *skb;
193 	struct in6_addr *final_p, final;
194 	struct flowi6 fl6;
195 	int err = -1;
196 	struct dst_entry *dst;
197 
198 	memset(&fl6, 0, sizeof(fl6));
199 	fl6.flowi6_proto = IPPROTO_DCCP;
200 	fl6.daddr = ireq->ir_v6_rmt_addr;
201 	fl6.saddr = ireq->ir_v6_loc_addr;
202 	fl6.flowlabel = 0;
203 	fl6.flowi6_oif = ireq->ir_iif;
204 	fl6.fl6_dport = ireq->ir_rmt_port;
205 	fl6.fl6_sport = htons(ireq->ir_num);
206 	security_req_classify_flow(req, flowi6_to_flowi_common(&fl6));
207 
208 
209 	rcu_read_lock();
210 	final_p = fl6_update_dst(&fl6, rcu_dereference(np->opt), &final);
211 	rcu_read_unlock();
212 
213 	dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p);
214 	if (IS_ERR(dst)) {
215 		err = PTR_ERR(dst);
216 		dst = NULL;
217 		goto done;
218 	}
219 
220 	skb = dccp_make_response(sk, dst, req);
221 	if (skb != NULL) {
222 		struct dccp_hdr *dh = dccp_hdr(skb);
223 		struct ipv6_txoptions *opt;
224 
225 		dh->dccph_checksum = dccp_v6_csum_finish(skb,
226 							 &ireq->ir_v6_loc_addr,
227 							 &ireq->ir_v6_rmt_addr);
228 		fl6.daddr = ireq->ir_v6_rmt_addr;
229 		rcu_read_lock();
230 		opt = ireq->ipv6_opt;
231 		if (!opt)
232 			opt = rcu_dereference(np->opt);
233 		err = ip6_xmit(sk, skb, &fl6, sk->sk_mark, opt, np->tclass,
234 			       sk->sk_priority);
235 		rcu_read_unlock();
236 		err = net_xmit_eval(err);
237 	}
238 
239 done:
240 	dst_release(dst);
241 	return err;
242 }
243 
244 static void dccp_v6_reqsk_destructor(struct request_sock *req)
245 {
246 	dccp_feat_list_purge(&dccp_rsk(req)->dreq_featneg);
247 	kfree(inet_rsk(req)->ipv6_opt);
248 	kfree_skb(inet_rsk(req)->pktopts);
249 }
250 
251 static void dccp_v6_ctl_send_reset(const struct sock *sk, struct sk_buff *rxskb)
252 {
253 	const struct ipv6hdr *rxip6h;
254 	struct sk_buff *skb;
255 	struct flowi6 fl6;
256 	struct net *net = dev_net(skb_dst(rxskb)->dev);
257 	struct sock *ctl_sk = net->dccp.v6_ctl_sk;
258 	struct dst_entry *dst;
259 
260 	if (dccp_hdr(rxskb)->dccph_type == DCCP_PKT_RESET)
261 		return;
262 
263 	if (!ipv6_unicast_destination(rxskb))
264 		return;
265 
266 	skb = dccp_ctl_make_reset(ctl_sk, rxskb);
267 	if (skb == NULL)
268 		return;
269 
270 	rxip6h = ipv6_hdr(rxskb);
271 	dccp_hdr(skb)->dccph_checksum = dccp_v6_csum_finish(skb, &rxip6h->saddr,
272 							    &rxip6h->daddr);
273 
274 	memset(&fl6, 0, sizeof(fl6));
275 	fl6.daddr = rxip6h->saddr;
276 	fl6.saddr = rxip6h->daddr;
277 
278 	fl6.flowi6_proto = IPPROTO_DCCP;
279 	fl6.flowi6_oif = inet6_iif(rxskb);
280 	fl6.fl6_dport = dccp_hdr(skb)->dccph_dport;
281 	fl6.fl6_sport = dccp_hdr(skb)->dccph_sport;
282 	security_skb_classify_flow(rxskb, flowi6_to_flowi_common(&fl6));
283 
284 	/* sk = NULL, but it is safe for now. RST socket required. */
285 	dst = ip6_dst_lookup_flow(sock_net(ctl_sk), ctl_sk, &fl6, NULL);
286 	if (!IS_ERR(dst)) {
287 		skb_dst_set(skb, dst);
288 		ip6_xmit(ctl_sk, skb, &fl6, 0, NULL, 0, 0);
289 		DCCP_INC_STATS(DCCP_MIB_OUTSEGS);
290 		DCCP_INC_STATS(DCCP_MIB_OUTRSTS);
291 		return;
292 	}
293 
294 	kfree_skb(skb);
295 }
296 
297 static struct request_sock_ops dccp6_request_sock_ops = {
298 	.family		= AF_INET6,
299 	.obj_size	= sizeof(struct dccp6_request_sock),
300 	.rtx_syn_ack	= dccp_v6_send_response,
301 	.send_ack	= dccp_reqsk_send_ack,
302 	.destructor	= dccp_v6_reqsk_destructor,
303 	.send_reset	= dccp_v6_ctl_send_reset,
304 	.syn_ack_timeout = dccp_syn_ack_timeout,
305 };
306 
307 static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
308 {
309 	struct request_sock *req;
310 	struct dccp_request_sock *dreq;
311 	struct inet_request_sock *ireq;
312 	struct ipv6_pinfo *np = inet6_sk(sk);
313 	const __be32 service = dccp_hdr_request(skb)->dccph_req_service;
314 	struct dccp_skb_cb *dcb = DCCP_SKB_CB(skb);
315 
316 	if (skb->protocol == htons(ETH_P_IP))
317 		return dccp_v4_conn_request(sk, skb);
318 
319 	if (!ipv6_unicast_destination(skb))
320 		return 0;	/* discard, don't send a reset here */
321 
322 	if (ipv6_addr_v4mapped(&ipv6_hdr(skb)->saddr)) {
323 		__IP6_INC_STATS(sock_net(sk), NULL, IPSTATS_MIB_INHDRERRORS);
324 		return 0;
325 	}
326 
327 	if (dccp_bad_service_code(sk, service)) {
328 		dcb->dccpd_reset_code = DCCP_RESET_CODE_BAD_SERVICE_CODE;
329 		goto drop;
330 	}
331 	/*
332 	 * There are no SYN attacks on IPv6, yet...
333 	 */
334 	dcb->dccpd_reset_code = DCCP_RESET_CODE_TOO_BUSY;
335 	if (inet_csk_reqsk_queue_is_full(sk))
336 		goto drop;
337 
338 	if (sk_acceptq_is_full(sk))
339 		goto drop;
340 
341 	req = inet_reqsk_alloc(&dccp6_request_sock_ops, sk, true);
342 	if (req == NULL)
343 		goto drop;
344 
345 	if (dccp_reqsk_init(req, dccp_sk(sk), skb))
346 		goto drop_and_free;
347 
348 	dreq = dccp_rsk(req);
349 	if (dccp_parse_options(sk, dreq, skb))
350 		goto drop_and_free;
351 
352 	if (security_inet_conn_request(sk, skb, req))
353 		goto drop_and_free;
354 
355 	ireq = inet_rsk(req);
356 	ireq->ir_v6_rmt_addr = ipv6_hdr(skb)->saddr;
357 	ireq->ir_v6_loc_addr = ipv6_hdr(skb)->daddr;
358 	ireq->ireq_family = AF_INET6;
359 	ireq->ir_mark = inet_request_mark(sk, skb);
360 
361 	if (ipv6_opt_accepted(sk, skb, IP6CB(skb)) ||
362 	    np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo ||
363 	    np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim) {
364 		refcount_inc(&skb->users);
365 		ireq->pktopts = skb;
366 	}
367 	ireq->ir_iif = sk->sk_bound_dev_if;
368 
369 	/* So that link locals have meaning */
370 	if (!sk->sk_bound_dev_if &&
371 	    ipv6_addr_type(&ireq->ir_v6_rmt_addr) & IPV6_ADDR_LINKLOCAL)
372 		ireq->ir_iif = inet6_iif(skb);
373 
374 	/*
375 	 * Step 3: Process LISTEN state
376 	 *
377 	 *   Set S.ISR, S.GSR, S.SWL, S.SWH from packet or Init Cookie
378 	 *
379 	 * Setting S.SWL/S.SWH to is deferred to dccp_create_openreq_child().
380 	 */
381 	dreq->dreq_isr	   = dcb->dccpd_seq;
382 	dreq->dreq_gsr     = dreq->dreq_isr;
383 	dreq->dreq_iss	   = dccp_v6_init_sequence(skb);
384 	dreq->dreq_gss     = dreq->dreq_iss;
385 	dreq->dreq_service = service;
386 
387 	if (dccp_v6_send_response(sk, req))
388 		goto drop_and_free;
389 
390 	inet_csk_reqsk_queue_hash_add(sk, req, DCCP_TIMEOUT_INIT);
391 	reqsk_put(req);
392 	return 0;
393 
394 drop_and_free:
395 	reqsk_free(req);
396 drop:
397 	__DCCP_INC_STATS(DCCP_MIB_ATTEMPTFAILS);
398 	return -1;
399 }
400 
401 static struct sock *dccp_v6_request_recv_sock(const struct sock *sk,
402 					      struct sk_buff *skb,
403 					      struct request_sock *req,
404 					      struct dst_entry *dst,
405 					      struct request_sock *req_unhash,
406 					      bool *own_req)
407 {
408 	struct inet_request_sock *ireq = inet_rsk(req);
409 	struct ipv6_pinfo *newnp;
410 	const struct ipv6_pinfo *np = inet6_sk(sk);
411 	struct ipv6_txoptions *opt;
412 	struct inet_sock *newinet;
413 	struct dccp6_sock *newdp6;
414 	struct sock *newsk;
415 
416 	if (skb->protocol == htons(ETH_P_IP)) {
417 		/*
418 		 *	v6 mapped
419 		 */
420 		newsk = dccp_v4_request_recv_sock(sk, skb, req, dst,
421 						  req_unhash, own_req);
422 		if (newsk == NULL)
423 			return NULL;
424 
425 		newdp6 = (struct dccp6_sock *)newsk;
426 		newinet = inet_sk(newsk);
427 		newinet->pinet6 = &newdp6->inet6;
428 		newnp = inet6_sk(newsk);
429 
430 		memcpy(newnp, np, sizeof(struct ipv6_pinfo));
431 
432 		newnp->saddr = newsk->sk_v6_rcv_saddr;
433 
434 		inet_csk(newsk)->icsk_af_ops = &dccp_ipv6_mapped;
435 		newsk->sk_backlog_rcv = dccp_v4_do_rcv;
436 		newnp->pktoptions  = NULL;
437 		newnp->opt	   = NULL;
438 		newnp->ipv6_mc_list = NULL;
439 		newnp->ipv6_ac_list = NULL;
440 		newnp->ipv6_fl_list = NULL;
441 		newnp->mcast_oif   = inet_iif(skb);
442 		newnp->mcast_hops  = ip_hdr(skb)->ttl;
443 
444 		/*
445 		 * No need to charge this sock to the relevant IPv6 refcnt debug socks count
446 		 * here, dccp_create_openreq_child now does this for us, see the comment in
447 		 * that function for the gory details. -acme
448 		 */
449 
450 		/* It is tricky place. Until this moment IPv4 tcp
451 		   worked with IPv6 icsk.icsk_af_ops.
452 		   Sync it now.
453 		 */
454 		dccp_sync_mss(newsk, inet_csk(newsk)->icsk_pmtu_cookie);
455 
456 		return newsk;
457 	}
458 
459 
460 	if (sk_acceptq_is_full(sk))
461 		goto out_overflow;
462 
463 	if (!dst) {
464 		struct flowi6 fl6;
465 
466 		dst = inet6_csk_route_req(sk, &fl6, req, IPPROTO_DCCP);
467 		if (!dst)
468 			goto out;
469 	}
470 
471 	newsk = dccp_create_openreq_child(sk, req, skb);
472 	if (newsk == NULL)
473 		goto out_nonewsk;
474 
475 	/*
476 	 * No need to charge this sock to the relevant IPv6 refcnt debug socks
477 	 * count here, dccp_create_openreq_child now does this for us, see the
478 	 * comment in that function for the gory details. -acme
479 	 */
480 
481 	ip6_dst_store(newsk, dst, NULL, NULL);
482 	newsk->sk_route_caps = dst->dev->features & ~(NETIF_F_IP_CSUM |
483 						      NETIF_F_TSO);
484 	newdp6 = (struct dccp6_sock *)newsk;
485 	newinet = inet_sk(newsk);
486 	newinet->pinet6 = &newdp6->inet6;
487 	newnp = inet6_sk(newsk);
488 
489 	memcpy(newnp, np, sizeof(struct ipv6_pinfo));
490 
491 	newsk->sk_v6_daddr	= ireq->ir_v6_rmt_addr;
492 	newnp->saddr		= ireq->ir_v6_loc_addr;
493 	newsk->sk_v6_rcv_saddr	= ireq->ir_v6_loc_addr;
494 	newsk->sk_bound_dev_if	= ireq->ir_iif;
495 
496 	/* Now IPv6 options...
497 
498 	   First: no IPv4 options.
499 	 */
500 	newinet->inet_opt = NULL;
501 
502 	/* Clone RX bits */
503 	newnp->rxopt.all = np->rxopt.all;
504 
505 	newnp->ipv6_mc_list = NULL;
506 	newnp->ipv6_ac_list = NULL;
507 	newnp->ipv6_fl_list = NULL;
508 	newnp->pktoptions = NULL;
509 	newnp->opt	  = NULL;
510 	newnp->mcast_oif  = inet6_iif(skb);
511 	newnp->mcast_hops = ipv6_hdr(skb)->hop_limit;
512 
513 	/*
514 	 * Clone native IPv6 options from listening socket (if any)
515 	 *
516 	 * Yes, keeping reference count would be much more clever, but we make
517 	 * one more one thing there: reattach optmem to newsk.
518 	 */
519 	opt = ireq->ipv6_opt;
520 	if (!opt)
521 		opt = rcu_dereference(np->opt);
522 	if (opt) {
523 		opt = ipv6_dup_options(newsk, opt);
524 		RCU_INIT_POINTER(newnp->opt, opt);
525 	}
526 	inet_csk(newsk)->icsk_ext_hdr_len = 0;
527 	if (opt)
528 		inet_csk(newsk)->icsk_ext_hdr_len = opt->opt_nflen +
529 						    opt->opt_flen;
530 
531 	dccp_sync_mss(newsk, dst_mtu(dst));
532 
533 	newinet->inet_daddr = newinet->inet_saddr = LOOPBACK4_IPV6;
534 	newinet->inet_rcv_saddr = LOOPBACK4_IPV6;
535 
536 	if (__inet_inherit_port(sk, newsk) < 0) {
537 		inet_csk_prepare_forced_close(newsk);
538 		dccp_done(newsk);
539 		goto out;
540 	}
541 	*own_req = inet_ehash_nolisten(newsk, req_to_sk(req_unhash), NULL);
542 	/* Clone pktoptions received with SYN, if we own the req */
543 	if (*own_req && ireq->pktopts) {
544 		newnp->pktoptions = skb_clone(ireq->pktopts, GFP_ATOMIC);
545 		consume_skb(ireq->pktopts);
546 		ireq->pktopts = NULL;
547 		if (newnp->pktoptions)
548 			skb_set_owner_r(newnp->pktoptions, newsk);
549 	}
550 
551 	return newsk;
552 
553 out_overflow:
554 	__NET_INC_STATS(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS);
555 out_nonewsk:
556 	dst_release(dst);
557 out:
558 	__NET_INC_STATS(sock_net(sk), LINUX_MIB_LISTENDROPS);
559 	return NULL;
560 }
561 
562 /* The socket must have it's spinlock held when we get
563  * here.
564  *
565  * We have a potential double-lock case here, so even when
566  * doing backlog processing we use the BH locking scheme.
567  * This is because we cannot sleep with the original spinlock
568  * held.
569  */
570 static int dccp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
571 {
572 	struct ipv6_pinfo *np = inet6_sk(sk);
573 	struct sk_buff *opt_skb = NULL;
574 
575 	/* Imagine: socket is IPv6. IPv4 packet arrives,
576 	   goes to IPv4 receive handler and backlogged.
577 	   From backlog it always goes here. Kerboom...
578 	   Fortunately, dccp_rcv_established and rcv_established
579 	   handle them correctly, but it is not case with
580 	   dccp_v6_hnd_req and dccp_v6_ctl_send_reset().   --ANK
581 	 */
582 
583 	if (skb->protocol == htons(ETH_P_IP))
584 		return dccp_v4_do_rcv(sk, skb);
585 
586 	if (sk_filter(sk, skb))
587 		goto discard;
588 
589 	/*
590 	 * socket locking is here for SMP purposes as backlog rcv is currently
591 	 * called with bh processing disabled.
592 	 */
593 
594 	/* Do Stevens' IPV6_PKTOPTIONS.
595 
596 	   Yes, guys, it is the only place in our code, where we
597 	   may make it not affecting IPv4.
598 	   The rest of code is protocol independent,
599 	   and I do not like idea to uglify IPv4.
600 
601 	   Actually, all the idea behind IPV6_PKTOPTIONS
602 	   looks not very well thought. For now we latch
603 	   options, received in the last packet, enqueued
604 	   by tcp. Feel free to propose better solution.
605 					       --ANK (980728)
606 	 */
607 	if (np->rxopt.all)
608 		opt_skb = skb_clone(skb, GFP_ATOMIC);
609 
610 	if (sk->sk_state == DCCP_OPEN) { /* Fast path */
611 		if (dccp_rcv_established(sk, skb, dccp_hdr(skb), skb->len))
612 			goto reset;
613 		if (opt_skb)
614 			goto ipv6_pktoptions;
615 		return 0;
616 	}
617 
618 	/*
619 	 *  Step 3: Process LISTEN state
620 	 *     If S.state == LISTEN,
621 	 *	 If P.type == Request or P contains a valid Init Cookie option,
622 	 *	      (* Must scan the packet's options to check for Init
623 	 *		 Cookies.  Only Init Cookies are processed here,
624 	 *		 however; other options are processed in Step 8.  This
625 	 *		 scan need only be performed if the endpoint uses Init
626 	 *		 Cookies *)
627 	 *	      (* Generate a new socket and switch to that socket *)
628 	 *	      Set S := new socket for this port pair
629 	 *	      S.state = RESPOND
630 	 *	      Choose S.ISS (initial seqno) or set from Init Cookies
631 	 *	      Initialize S.GAR := S.ISS
632 	 *	      Set S.ISR, S.GSR, S.SWL, S.SWH from packet or Init Cookies
633 	 *	      Continue with S.state == RESPOND
634 	 *	      (* A Response packet will be generated in Step 11 *)
635 	 *	 Otherwise,
636 	 *	      Generate Reset(No Connection) unless P.type == Reset
637 	 *	      Drop packet and return
638 	 *
639 	 * NOTE: the check for the packet types is done in
640 	 *	 dccp_rcv_state_process
641 	 */
642 
643 	if (dccp_rcv_state_process(sk, skb, dccp_hdr(skb), skb->len))
644 		goto reset;
645 	if (opt_skb)
646 		goto ipv6_pktoptions;
647 	return 0;
648 
649 reset:
650 	dccp_v6_ctl_send_reset(sk, skb);
651 discard:
652 	if (opt_skb != NULL)
653 		__kfree_skb(opt_skb);
654 	kfree_skb(skb);
655 	return 0;
656 
657 /* Handling IPV6_PKTOPTIONS skb the similar
658  * way it's done for net/ipv6/tcp_ipv6.c
659  */
660 ipv6_pktoptions:
661 	if (!((1 << sk->sk_state) & (DCCPF_CLOSED | DCCPF_LISTEN))) {
662 		if (np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo)
663 			np->mcast_oif = inet6_iif(opt_skb);
664 		if (np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim)
665 			np->mcast_hops = ipv6_hdr(opt_skb)->hop_limit;
666 		if (np->rxopt.bits.rxflow || np->rxopt.bits.rxtclass)
667 			np->rcv_flowinfo = ip6_flowinfo(ipv6_hdr(opt_skb));
668 		if (np->repflow)
669 			np->flow_label = ip6_flowlabel(ipv6_hdr(opt_skb));
670 		if (ipv6_opt_accepted(sk, opt_skb,
671 				      &DCCP_SKB_CB(opt_skb)->header.h6)) {
672 			skb_set_owner_r(opt_skb, sk);
673 			memmove(IP6CB(opt_skb),
674 				&DCCP_SKB_CB(opt_skb)->header.h6,
675 				sizeof(struct inet6_skb_parm));
676 			opt_skb = xchg(&np->pktoptions, opt_skb);
677 		} else {
678 			__kfree_skb(opt_skb);
679 			opt_skb = xchg(&np->pktoptions, NULL);
680 		}
681 	}
682 
683 	kfree_skb(opt_skb);
684 	return 0;
685 }
686 
687 static int dccp_v6_rcv(struct sk_buff *skb)
688 {
689 	const struct dccp_hdr *dh;
690 	bool refcounted;
691 	struct sock *sk;
692 	int min_cov;
693 
694 	/* Step 1: Check header basics */
695 
696 	if (dccp_invalid_packet(skb))
697 		goto discard_it;
698 
699 	/* Step 1: If header checksum is incorrect, drop packet and return. */
700 	if (dccp_v6_csum_finish(skb, &ipv6_hdr(skb)->saddr,
701 				     &ipv6_hdr(skb)->daddr)) {
702 		DCCP_WARN("dropped packet with invalid checksum\n");
703 		goto discard_it;
704 	}
705 
706 	dh = dccp_hdr(skb);
707 
708 	DCCP_SKB_CB(skb)->dccpd_seq  = dccp_hdr_seq(dh);
709 	DCCP_SKB_CB(skb)->dccpd_type = dh->dccph_type;
710 
711 	if (dccp_packet_without_ack(skb))
712 		DCCP_SKB_CB(skb)->dccpd_ack_seq = DCCP_PKT_WITHOUT_ACK_SEQ;
713 	else
714 		DCCP_SKB_CB(skb)->dccpd_ack_seq = dccp_hdr_ack_seq(skb);
715 
716 lookup:
717 	sk = __inet6_lookup_skb(&dccp_hashinfo, skb, __dccp_hdr_len(dh),
718 			        dh->dccph_sport, dh->dccph_dport,
719 				inet6_iif(skb), 0, &refcounted);
720 	if (!sk) {
721 		dccp_pr_debug("failed to look up flow ID in table and "
722 			      "get corresponding socket\n");
723 		goto no_dccp_socket;
724 	}
725 
726 	/*
727 	 * Step 2:
728 	 *	... or S.state == TIMEWAIT,
729 	 *		Generate Reset(No Connection) unless P.type == Reset
730 	 *		Drop packet and return
731 	 */
732 	if (sk->sk_state == DCCP_TIME_WAIT) {
733 		dccp_pr_debug("sk->sk_state == DCCP_TIME_WAIT: do_time_wait\n");
734 		inet_twsk_put(inet_twsk(sk));
735 		goto no_dccp_socket;
736 	}
737 
738 	if (sk->sk_state == DCCP_NEW_SYN_RECV) {
739 		struct request_sock *req = inet_reqsk(sk);
740 		struct sock *nsk;
741 
742 		sk = req->rsk_listener;
743 		if (unlikely(sk->sk_state != DCCP_LISTEN)) {
744 			inet_csk_reqsk_queue_drop_and_put(sk, req);
745 			goto lookup;
746 		}
747 		sock_hold(sk);
748 		refcounted = true;
749 		nsk = dccp_check_req(sk, skb, req);
750 		if (!nsk) {
751 			reqsk_put(req);
752 			goto discard_and_relse;
753 		}
754 		if (nsk == sk) {
755 			reqsk_put(req);
756 		} else if (dccp_child_process(sk, nsk, skb)) {
757 			dccp_v6_ctl_send_reset(sk, skb);
758 			goto discard_and_relse;
759 		} else {
760 			sock_put(sk);
761 			return 0;
762 		}
763 	}
764 	/*
765 	 * RFC 4340, sec. 9.2.1: Minimum Checksum Coverage
766 	 *	o if MinCsCov = 0, only packets with CsCov = 0 are accepted
767 	 *	o if MinCsCov > 0, also accept packets with CsCov >= MinCsCov
768 	 */
769 	min_cov = dccp_sk(sk)->dccps_pcrlen;
770 	if (dh->dccph_cscov  &&  (min_cov == 0 || dh->dccph_cscov < min_cov))  {
771 		dccp_pr_debug("Packet CsCov %d does not satisfy MinCsCov %d\n",
772 			      dh->dccph_cscov, min_cov);
773 		/* FIXME: send Data Dropped option (see also dccp_v4_rcv) */
774 		goto discard_and_relse;
775 	}
776 
777 	if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
778 		goto discard_and_relse;
779 
780 	return __sk_receive_skb(sk, skb, 1, dh->dccph_doff * 4,
781 				refcounted) ? -1 : 0;
782 
783 no_dccp_socket:
784 	if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
785 		goto discard_it;
786 	/*
787 	 * Step 2:
788 	 *	If no socket ...
789 	 *		Generate Reset(No Connection) unless P.type == Reset
790 	 *		Drop packet and return
791 	 */
792 	if (dh->dccph_type != DCCP_PKT_RESET) {
793 		DCCP_SKB_CB(skb)->dccpd_reset_code =
794 					DCCP_RESET_CODE_NO_CONNECTION;
795 		dccp_v6_ctl_send_reset(sk, skb);
796 	}
797 
798 discard_it:
799 	kfree_skb(skb);
800 	return 0;
801 
802 discard_and_relse:
803 	if (refcounted)
804 		sock_put(sk);
805 	goto discard_it;
806 }
807 
808 static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
809 			   int addr_len)
810 {
811 	struct sockaddr_in6 *usin = (struct sockaddr_in6 *)uaddr;
812 	struct inet_connection_sock *icsk = inet_csk(sk);
813 	struct inet_sock *inet = inet_sk(sk);
814 	struct ipv6_pinfo *np = inet6_sk(sk);
815 	struct dccp_sock *dp = dccp_sk(sk);
816 	struct in6_addr *saddr = NULL, *final_p, final;
817 	struct ipv6_txoptions *opt;
818 	struct flowi6 fl6;
819 	struct dst_entry *dst;
820 	int addr_type;
821 	int err;
822 
823 	dp->dccps_role = DCCP_ROLE_CLIENT;
824 
825 	if (addr_len < SIN6_LEN_RFC2133)
826 		return -EINVAL;
827 
828 	if (usin->sin6_family != AF_INET6)
829 		return -EAFNOSUPPORT;
830 
831 	memset(&fl6, 0, sizeof(fl6));
832 
833 	if (np->sndflow) {
834 		fl6.flowlabel = usin->sin6_flowinfo & IPV6_FLOWINFO_MASK;
835 		IP6_ECN_flow_init(fl6.flowlabel);
836 		if (fl6.flowlabel & IPV6_FLOWLABEL_MASK) {
837 			struct ip6_flowlabel *flowlabel;
838 			flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);
839 			if (IS_ERR(flowlabel))
840 				return -EINVAL;
841 			fl6_sock_release(flowlabel);
842 		}
843 	}
844 	/*
845 	 * connect() to INADDR_ANY means loopback (BSD'ism).
846 	 */
847 	if (ipv6_addr_any(&usin->sin6_addr))
848 		usin->sin6_addr.s6_addr[15] = 1;
849 
850 	addr_type = ipv6_addr_type(&usin->sin6_addr);
851 
852 	if (addr_type & IPV6_ADDR_MULTICAST)
853 		return -ENETUNREACH;
854 
855 	if (addr_type & IPV6_ADDR_LINKLOCAL) {
856 		if (addr_len >= sizeof(struct sockaddr_in6) &&
857 		    usin->sin6_scope_id) {
858 			/* If interface is set while binding, indices
859 			 * must coincide.
860 			 */
861 			if (sk->sk_bound_dev_if &&
862 			    sk->sk_bound_dev_if != usin->sin6_scope_id)
863 				return -EINVAL;
864 
865 			sk->sk_bound_dev_if = usin->sin6_scope_id;
866 		}
867 
868 		/* Connect to link-local address requires an interface */
869 		if (!sk->sk_bound_dev_if)
870 			return -EINVAL;
871 	}
872 
873 	sk->sk_v6_daddr = usin->sin6_addr;
874 	np->flow_label = fl6.flowlabel;
875 
876 	/*
877 	 * DCCP over IPv4
878 	 */
879 	if (addr_type == IPV6_ADDR_MAPPED) {
880 		u32 exthdrlen = icsk->icsk_ext_hdr_len;
881 		struct sockaddr_in sin;
882 
883 		SOCK_DEBUG(sk, "connect: ipv4 mapped\n");
884 
885 		if (__ipv6_only_sock(sk))
886 			return -ENETUNREACH;
887 
888 		sin.sin_family = AF_INET;
889 		sin.sin_port = usin->sin6_port;
890 		sin.sin_addr.s_addr = usin->sin6_addr.s6_addr32[3];
891 
892 		icsk->icsk_af_ops = &dccp_ipv6_mapped;
893 		sk->sk_backlog_rcv = dccp_v4_do_rcv;
894 
895 		err = dccp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin));
896 		if (err) {
897 			icsk->icsk_ext_hdr_len = exthdrlen;
898 			icsk->icsk_af_ops = &dccp_ipv6_af_ops;
899 			sk->sk_backlog_rcv = dccp_v6_do_rcv;
900 			goto failure;
901 		}
902 		np->saddr = sk->sk_v6_rcv_saddr;
903 		return err;
904 	}
905 
906 	if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr))
907 		saddr = &sk->sk_v6_rcv_saddr;
908 
909 	fl6.flowi6_proto = IPPROTO_DCCP;
910 	fl6.daddr = sk->sk_v6_daddr;
911 	fl6.saddr = saddr ? *saddr : np->saddr;
912 	fl6.flowi6_oif = sk->sk_bound_dev_if;
913 	fl6.fl6_dport = usin->sin6_port;
914 	fl6.fl6_sport = inet->inet_sport;
915 	security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6));
916 
917 	opt = rcu_dereference_protected(np->opt, lockdep_sock_is_held(sk));
918 	final_p = fl6_update_dst(&fl6, opt, &final);
919 
920 	dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p);
921 	if (IS_ERR(dst)) {
922 		err = PTR_ERR(dst);
923 		goto failure;
924 	}
925 
926 	if (saddr == NULL) {
927 		saddr = &fl6.saddr;
928 		sk->sk_v6_rcv_saddr = *saddr;
929 	}
930 
931 	/* set the source address */
932 	np->saddr = *saddr;
933 	inet->inet_rcv_saddr = LOOPBACK4_IPV6;
934 
935 	ip6_dst_store(sk, dst, NULL, NULL);
936 
937 	icsk->icsk_ext_hdr_len = 0;
938 	if (opt)
939 		icsk->icsk_ext_hdr_len = opt->opt_flen + opt->opt_nflen;
940 
941 	inet->inet_dport = usin->sin6_port;
942 
943 	dccp_set_state(sk, DCCP_REQUESTING);
944 	err = inet6_hash_connect(&dccp_death_row, sk);
945 	if (err)
946 		goto late_failure;
947 
948 	dp->dccps_iss = secure_dccpv6_sequence_number(np->saddr.s6_addr32,
949 						      sk->sk_v6_daddr.s6_addr32,
950 						      inet->inet_sport,
951 						      inet->inet_dport);
952 	err = dccp_connect(sk);
953 	if (err)
954 		goto late_failure;
955 
956 	return 0;
957 
958 late_failure:
959 	dccp_set_state(sk, DCCP_CLOSED);
960 	__sk_dst_reset(sk);
961 failure:
962 	inet->inet_dport = 0;
963 	sk->sk_route_caps = 0;
964 	return err;
965 }
966 
967 static const struct inet_connection_sock_af_ops dccp_ipv6_af_ops = {
968 	.queue_xmit	   = inet6_csk_xmit,
969 	.send_check	   = dccp_v6_send_check,
970 	.rebuild_header	   = inet6_sk_rebuild_header,
971 	.conn_request	   = dccp_v6_conn_request,
972 	.syn_recv_sock	   = dccp_v6_request_recv_sock,
973 	.net_header_len	   = sizeof(struct ipv6hdr),
974 	.setsockopt	   = ipv6_setsockopt,
975 	.getsockopt	   = ipv6_getsockopt,
976 	.addr2sockaddr	   = inet6_csk_addr2sockaddr,
977 	.sockaddr_len	   = sizeof(struct sockaddr_in6),
978 };
979 
980 /*
981  *	DCCP over IPv4 via INET6 API
982  */
983 static const struct inet_connection_sock_af_ops dccp_ipv6_mapped = {
984 	.queue_xmit	   = ip_queue_xmit,
985 	.send_check	   = dccp_v4_send_check,
986 	.rebuild_header	   = inet_sk_rebuild_header,
987 	.conn_request	   = dccp_v6_conn_request,
988 	.syn_recv_sock	   = dccp_v6_request_recv_sock,
989 	.net_header_len	   = sizeof(struct iphdr),
990 	.setsockopt	   = ipv6_setsockopt,
991 	.getsockopt	   = ipv6_getsockopt,
992 	.addr2sockaddr	   = inet6_csk_addr2sockaddr,
993 	.sockaddr_len	   = sizeof(struct sockaddr_in6),
994 };
995 
996 /* NOTE: A lot of things set to zero explicitly by call to
997  *       sk_alloc() so need not be done here.
998  */
999 static int dccp_v6_init_sock(struct sock *sk)
1000 {
1001 	static __u8 dccp_v6_ctl_sock_initialized;
1002 	int err = dccp_init_sock(sk, dccp_v6_ctl_sock_initialized);
1003 
1004 	if (err == 0) {
1005 		if (unlikely(!dccp_v6_ctl_sock_initialized))
1006 			dccp_v6_ctl_sock_initialized = 1;
1007 		inet_csk(sk)->icsk_af_ops = &dccp_ipv6_af_ops;
1008 	}
1009 
1010 	return err;
1011 }
1012 
1013 static void dccp_v6_destroy_sock(struct sock *sk)
1014 {
1015 	dccp_destroy_sock(sk);
1016 	inet6_destroy_sock(sk);
1017 }
1018 
1019 static struct timewait_sock_ops dccp6_timewait_sock_ops = {
1020 	.twsk_obj_size	= sizeof(struct dccp6_timewait_sock),
1021 };
1022 
1023 static struct proto dccp_v6_prot = {
1024 	.name		   = "DCCPv6",
1025 	.owner		   = THIS_MODULE,
1026 	.close		   = dccp_close,
1027 	.connect	   = dccp_v6_connect,
1028 	.disconnect	   = dccp_disconnect,
1029 	.ioctl		   = dccp_ioctl,
1030 	.init		   = dccp_v6_init_sock,
1031 	.setsockopt	   = dccp_setsockopt,
1032 	.getsockopt	   = dccp_getsockopt,
1033 	.sendmsg	   = dccp_sendmsg,
1034 	.recvmsg	   = dccp_recvmsg,
1035 	.backlog_rcv	   = dccp_v6_do_rcv,
1036 	.hash		   = inet6_hash,
1037 	.unhash		   = inet_unhash,
1038 	.accept		   = inet_csk_accept,
1039 	.get_port	   = inet_csk_get_port,
1040 	.shutdown	   = dccp_shutdown,
1041 	.destroy	   = dccp_v6_destroy_sock,
1042 	.orphan_count	   = &dccp_orphan_count,
1043 	.max_header	   = MAX_DCCP_HEADER,
1044 	.obj_size	   = sizeof(struct dccp6_sock),
1045 	.slab_flags	   = SLAB_TYPESAFE_BY_RCU,
1046 	.rsk_prot	   = &dccp6_request_sock_ops,
1047 	.twsk_prot	   = &dccp6_timewait_sock_ops,
1048 	.h.hashinfo	   = &dccp_hashinfo,
1049 };
1050 
1051 static const struct inet6_protocol dccp_v6_protocol = {
1052 	.handler	= dccp_v6_rcv,
1053 	.err_handler	= dccp_v6_err,
1054 	.flags		= INET6_PROTO_NOPOLICY | INET6_PROTO_FINAL,
1055 };
1056 
1057 static const struct proto_ops inet6_dccp_ops = {
1058 	.family		   = PF_INET6,
1059 	.owner		   = THIS_MODULE,
1060 	.release	   = inet6_release,
1061 	.bind		   = inet6_bind,
1062 	.connect	   = inet_stream_connect,
1063 	.socketpair	   = sock_no_socketpair,
1064 	.accept		   = inet_accept,
1065 	.getname	   = inet6_getname,
1066 	.poll		   = dccp_poll,
1067 	.ioctl		   = inet6_ioctl,
1068 	.gettstamp	   = sock_gettstamp,
1069 	.listen		   = inet_dccp_listen,
1070 	.shutdown	   = inet_shutdown,
1071 	.setsockopt	   = sock_common_setsockopt,
1072 	.getsockopt	   = sock_common_getsockopt,
1073 	.sendmsg	   = inet_sendmsg,
1074 	.recvmsg	   = sock_common_recvmsg,
1075 	.mmap		   = sock_no_mmap,
1076 	.sendpage	   = sock_no_sendpage,
1077 #ifdef CONFIG_COMPAT
1078 	.compat_ioctl	   = inet6_compat_ioctl,
1079 #endif
1080 };
1081 
1082 static struct inet_protosw dccp_v6_protosw = {
1083 	.type		= SOCK_DCCP,
1084 	.protocol	= IPPROTO_DCCP,
1085 	.prot		= &dccp_v6_prot,
1086 	.ops		= &inet6_dccp_ops,
1087 	.flags		= INET_PROTOSW_ICSK,
1088 };
1089 
1090 static int __net_init dccp_v6_init_net(struct net *net)
1091 {
1092 	if (dccp_hashinfo.bhash == NULL)
1093 		return -ESOCKTNOSUPPORT;
1094 
1095 	return inet_ctl_sock_create(&net->dccp.v6_ctl_sk, PF_INET6,
1096 				    SOCK_DCCP, IPPROTO_DCCP, net);
1097 }
1098 
1099 static void __net_exit dccp_v6_exit_net(struct net *net)
1100 {
1101 	inet_ctl_sock_destroy(net->dccp.v6_ctl_sk);
1102 }
1103 
1104 static void __net_exit dccp_v6_exit_batch(struct list_head *net_exit_list)
1105 {
1106 	inet_twsk_purge(&dccp_hashinfo, AF_INET6);
1107 }
1108 
1109 static struct pernet_operations dccp_v6_ops = {
1110 	.init   = dccp_v6_init_net,
1111 	.exit   = dccp_v6_exit_net,
1112 	.exit_batch = dccp_v6_exit_batch,
1113 };
1114 
1115 static int __init dccp_v6_init(void)
1116 {
1117 	int err = proto_register(&dccp_v6_prot, 1);
1118 
1119 	if (err)
1120 		goto out;
1121 
1122 	inet6_register_protosw(&dccp_v6_protosw);
1123 
1124 	err = register_pernet_subsys(&dccp_v6_ops);
1125 	if (err)
1126 		goto out_destroy_ctl_sock;
1127 
1128 	err = inet6_add_protocol(&dccp_v6_protocol, IPPROTO_DCCP);
1129 	if (err)
1130 		goto out_unregister_proto;
1131 
1132 out:
1133 	return err;
1134 out_unregister_proto:
1135 	unregister_pernet_subsys(&dccp_v6_ops);
1136 out_destroy_ctl_sock:
1137 	inet6_unregister_protosw(&dccp_v6_protosw);
1138 	proto_unregister(&dccp_v6_prot);
1139 	goto out;
1140 }
1141 
1142 static void __exit dccp_v6_exit(void)
1143 {
1144 	inet6_del_protocol(&dccp_v6_protocol, IPPROTO_DCCP);
1145 	unregister_pernet_subsys(&dccp_v6_ops);
1146 	inet6_unregister_protosw(&dccp_v6_protosw);
1147 	proto_unregister(&dccp_v6_prot);
1148 }
1149 
1150 module_init(dccp_v6_init);
1151 module_exit(dccp_v6_exit);
1152 
1153 /*
1154  * __stringify doesn't likes enums, so use SOCK_DCCP (6) and IPPROTO_DCCP (33)
1155  * values directly, Also cover the case where the protocol is not specified,
1156  * i.e. net-pf-PF_INET6-proto-0-type-SOCK_DCCP
1157  */
1158 MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET6, 33, 6);
1159 MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET6, 0, 6);
1160 MODULE_LICENSE("GPL");
1161 MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@mandriva.com>");
1162 MODULE_DESCRIPTION("DCCPv6 - Datagram Congestion Controlled Protocol");
1163