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