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