fe6d40418c0b8fdba3b58fd7b88d3fedc2a7f6a2
[pandora-kernel.git] / net / ipv6 / tcp_ipv6.c
1 /*
2  *      TCP over IPv6
3  *      Linux INET6 implementation
4  *
5  *      Authors:
6  *      Pedro Roque             <roque@di.fc.ul.pt>
7  *
8  *      Based on:
9  *      linux/net/ipv4/tcp.c
10  *      linux/net/ipv4/tcp_input.c
11  *      linux/net/ipv4/tcp_output.c
12  *
13  *      Fixes:
14  *      Hideaki YOSHIFUJI       :       sin6_scope_id support
15  *      YOSHIFUJI Hideaki @USAGI and:   Support IPV6_V6ONLY socket option, which
16  *      Alexey Kuznetsov                allow both IPv4 and IPv6 sockets to bind
17  *                                      a single port at the same time.
18  *      YOSHIFUJI Hideaki @USAGI:       convert /proc/net/tcp6 to seq_file.
19  *
20  *      This program is free software; you can redistribute it and/or
21  *      modify it under the terms of the GNU General Public License
22  *      as published by the Free Software Foundation; either version
23  *      2 of the License, or (at your option) any later version.
24  */
25
26 #include <linux/bottom_half.h>
27 #include <linux/module.h>
28 #include <linux/errno.h>
29 #include <linux/types.h>
30 #include <linux/socket.h>
31 #include <linux/sockios.h>
32 #include <linux/net.h>
33 #include <linux/jiffies.h>
34 #include <linux/in.h>
35 #include <linux/in6.h>
36 #include <linux/netdevice.h>
37 #include <linux/init.h>
38 #include <linux/jhash.h>
39 #include <linux/ipsec.h>
40 #include <linux/times.h>
41 #include <linux/slab.h>
42
43 #include <linux/ipv6.h>
44 #include <linux/icmpv6.h>
45 #include <linux/random.h>
46
47 #include <net/tcp.h>
48 #include <net/ndisc.h>
49 #include <net/inet6_hashtables.h>
50 #include <net/inet6_connection_sock.h>
51 #include <net/ipv6.h>
52 #include <net/transp_v6.h>
53 #include <net/addrconf.h>
54 #include <net/ip6_route.h>
55 #include <net/ip6_checksum.h>
56 #include <net/inet_ecn.h>
57 #include <net/protocol.h>
58 #include <net/xfrm.h>
59 #include <net/snmp.h>
60 #include <net/dsfield.h>
61 #include <net/timewait_sock.h>
62 #include <net/netdma.h>
63 #include <net/inet_common.h>
64
65 #include <asm/uaccess.h>
66
67 #include <linux/proc_fs.h>
68 #include <linux/seq_file.h>
69
70 #include <linux/crypto.h>
71 #include <linux/scatterlist.h>
72
73 static void     tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb);
74 static void     tcp_v6_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
75                                       struct request_sock *req);
76
77 static int      tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb);
78 static void     __tcp_v6_send_check(struct sk_buff *skb,
79                                     struct in6_addr *saddr,
80                                     struct in6_addr *daddr);
81
82 static const struct inet_connection_sock_af_ops ipv6_mapped;
83 static const struct inet_connection_sock_af_ops ipv6_specific;
84 #ifdef CONFIG_TCP_MD5SIG
85 static const struct tcp_sock_af_ops tcp_sock_ipv6_specific;
86 static const struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific;
87 #else
88 static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(struct sock *sk,
89                                                    struct in6_addr *addr)
90 {
91         return NULL;
92 }
93 #endif
94
95 static void tcp_v6_hash(struct sock *sk)
96 {
97         if (sk->sk_state != TCP_CLOSE) {
98                 if (inet_csk(sk)->icsk_af_ops == &ipv6_mapped) {
99                         tcp_prot.hash(sk);
100                         return;
101                 }
102                 local_bh_disable();
103                 __inet6_hash(sk, NULL);
104                 local_bh_enable();
105         }
106 }
107
108 static __inline__ __sum16 tcp_v6_check(int len,
109                                    struct in6_addr *saddr,
110                                    struct in6_addr *daddr,
111                                    __wsum base)
112 {
113         return csum_ipv6_magic(saddr, daddr, len, IPPROTO_TCP, base);
114 }
115
116 static __u32 tcp_v6_init_sequence(struct sk_buff *skb)
117 {
118         return secure_tcpv6_sequence_number(ipv6_hdr(skb)->daddr.s6_addr32,
119                                             ipv6_hdr(skb)->saddr.s6_addr32,
120                                             tcp_hdr(skb)->dest,
121                                             tcp_hdr(skb)->source);
122 }
123
124 static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
125                           int addr_len)
126 {
127         struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
128         struct inet_sock *inet = inet_sk(sk);
129         struct inet_connection_sock *icsk = inet_csk(sk);
130         struct ipv6_pinfo *np = inet6_sk(sk);
131         struct tcp_sock *tp = tcp_sk(sk);
132         struct in6_addr *saddr = NULL, *final_p, final;
133         struct flowi fl;
134         struct dst_entry *dst;
135         int addr_type;
136         int err;
137
138         if (addr_len < SIN6_LEN_RFC2133)
139                 return -EINVAL;
140
141         if (usin->sin6_family != AF_INET6)
142                 return(-EAFNOSUPPORT);
143
144         memset(&fl, 0, sizeof(fl));
145
146         if (np->sndflow) {
147                 fl.fl6_flowlabel = usin->sin6_flowinfo&IPV6_FLOWINFO_MASK;
148                 IP6_ECN_flow_init(fl.fl6_flowlabel);
149                 if (fl.fl6_flowlabel&IPV6_FLOWLABEL_MASK) {
150                         struct ip6_flowlabel *flowlabel;
151                         flowlabel = fl6_sock_lookup(sk, fl.fl6_flowlabel);
152                         if (flowlabel == NULL)
153                                 return -EINVAL;
154                         ipv6_addr_copy(&usin->sin6_addr, &flowlabel->dst);
155                         fl6_sock_release(flowlabel);
156                 }
157         }
158
159         /*
160          *      connect() to INADDR_ANY means loopback (BSD'ism).
161          */
162
163         if(ipv6_addr_any(&usin->sin6_addr))
164                 usin->sin6_addr.s6_addr[15] = 0x1;
165
166         addr_type = ipv6_addr_type(&usin->sin6_addr);
167
168         if(addr_type & IPV6_ADDR_MULTICAST)
169                 return -ENETUNREACH;
170
171         if (addr_type&IPV6_ADDR_LINKLOCAL) {
172                 if (addr_len >= sizeof(struct sockaddr_in6) &&
173                     usin->sin6_scope_id) {
174                         /* If interface is set while binding, indices
175                          * must coincide.
176                          */
177                         if (sk->sk_bound_dev_if &&
178                             sk->sk_bound_dev_if != usin->sin6_scope_id)
179                                 return -EINVAL;
180
181                         sk->sk_bound_dev_if = usin->sin6_scope_id;
182                 }
183
184                 /* Connect to link-local address requires an interface */
185                 if (!sk->sk_bound_dev_if)
186                         return -EINVAL;
187         }
188
189         if (tp->rx_opt.ts_recent_stamp &&
190             !ipv6_addr_equal(&np->daddr, &usin->sin6_addr)) {
191                 tp->rx_opt.ts_recent = 0;
192                 tp->rx_opt.ts_recent_stamp = 0;
193                 tp->write_seq = 0;
194         }
195
196         ipv6_addr_copy(&np->daddr, &usin->sin6_addr);
197         np->flow_label = fl.fl6_flowlabel;
198
199         /*
200          *      TCP over IPv4
201          */
202
203         if (addr_type == IPV6_ADDR_MAPPED) {
204                 u32 exthdrlen = icsk->icsk_ext_hdr_len;
205                 struct sockaddr_in sin;
206
207                 SOCK_DEBUG(sk, "connect: ipv4 mapped\n");
208
209                 if (__ipv6_only_sock(sk))
210                         return -ENETUNREACH;
211
212                 sin.sin_family = AF_INET;
213                 sin.sin_port = usin->sin6_port;
214                 sin.sin_addr.s_addr = usin->sin6_addr.s6_addr32[3];
215
216                 icsk->icsk_af_ops = &ipv6_mapped;
217                 sk->sk_backlog_rcv = tcp_v4_do_rcv;
218 #ifdef CONFIG_TCP_MD5SIG
219                 tp->af_specific = &tcp_sock_ipv6_mapped_specific;
220 #endif
221
222                 err = tcp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin));
223
224                 if (err) {
225                         icsk->icsk_ext_hdr_len = exthdrlen;
226                         icsk->icsk_af_ops = &ipv6_specific;
227                         sk->sk_backlog_rcv = tcp_v6_do_rcv;
228 #ifdef CONFIG_TCP_MD5SIG
229                         tp->af_specific = &tcp_sock_ipv6_specific;
230 #endif
231                         goto failure;
232                 } else {
233                         ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr);
234                         ipv6_addr_set_v4mapped(inet->inet_rcv_saddr,
235                                                &np->rcv_saddr);
236                 }
237
238                 return err;
239         }
240
241         if (!ipv6_addr_any(&np->rcv_saddr))
242                 saddr = &np->rcv_saddr;
243
244         fl.proto = IPPROTO_TCP;
245         ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
246         ipv6_addr_copy(&fl.fl6_src,
247                        (saddr ? saddr : &np->saddr));
248         fl.oif = sk->sk_bound_dev_if;
249         fl.mark = sk->sk_mark;
250         fl.fl_ip_dport = usin->sin6_port;
251         fl.fl_ip_sport = inet->inet_sport;
252
253         final_p = fl6_update_dst(&fl, np->opt, &final);
254
255         security_sk_classify_flow(sk, &fl);
256
257         err = ip6_dst_lookup(sk, &dst, &fl);
258         if (err)
259                 goto failure;
260         if (final_p)
261                 ipv6_addr_copy(&fl.fl6_dst, final_p);
262
263         err = __xfrm_lookup(sock_net(sk), &dst, &fl, sk, XFRM_LOOKUP_WAIT);
264         if (err < 0) {
265                 if (err == -EREMOTE)
266                         err = ip6_dst_blackhole(sk, &dst, &fl);
267                 if (err < 0)
268                         goto failure;
269         }
270
271         if (saddr == NULL) {
272                 saddr = &fl.fl6_src;
273                 ipv6_addr_copy(&np->rcv_saddr, saddr);
274         }
275
276         /* set the source address */
277         ipv6_addr_copy(&np->saddr, saddr);
278         inet->inet_rcv_saddr = LOOPBACK4_IPV6;
279
280         sk->sk_gso_type = SKB_GSO_TCPV6;
281         __ip6_dst_store(sk, dst, NULL, NULL);
282
283         icsk->icsk_ext_hdr_len = 0;
284         if (np->opt)
285                 icsk->icsk_ext_hdr_len = (np->opt->opt_flen +
286                                           np->opt->opt_nflen);
287
288         tp->rx_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
289
290         inet->inet_dport = usin->sin6_port;
291
292         tcp_set_state(sk, TCP_SYN_SENT);
293         err = inet6_hash_connect(&tcp_death_row, sk);
294         if (err)
295                 goto late_failure;
296
297         if (!tp->write_seq)
298                 tp->write_seq = secure_tcpv6_sequence_number(np->saddr.s6_addr32,
299                                                              np->daddr.s6_addr32,
300                                                              inet->inet_sport,
301                                                              inet->inet_dport);
302
303         err = tcp_connect(sk);
304         if (err)
305                 goto late_failure;
306
307         return 0;
308
309 late_failure:
310         tcp_set_state(sk, TCP_CLOSE);
311         __sk_dst_reset(sk);
312 failure:
313         inet->inet_dport = 0;
314         sk->sk_route_caps = 0;
315         return err;
316 }
317
318 static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
319                 u8 type, u8 code, int offset, __be32 info)
320 {
321         struct ipv6hdr *hdr = (struct ipv6hdr*)skb->data;
322         const struct tcphdr *th = (struct tcphdr *)(skb->data+offset);
323         struct ipv6_pinfo *np;
324         struct sock *sk;
325         int err;
326         struct tcp_sock *tp;
327         __u32 seq;
328         struct net *net = dev_net(skb->dev);
329
330         sk = inet6_lookup(net, &tcp_hashinfo, &hdr->daddr,
331                         th->dest, &hdr->saddr, th->source, skb->dev->ifindex);
332
333         if (sk == NULL) {
334                 ICMP6_INC_STATS_BH(net, __in6_dev_get(skb->dev),
335                                    ICMP6_MIB_INERRORS);
336                 return;
337         }
338
339         if (sk->sk_state == TCP_TIME_WAIT) {
340                 inet_twsk_put(inet_twsk(sk));
341                 return;
342         }
343
344         bh_lock_sock(sk);
345         if (sock_owned_by_user(sk))
346                 NET_INC_STATS_BH(net, LINUX_MIB_LOCKDROPPEDICMPS);
347
348         if (sk->sk_state == TCP_CLOSE)
349                 goto out;
350
351         if (ipv6_hdr(skb)->hop_limit < inet6_sk(sk)->min_hopcount) {
352                 NET_INC_STATS_BH(net, LINUX_MIB_TCPMINTTLDROP);
353                 goto out;
354         }
355
356         tp = tcp_sk(sk);
357         seq = ntohl(th->seq);
358         if (sk->sk_state != TCP_LISTEN &&
359             !between(seq, tp->snd_una, tp->snd_nxt)) {
360                 NET_INC_STATS_BH(net, LINUX_MIB_OUTOFWINDOWICMPS);
361                 goto out;
362         }
363
364         np = inet6_sk(sk);
365
366         if (type == ICMPV6_PKT_TOOBIG) {
367                 struct dst_entry *dst = NULL;
368
369                 if (sock_owned_by_user(sk))
370                         goto out;
371                 if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))
372                         goto out;
373
374                 /* icmp should have updated the destination cache entry */
375                 dst = __sk_dst_check(sk, np->dst_cookie);
376
377                 if (dst == NULL) {
378                         struct inet_sock *inet = inet_sk(sk);
379                         struct flowi fl;
380
381                         /* BUGGG_FUTURE: Again, it is not clear how
382                            to handle rthdr case. Ignore this complexity
383                            for now.
384                          */
385                         memset(&fl, 0, sizeof(fl));
386                         fl.proto = IPPROTO_TCP;
387                         ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
388                         ipv6_addr_copy(&fl.fl6_src, &np->saddr);
389                         fl.oif = sk->sk_bound_dev_if;
390                         fl.mark = sk->sk_mark;
391                         fl.fl_ip_dport = inet->inet_dport;
392                         fl.fl_ip_sport = inet->inet_sport;
393                         security_skb_classify_flow(skb, &fl);
394
395                         if ((err = ip6_dst_lookup(sk, &dst, &fl))) {
396                                 sk->sk_err_soft = -err;
397                                 goto out;
398                         }
399
400                         if ((err = xfrm_lookup(net, &dst, &fl, sk, 0)) < 0) {
401                                 sk->sk_err_soft = -err;
402                                 goto out;
403                         }
404
405                 } else
406                         dst_hold(dst);
407
408                 if (inet_csk(sk)->icsk_pmtu_cookie > dst_mtu(dst)) {
409                         tcp_sync_mss(sk, dst_mtu(dst));
410                         tcp_simple_retransmit(sk);
411                 } /* else let the usual retransmit timer handle it */
412                 dst_release(dst);
413                 goto out;
414         }
415
416         icmpv6_err_convert(type, code, &err);
417
418         /* Might be for an request_sock */
419         switch (sk->sk_state) {
420                 struct request_sock *req, **prev;
421         case TCP_LISTEN:
422                 if (sock_owned_by_user(sk))
423                         goto out;
424
425                 req = inet6_csk_search_req(sk, &prev, th->dest, &hdr->daddr,
426                                            &hdr->saddr, inet6_iif(skb));
427                 if (!req)
428                         goto out;
429
430                 /* ICMPs are not backlogged, hence we cannot get
431                  * an established socket here.
432                  */
433                 WARN_ON(req->sk != NULL);
434
435                 if (seq != tcp_rsk(req)->snt_isn) {
436                         NET_INC_STATS_BH(net, LINUX_MIB_OUTOFWINDOWICMPS);
437                         goto out;
438                 }
439
440                 inet_csk_reqsk_queue_drop(sk, req, prev);
441                 goto out;
442
443         case TCP_SYN_SENT:
444         case TCP_SYN_RECV:  /* Cannot happen.
445                                It can, it SYNs are crossed. --ANK */
446                 if (!sock_owned_by_user(sk)) {
447                         sk->sk_err = err;
448                         sk->sk_error_report(sk);                /* Wake people up to see the error (see connect in sock.c) */
449
450                         tcp_done(sk);
451                 } else
452                         sk->sk_err_soft = err;
453                 goto out;
454         }
455
456         if (!sock_owned_by_user(sk) && np->recverr) {
457                 sk->sk_err = err;
458                 sk->sk_error_report(sk);
459         } else
460                 sk->sk_err_soft = err;
461
462 out:
463         bh_unlock_sock(sk);
464         sock_put(sk);
465 }
466
467
468 static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req,
469                               struct request_values *rvp)
470 {
471         struct inet6_request_sock *treq = inet6_rsk(req);
472         struct ipv6_pinfo *np = inet6_sk(sk);
473         struct sk_buff * skb;
474         struct ipv6_txoptions *opt = NULL;
475         struct in6_addr * final_p, final;
476         struct flowi fl;
477         struct dst_entry *dst;
478         int err = -1;
479
480         memset(&fl, 0, sizeof(fl));
481         fl.proto = IPPROTO_TCP;
482         ipv6_addr_copy(&fl.fl6_dst, &treq->rmt_addr);
483         ipv6_addr_copy(&fl.fl6_src, &treq->loc_addr);
484         fl.fl6_flowlabel = 0;
485         fl.oif = treq->iif;
486         fl.mark = sk->sk_mark;
487         fl.fl_ip_dport = inet_rsk(req)->rmt_port;
488         fl.fl_ip_sport = inet_rsk(req)->loc_port;
489         security_req_classify_flow(req, &fl);
490
491         opt = np->opt;
492         final_p = fl6_update_dst(&fl, opt, &final);
493
494         err = ip6_dst_lookup(sk, &dst, &fl);
495         if (err)
496                 goto done;
497         if (final_p)
498                 ipv6_addr_copy(&fl.fl6_dst, final_p);
499         if ((err = xfrm_lookup(sock_net(sk), &dst, &fl, sk, 0)) < 0)
500                 goto done;
501
502         skb = tcp_make_synack(sk, dst, req, rvp);
503         if (skb) {
504                 __tcp_v6_send_check(skb, &treq->loc_addr, &treq->rmt_addr);
505
506                 ipv6_addr_copy(&fl.fl6_dst, &treq->rmt_addr);
507                 err = ip6_xmit(sk, skb, &fl, opt);
508                 err = net_xmit_eval(err);
509         }
510
511 done:
512         if (opt && opt != np->opt)
513                 sock_kfree_s(sk, opt, opt->tot_len);
514         dst_release(dst);
515         return err;
516 }
517
518 static int tcp_v6_rtx_synack(struct sock *sk, struct request_sock *req,
519                              struct request_values *rvp)
520 {
521         TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS);
522         return tcp_v6_send_synack(sk, req, rvp);
523 }
524
525 static inline void syn_flood_warning(struct sk_buff *skb)
526 {
527 #ifdef CONFIG_SYN_COOKIES
528         if (sysctl_tcp_syncookies)
529                 printk(KERN_INFO
530                        "TCPv6: Possible SYN flooding on port %d. "
531                        "Sending cookies.\n", ntohs(tcp_hdr(skb)->dest));
532         else
533 #endif
534                 printk(KERN_INFO
535                        "TCPv6: Possible SYN flooding on port %d. "
536                        "Dropping request.\n", ntohs(tcp_hdr(skb)->dest));
537 }
538
539 static void tcp_v6_reqsk_destructor(struct request_sock *req)
540 {
541         kfree_skb(inet6_rsk(req)->pktopts);
542 }
543
544 #ifdef CONFIG_TCP_MD5SIG
545 static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(struct sock *sk,
546                                                    struct in6_addr *addr)
547 {
548         struct tcp_sock *tp = tcp_sk(sk);
549         int i;
550
551         BUG_ON(tp == NULL);
552
553         if (!tp->md5sig_info || !tp->md5sig_info->entries6)
554                 return NULL;
555
556         for (i = 0; i < tp->md5sig_info->entries6; i++) {
557                 if (ipv6_addr_equal(&tp->md5sig_info->keys6[i].addr, addr))
558                         return &tp->md5sig_info->keys6[i].base;
559         }
560         return NULL;
561 }
562
563 static struct tcp_md5sig_key *tcp_v6_md5_lookup(struct sock *sk,
564                                                 struct sock *addr_sk)
565 {
566         return tcp_v6_md5_do_lookup(sk, &inet6_sk(addr_sk)->daddr);
567 }
568
569 static struct tcp_md5sig_key *tcp_v6_reqsk_md5_lookup(struct sock *sk,
570                                                       struct request_sock *req)
571 {
572         return tcp_v6_md5_do_lookup(sk, &inet6_rsk(req)->rmt_addr);
573 }
574
575 static int tcp_v6_md5_do_add(struct sock *sk, struct in6_addr *peer,
576                              char *newkey, u8 newkeylen)
577 {
578         /* Add key to the list */
579         struct tcp_md5sig_key *key;
580         struct tcp_sock *tp = tcp_sk(sk);
581         struct tcp6_md5sig_key *keys;
582
583         key = tcp_v6_md5_do_lookup(sk, peer);
584         if (key) {
585                 /* modify existing entry - just update that one */
586                 kfree(key->key);
587                 key->key = newkey;
588                 key->keylen = newkeylen;
589         } else {
590                 /* reallocate new list if current one is full. */
591                 if (!tp->md5sig_info) {
592                         tp->md5sig_info = kzalloc(sizeof(*tp->md5sig_info), GFP_ATOMIC);
593                         if (!tp->md5sig_info) {
594                                 kfree(newkey);
595                                 return -ENOMEM;
596                         }
597                         sk_nocaps_add(sk, NETIF_F_GSO_MASK);
598                 }
599                 if (tcp_alloc_md5sig_pool(sk) == NULL) {
600                         kfree(newkey);
601                         return -ENOMEM;
602                 }
603                 if (tp->md5sig_info->alloced6 == tp->md5sig_info->entries6) {
604                         keys = kmalloc((sizeof (tp->md5sig_info->keys6[0]) *
605                                        (tp->md5sig_info->entries6 + 1)), GFP_ATOMIC);
606
607                         if (!keys) {
608                                 tcp_free_md5sig_pool();
609                                 kfree(newkey);
610                                 return -ENOMEM;
611                         }
612
613                         if (tp->md5sig_info->entries6)
614                                 memmove(keys, tp->md5sig_info->keys6,
615                                         (sizeof (tp->md5sig_info->keys6[0]) *
616                                          tp->md5sig_info->entries6));
617
618                         kfree(tp->md5sig_info->keys6);
619                         tp->md5sig_info->keys6 = keys;
620                         tp->md5sig_info->alloced6++;
621                 }
622
623                 ipv6_addr_copy(&tp->md5sig_info->keys6[tp->md5sig_info->entries6].addr,
624                                peer);
625                 tp->md5sig_info->keys6[tp->md5sig_info->entries6].base.key = newkey;
626                 tp->md5sig_info->keys6[tp->md5sig_info->entries6].base.keylen = newkeylen;
627
628                 tp->md5sig_info->entries6++;
629         }
630         return 0;
631 }
632
633 static int tcp_v6_md5_add_func(struct sock *sk, struct sock *addr_sk,
634                                u8 *newkey, __u8 newkeylen)
635 {
636         return tcp_v6_md5_do_add(sk, &inet6_sk(addr_sk)->daddr,
637                                  newkey, newkeylen);
638 }
639
640 static int tcp_v6_md5_do_del(struct sock *sk, struct in6_addr *peer)
641 {
642         struct tcp_sock *tp = tcp_sk(sk);
643         int i;
644
645         for (i = 0; i < tp->md5sig_info->entries6; i++) {
646                 if (ipv6_addr_equal(&tp->md5sig_info->keys6[i].addr, peer)) {
647                         /* Free the key */
648                         kfree(tp->md5sig_info->keys6[i].base.key);
649                         tp->md5sig_info->entries6--;
650
651                         if (tp->md5sig_info->entries6 == 0) {
652                                 kfree(tp->md5sig_info->keys6);
653                                 tp->md5sig_info->keys6 = NULL;
654                                 tp->md5sig_info->alloced6 = 0;
655                         } else {
656                                 /* shrink the database */
657                                 if (tp->md5sig_info->entries6 != i)
658                                         memmove(&tp->md5sig_info->keys6[i],
659                                                 &tp->md5sig_info->keys6[i+1],
660                                                 (tp->md5sig_info->entries6 - i)
661                                                 * sizeof (tp->md5sig_info->keys6[0]));
662                         }
663                         tcp_free_md5sig_pool();
664                         return 0;
665                 }
666         }
667         return -ENOENT;
668 }
669
670 static void tcp_v6_clear_md5_list (struct sock *sk)
671 {
672         struct tcp_sock *tp = tcp_sk(sk);
673         int i;
674
675         if (tp->md5sig_info->entries6) {
676                 for (i = 0; i < tp->md5sig_info->entries6; i++)
677                         kfree(tp->md5sig_info->keys6[i].base.key);
678                 tp->md5sig_info->entries6 = 0;
679                 tcp_free_md5sig_pool();
680         }
681
682         kfree(tp->md5sig_info->keys6);
683         tp->md5sig_info->keys6 = NULL;
684         tp->md5sig_info->alloced6 = 0;
685
686         if (tp->md5sig_info->entries4) {
687                 for (i = 0; i < tp->md5sig_info->entries4; i++)
688                         kfree(tp->md5sig_info->keys4[i].base.key);
689                 tp->md5sig_info->entries4 = 0;
690                 tcp_free_md5sig_pool();
691         }
692
693         kfree(tp->md5sig_info->keys4);
694         tp->md5sig_info->keys4 = NULL;
695         tp->md5sig_info->alloced4 = 0;
696 }
697
698 static int tcp_v6_parse_md5_keys (struct sock *sk, char __user *optval,
699                                   int optlen)
700 {
701         struct tcp_md5sig cmd;
702         struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&cmd.tcpm_addr;
703         u8 *newkey;
704
705         if (optlen < sizeof(cmd))
706                 return -EINVAL;
707
708         if (copy_from_user(&cmd, optval, sizeof(cmd)))
709                 return -EFAULT;
710
711         if (sin6->sin6_family != AF_INET6)
712                 return -EINVAL;
713
714         if (!cmd.tcpm_keylen) {
715                 if (!tcp_sk(sk)->md5sig_info)
716                         return -ENOENT;
717                 if (ipv6_addr_v4mapped(&sin6->sin6_addr))
718                         return tcp_v4_md5_do_del(sk, sin6->sin6_addr.s6_addr32[3]);
719                 return tcp_v6_md5_do_del(sk, &sin6->sin6_addr);
720         }
721
722         if (cmd.tcpm_keylen > TCP_MD5SIG_MAXKEYLEN)
723                 return -EINVAL;
724
725         if (!tcp_sk(sk)->md5sig_info) {
726                 struct tcp_sock *tp = tcp_sk(sk);
727                 struct tcp_md5sig_info *p;
728
729                 p = kzalloc(sizeof(struct tcp_md5sig_info), GFP_KERNEL);
730                 if (!p)
731                         return -ENOMEM;
732
733                 tp->md5sig_info = p;
734                 sk_nocaps_add(sk, NETIF_F_GSO_MASK);
735         }
736
737         newkey = kmemdup(cmd.tcpm_key, cmd.tcpm_keylen, GFP_KERNEL);
738         if (!newkey)
739                 return -ENOMEM;
740         if (ipv6_addr_v4mapped(&sin6->sin6_addr)) {
741                 return tcp_v4_md5_do_add(sk, sin6->sin6_addr.s6_addr32[3],
742                                          newkey, cmd.tcpm_keylen);
743         }
744         return tcp_v6_md5_do_add(sk, &sin6->sin6_addr, newkey, cmd.tcpm_keylen);
745 }
746
747 static int tcp_v6_md5_hash_pseudoheader(struct tcp_md5sig_pool *hp,
748                                         struct in6_addr *daddr,
749                                         struct in6_addr *saddr, int nbytes)
750 {
751         struct tcp6_pseudohdr *bp;
752         struct scatterlist sg;
753
754         bp = &hp->md5_blk.ip6;
755         /* 1. TCP pseudo-header (RFC2460) */
756         ipv6_addr_copy(&bp->saddr, saddr);
757         ipv6_addr_copy(&bp->daddr, daddr);
758         bp->protocol = cpu_to_be32(IPPROTO_TCP);
759         bp->len = cpu_to_be32(nbytes);
760
761         sg_init_one(&sg, bp, sizeof(*bp));
762         return crypto_hash_update(&hp->md5_desc, &sg, sizeof(*bp));
763 }
764
765 static int tcp_v6_md5_hash_hdr(char *md5_hash, struct tcp_md5sig_key *key,
766                                struct in6_addr *daddr, struct in6_addr *saddr,
767                                struct tcphdr *th)
768 {
769         struct tcp_md5sig_pool *hp;
770         struct hash_desc *desc;
771
772         hp = tcp_get_md5sig_pool();
773         if (!hp)
774                 goto clear_hash_noput;
775         desc = &hp->md5_desc;
776
777         if (crypto_hash_init(desc))
778                 goto clear_hash;
779         if (tcp_v6_md5_hash_pseudoheader(hp, daddr, saddr, th->doff << 2))
780                 goto clear_hash;
781         if (tcp_md5_hash_header(hp, th))
782                 goto clear_hash;
783         if (tcp_md5_hash_key(hp, key))
784                 goto clear_hash;
785         if (crypto_hash_final(desc, md5_hash))
786                 goto clear_hash;
787
788         tcp_put_md5sig_pool();
789         return 0;
790
791 clear_hash:
792         tcp_put_md5sig_pool();
793 clear_hash_noput:
794         memset(md5_hash, 0, 16);
795         return 1;
796 }
797
798 static int tcp_v6_md5_hash_skb(char *md5_hash, struct tcp_md5sig_key *key,
799                                struct sock *sk, struct request_sock *req,
800                                struct sk_buff *skb)
801 {
802         struct in6_addr *saddr, *daddr;
803         struct tcp_md5sig_pool *hp;
804         struct hash_desc *desc;
805         struct tcphdr *th = tcp_hdr(skb);
806
807         if (sk) {
808                 saddr = &inet6_sk(sk)->saddr;
809                 daddr = &inet6_sk(sk)->daddr;
810         } else if (req) {
811                 saddr = &inet6_rsk(req)->loc_addr;
812                 daddr = &inet6_rsk(req)->rmt_addr;
813         } else {
814                 struct ipv6hdr *ip6h = ipv6_hdr(skb);
815                 saddr = &ip6h->saddr;
816                 daddr = &ip6h->daddr;
817         }
818
819         hp = tcp_get_md5sig_pool();
820         if (!hp)
821                 goto clear_hash_noput;
822         desc = &hp->md5_desc;
823
824         if (crypto_hash_init(desc))
825                 goto clear_hash;
826
827         if (tcp_v6_md5_hash_pseudoheader(hp, daddr, saddr, skb->len))
828                 goto clear_hash;
829         if (tcp_md5_hash_header(hp, th))
830                 goto clear_hash;
831         if (tcp_md5_hash_skb_data(hp, skb, th->doff << 2))
832                 goto clear_hash;
833         if (tcp_md5_hash_key(hp, key))
834                 goto clear_hash;
835         if (crypto_hash_final(desc, md5_hash))
836                 goto clear_hash;
837
838         tcp_put_md5sig_pool();
839         return 0;
840
841 clear_hash:
842         tcp_put_md5sig_pool();
843 clear_hash_noput:
844         memset(md5_hash, 0, 16);
845         return 1;
846 }
847
848 static int tcp_v6_inbound_md5_hash (struct sock *sk, struct sk_buff *skb)
849 {
850         __u8 *hash_location = NULL;
851         struct tcp_md5sig_key *hash_expected;
852         struct ipv6hdr *ip6h = ipv6_hdr(skb);
853         struct tcphdr *th = tcp_hdr(skb);
854         int genhash;
855         u8 newhash[16];
856
857         hash_expected = tcp_v6_md5_do_lookup(sk, &ip6h->saddr);
858         hash_location = tcp_parse_md5sig_option(th);
859
860         /* We've parsed the options - do we have a hash? */
861         if (!hash_expected && !hash_location)
862                 return 0;
863
864         if (hash_expected && !hash_location) {
865                 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPMD5NOTFOUND);
866                 return 1;
867         }
868
869         if (!hash_expected && hash_location) {
870                 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPMD5UNEXPECTED);
871                 return 1;
872         }
873
874         /* check the signature */
875         genhash = tcp_v6_md5_hash_skb(newhash,
876                                       hash_expected,
877                                       NULL, NULL, skb);
878
879         if (genhash || memcmp(hash_location, newhash, 16) != 0) {
880                 if (net_ratelimit()) {
881                         printk(KERN_INFO "MD5 Hash %s for [%pI6c]:%u->[%pI6c]:%u\n",
882                                genhash ? "failed" : "mismatch",
883                                &ip6h->saddr, ntohs(th->source),
884                                &ip6h->daddr, ntohs(th->dest));
885                 }
886                 return 1;
887         }
888         return 0;
889 }
890 #endif
891
892 struct request_sock_ops tcp6_request_sock_ops __read_mostly = {
893         .family         =       AF_INET6,
894         .obj_size       =       sizeof(struct tcp6_request_sock),
895         .rtx_syn_ack    =       tcp_v6_rtx_synack,
896         .send_ack       =       tcp_v6_reqsk_send_ack,
897         .destructor     =       tcp_v6_reqsk_destructor,
898         .send_reset     =       tcp_v6_send_reset,
899         .syn_ack_timeout =      tcp_syn_ack_timeout,
900 };
901
902 #ifdef CONFIG_TCP_MD5SIG
903 static const struct tcp_request_sock_ops tcp_request_sock_ipv6_ops = {
904         .md5_lookup     =       tcp_v6_reqsk_md5_lookup,
905         .calc_md5_hash  =       tcp_v6_md5_hash_skb,
906 };
907 #endif
908
909 static struct timewait_sock_ops tcp6_timewait_sock_ops = {
910         .twsk_obj_size  = sizeof(struct tcp6_timewait_sock),
911         .twsk_unique    = tcp_twsk_unique,
912         .twsk_destructor= tcp_twsk_destructor,
913 };
914
915 static void __tcp_v6_send_check(struct sk_buff *skb,
916                                 struct in6_addr *saddr, struct in6_addr *daddr)
917 {
918         struct tcphdr *th = tcp_hdr(skb);
919
920         if (skb->ip_summed == CHECKSUM_PARTIAL) {
921                 th->check = ~tcp_v6_check(skb->len, saddr, daddr, 0);
922                 skb->csum_start = skb_transport_header(skb) - skb->head;
923                 skb->csum_offset = offsetof(struct tcphdr, check);
924         } else {
925                 th->check = tcp_v6_check(skb->len, saddr, daddr,
926                                          csum_partial(th, th->doff << 2,
927                                                       skb->csum));
928         }
929 }
930
931 static void tcp_v6_send_check(struct sock *sk, struct sk_buff *skb)
932 {
933         struct ipv6_pinfo *np = inet6_sk(sk);
934
935         __tcp_v6_send_check(skb, &np->saddr, &np->daddr);
936 }
937
938 static int tcp_v6_gso_send_check(struct sk_buff *skb)
939 {
940         struct ipv6hdr *ipv6h;
941         struct tcphdr *th;
942
943         if (!pskb_may_pull(skb, sizeof(*th)))
944                 return -EINVAL;
945
946         ipv6h = ipv6_hdr(skb);
947         th = tcp_hdr(skb);
948
949         th->check = 0;
950         skb->ip_summed = CHECKSUM_PARTIAL;
951         __tcp_v6_send_check(skb, &ipv6h->saddr, &ipv6h->daddr);
952         return 0;
953 }
954
955 static struct sk_buff **tcp6_gro_receive(struct sk_buff **head,
956                                          struct sk_buff *skb)
957 {
958         struct ipv6hdr *iph = skb_gro_network_header(skb);
959
960         switch (skb->ip_summed) {
961         case CHECKSUM_COMPLETE:
962                 if (!tcp_v6_check(skb_gro_len(skb), &iph->saddr, &iph->daddr,
963                                   skb->csum)) {
964                         skb->ip_summed = CHECKSUM_UNNECESSARY;
965                         break;
966                 }
967
968                 /* fall through */
969         case CHECKSUM_NONE:
970                 NAPI_GRO_CB(skb)->flush = 1;
971                 return NULL;
972         }
973
974         return tcp_gro_receive(head, skb);
975 }
976
977 static int tcp6_gro_complete(struct sk_buff *skb)
978 {
979         struct ipv6hdr *iph = ipv6_hdr(skb);
980         struct tcphdr *th = tcp_hdr(skb);
981
982         th->check = ~tcp_v6_check(skb->len - skb_transport_offset(skb),
983                                   &iph->saddr, &iph->daddr, 0);
984         skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
985
986         return tcp_gro_complete(skb);
987 }
988
989 static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win,
990                                  u32 ts, struct tcp_md5sig_key *key, int rst)
991 {
992         struct tcphdr *th = tcp_hdr(skb), *t1;
993         struct sk_buff *buff;
994         struct flowi fl;
995         struct net *net = dev_net(skb_dst(skb)->dev);
996         struct sock *ctl_sk = net->ipv6.tcp_sk;
997         unsigned int tot_len = sizeof(struct tcphdr);
998         struct dst_entry *dst;
999         __be32 *topt;
1000
1001         if (ts)
1002                 tot_len += TCPOLEN_TSTAMP_ALIGNED;
1003 #ifdef CONFIG_TCP_MD5SIG
1004         if (key)
1005                 tot_len += TCPOLEN_MD5SIG_ALIGNED;
1006 #endif
1007
1008         buff = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) + tot_len,
1009                          GFP_ATOMIC);
1010         if (buff == NULL)
1011                 return;
1012
1013         skb_reserve(buff, MAX_HEADER + sizeof(struct ipv6hdr) + tot_len);
1014
1015         t1 = (struct tcphdr *) skb_push(buff, tot_len);
1016         skb_reset_transport_header(buff);
1017
1018         /* Swap the send and the receive. */
1019         memset(t1, 0, sizeof(*t1));
1020         t1->dest = th->source;
1021         t1->source = th->dest;
1022         t1->doff = tot_len / 4;
1023         t1->seq = htonl(seq);
1024         t1->ack_seq = htonl(ack);
1025         t1->ack = !rst || !th->ack;
1026         t1->rst = rst;
1027         t1->window = htons(win);
1028
1029         topt = (__be32 *)(t1 + 1);
1030
1031         if (ts) {
1032                 *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
1033                                 (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
1034                 *topt++ = htonl(tcp_time_stamp);
1035                 *topt++ = htonl(ts);
1036         }
1037
1038 #ifdef CONFIG_TCP_MD5SIG
1039         if (key) {
1040                 *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
1041                                 (TCPOPT_MD5SIG << 8) | TCPOLEN_MD5SIG);
1042                 tcp_v6_md5_hash_hdr((__u8 *)topt, key,
1043                                     &ipv6_hdr(skb)->saddr,
1044                                     &ipv6_hdr(skb)->daddr, t1);
1045         }
1046 #endif
1047
1048         memset(&fl, 0, sizeof(fl));
1049         ipv6_addr_copy(&fl.fl6_dst, &ipv6_hdr(skb)->saddr);
1050         ipv6_addr_copy(&fl.fl6_src, &ipv6_hdr(skb)->daddr);
1051
1052         buff->ip_summed = CHECKSUM_PARTIAL;
1053         buff->csum = 0;
1054
1055         __tcp_v6_send_check(buff, &fl.fl6_src, &fl.fl6_dst);
1056
1057         fl.proto = IPPROTO_TCP;
1058         fl.oif = inet6_iif(skb);
1059         fl.fl_ip_dport = t1->dest;
1060         fl.fl_ip_sport = t1->source;
1061         security_skb_classify_flow(skb, &fl);
1062
1063         /* Pass a socket to ip6_dst_lookup either it is for RST
1064          * Underlying function will use this to retrieve the network
1065          * namespace
1066          */
1067         if (!ip6_dst_lookup(ctl_sk, &dst, &fl)) {
1068                 if (xfrm_lookup(net, &dst, &fl, NULL, 0) >= 0) {
1069                         skb_dst_set(buff, dst);
1070                         ip6_xmit(ctl_sk, buff, &fl, NULL);
1071                         TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS);
1072                         if (rst)
1073                                 TCP_INC_STATS_BH(net, TCP_MIB_OUTRSTS);
1074                         return;
1075                 }
1076         }
1077
1078         kfree_skb(buff);
1079 }
1080
1081 static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
1082 {
1083         struct tcphdr *th = tcp_hdr(skb);
1084         u32 seq = 0, ack_seq = 0;
1085         struct tcp_md5sig_key *key = NULL;
1086
1087         if (th->rst)
1088                 return;
1089
1090         if (!ipv6_unicast_destination(skb))
1091                 return;
1092
1093 #ifdef CONFIG_TCP_MD5SIG
1094         if (sk)
1095                 key = tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr);
1096 #endif
1097
1098         if (th->ack)
1099                 seq = ntohl(th->ack_seq);
1100         else
1101                 ack_seq = ntohl(th->seq) + th->syn + th->fin + skb->len -
1102                           (th->doff << 2);
1103
1104         tcp_v6_send_response(skb, seq, ack_seq, 0, 0, key, 1);
1105 }
1106
1107 static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 ts,
1108                             struct tcp_md5sig_key *key)
1109 {
1110         tcp_v6_send_response(skb, seq, ack, win, ts, key, 0);
1111 }
1112
1113 static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
1114 {
1115         struct inet_timewait_sock *tw = inet_twsk(sk);
1116         struct tcp_timewait_sock *tcptw = tcp_twsk(sk);
1117
1118         tcp_v6_send_ack(skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt,
1119                         tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale,
1120                         tcptw->tw_ts_recent, tcp_twsk_md5_key(tcptw));
1121
1122         inet_twsk_put(tw);
1123 }
1124
1125 static void tcp_v6_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
1126                                   struct request_sock *req)
1127 {
1128         tcp_v6_send_ack(skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd, req->ts_recent,
1129                         tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr));
1130 }
1131
1132
1133 static struct sock *tcp_v6_hnd_req(struct sock *sk,struct sk_buff *skb)
1134 {
1135         struct request_sock *req, **prev;
1136         const struct tcphdr *th = tcp_hdr(skb);
1137         struct sock *nsk;
1138
1139         /* Find possible connection requests. */
1140         req = inet6_csk_search_req(sk, &prev, th->source,
1141                                    &ipv6_hdr(skb)->saddr,
1142                                    &ipv6_hdr(skb)->daddr, inet6_iif(skb));
1143         if (req)
1144                 return tcp_check_req(sk, skb, req, prev);
1145
1146         nsk = __inet6_lookup_established(sock_net(sk), &tcp_hashinfo,
1147                         &ipv6_hdr(skb)->saddr, th->source,
1148                         &ipv6_hdr(skb)->daddr, ntohs(th->dest), inet6_iif(skb));
1149
1150         if (nsk) {
1151                 if (nsk->sk_state != TCP_TIME_WAIT) {
1152                         bh_lock_sock(nsk);
1153                         return nsk;
1154                 }
1155                 inet_twsk_put(inet_twsk(nsk));
1156                 return NULL;
1157         }
1158
1159 #ifdef CONFIG_SYN_COOKIES
1160         if (!th->syn)
1161                 sk = cookie_v6_check(sk, skb);
1162 #endif
1163         return sk;
1164 }
1165
1166 /* FIXME: this is substantially similar to the ipv4 code.
1167  * Can some kind of merge be done? -- erics
1168  */
1169 static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
1170 {
1171         struct tcp_extend_values tmp_ext;
1172         struct tcp_options_received tmp_opt;
1173         u8 *hash_location;
1174         struct request_sock *req;
1175         struct inet6_request_sock *treq;
1176         struct ipv6_pinfo *np = inet6_sk(sk);
1177         struct tcp_sock *tp = tcp_sk(sk);
1178         __u32 isn = TCP_SKB_CB(skb)->when;
1179 #ifdef CONFIG_SYN_COOKIES
1180         int want_cookie = 0;
1181 #else
1182 #define want_cookie 0
1183 #endif
1184
1185         if (skb->protocol == htons(ETH_P_IP))
1186                 return tcp_v4_conn_request(sk, skb);
1187
1188         if (!ipv6_unicast_destination(skb))
1189                 goto drop;
1190
1191         if (inet_csk_reqsk_queue_is_full(sk) && !isn) {
1192                 if (net_ratelimit())
1193                         syn_flood_warning(skb);
1194 #ifdef CONFIG_SYN_COOKIES
1195                 if (sysctl_tcp_syncookies)
1196                         want_cookie = 1;
1197                 else
1198 #endif
1199                 goto drop;
1200         }
1201
1202         if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1)
1203                 goto drop;
1204
1205         req = inet6_reqsk_alloc(&tcp6_request_sock_ops);
1206         if (req == NULL)
1207                 goto drop;
1208
1209 #ifdef CONFIG_TCP_MD5SIG
1210         tcp_rsk(req)->af_specific = &tcp_request_sock_ipv6_ops;
1211 #endif
1212
1213         tcp_clear_options(&tmp_opt);
1214         tmp_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
1215         tmp_opt.user_mss = tp->rx_opt.user_mss;
1216         tcp_parse_options(skb, &tmp_opt, &hash_location, 0);
1217
1218         if (tmp_opt.cookie_plus > 0 &&
1219             tmp_opt.saw_tstamp &&
1220             !tp->rx_opt.cookie_out_never &&
1221             (sysctl_tcp_cookie_size > 0 ||
1222              (tp->cookie_values != NULL &&
1223               tp->cookie_values->cookie_desired > 0))) {
1224                 u8 *c;
1225                 u32 *d;
1226                 u32 *mess = &tmp_ext.cookie_bakery[COOKIE_DIGEST_WORDS];
1227                 int l = tmp_opt.cookie_plus - TCPOLEN_COOKIE_BASE;
1228
1229                 if (tcp_cookie_generator(&tmp_ext.cookie_bakery[0]) != 0)
1230                         goto drop_and_free;
1231
1232                 /* Secret recipe starts with IP addresses */
1233                 d = (__force u32 *)&ipv6_hdr(skb)->daddr.s6_addr32[0];
1234                 *mess++ ^= *d++;
1235                 *mess++ ^= *d++;
1236                 *mess++ ^= *d++;
1237                 *mess++ ^= *d++;
1238                 d = (__force u32 *)&ipv6_hdr(skb)->saddr.s6_addr32[0];
1239                 *mess++ ^= *d++;
1240                 *mess++ ^= *d++;
1241                 *mess++ ^= *d++;
1242                 *mess++ ^= *d++;
1243
1244                 /* plus variable length Initiator Cookie */
1245                 c = (u8 *)mess;
1246                 while (l-- > 0)
1247                         *c++ ^= *hash_location++;
1248
1249 #ifdef CONFIG_SYN_COOKIES
1250                 want_cookie = 0;        /* not our kind of cookie */
1251 #endif
1252                 tmp_ext.cookie_out_never = 0; /* false */
1253                 tmp_ext.cookie_plus = tmp_opt.cookie_plus;
1254         } else if (!tp->rx_opt.cookie_in_always) {
1255                 /* redundant indications, but ensure initialization. */
1256                 tmp_ext.cookie_out_never = 1; /* true */
1257                 tmp_ext.cookie_plus = 0;
1258         } else {
1259                 goto drop_and_free;
1260         }
1261         tmp_ext.cookie_in_always = tp->rx_opt.cookie_in_always;
1262
1263         if (want_cookie && !tmp_opt.saw_tstamp)
1264                 tcp_clear_options(&tmp_opt);
1265
1266         tmp_opt.tstamp_ok = tmp_opt.saw_tstamp;
1267         tcp_openreq_init(req, &tmp_opt, skb);
1268
1269         treq = inet6_rsk(req);
1270         ipv6_addr_copy(&treq->rmt_addr, &ipv6_hdr(skb)->saddr);
1271         ipv6_addr_copy(&treq->loc_addr, &ipv6_hdr(skb)->daddr);
1272         if (!want_cookie || tmp_opt.tstamp_ok)
1273                 TCP_ECN_create_request(req, tcp_hdr(skb));
1274
1275         if (!isn) {
1276                 if (ipv6_opt_accepted(sk, skb) ||
1277                     np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo ||
1278                     np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim) {
1279                         atomic_inc(&skb->users);
1280                         treq->pktopts = skb;
1281                 }
1282                 treq->iif = sk->sk_bound_dev_if;
1283
1284                 /* So that link locals have meaning */
1285                 if (!sk->sk_bound_dev_if &&
1286                     ipv6_addr_type(&treq->rmt_addr) & IPV6_ADDR_LINKLOCAL)
1287                         treq->iif = inet6_iif(skb);
1288                 if (!want_cookie) {
1289                         isn = tcp_v6_init_sequence(skb);
1290                 } else {
1291                         isn = cookie_v6_init_sequence(sk, skb, &req->mss);
1292                         req->cookie_ts = tmp_opt.tstamp_ok;
1293                 }
1294         }
1295         tcp_rsk(req)->snt_isn = isn;
1296
1297         security_inet_conn_request(sk, skb, req);
1298
1299         if (tcp_v6_send_synack(sk, req,
1300                                (struct request_values *)&tmp_ext) ||
1301             want_cookie)
1302                 goto drop_and_free;
1303
1304         inet6_csk_reqsk_queue_hash_add(sk, req, TCP_TIMEOUT_INIT);
1305         return 0;
1306
1307 drop_and_free:
1308         reqsk_free(req);
1309 drop:
1310         return 0; /* don't send reset */
1311 }
1312
1313 static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1314                                           struct request_sock *req,
1315                                           struct dst_entry *dst)
1316 {
1317         struct inet6_request_sock *treq;
1318         struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
1319         struct tcp6_sock *newtcp6sk;
1320         struct inet_sock *newinet;
1321         struct tcp_sock *newtp;
1322         struct sock *newsk;
1323         struct ipv6_txoptions *opt;
1324 #ifdef CONFIG_TCP_MD5SIG
1325         struct tcp_md5sig_key *key;
1326 #endif
1327
1328         if (skb->protocol == htons(ETH_P_IP)) {
1329                 /*
1330                  *      v6 mapped
1331                  */
1332
1333                 newsk = tcp_v4_syn_recv_sock(sk, skb, req, dst);
1334
1335                 if (newsk == NULL)
1336                         return NULL;
1337
1338                 newtcp6sk = (struct tcp6_sock *)newsk;
1339                 inet_sk(newsk)->pinet6 = &newtcp6sk->inet6;
1340
1341                 newinet = inet_sk(newsk);
1342                 newnp = inet6_sk(newsk);
1343                 newtp = tcp_sk(newsk);
1344
1345                 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1346
1347                 ipv6_addr_set_v4mapped(newinet->inet_daddr, &newnp->daddr);
1348
1349                 ipv6_addr_set_v4mapped(newinet->inet_saddr, &newnp->saddr);
1350
1351                 ipv6_addr_copy(&newnp->rcv_saddr, &newnp->saddr);
1352
1353                 inet_csk(newsk)->icsk_af_ops = &ipv6_mapped;
1354                 newsk->sk_backlog_rcv = tcp_v4_do_rcv;
1355 #ifdef CONFIG_TCP_MD5SIG
1356                 newtp->af_specific = &tcp_sock_ipv6_mapped_specific;
1357 #endif
1358
1359                 newnp->pktoptions  = NULL;
1360                 newnp->opt         = NULL;
1361                 newnp->mcast_oif   = inet6_iif(skb);
1362                 newnp->mcast_hops  = ipv6_hdr(skb)->hop_limit;
1363
1364                 /*
1365                  * No need to charge this sock to the relevant IPv6 refcnt debug socks count
1366                  * here, tcp_create_openreq_child now does this for us, see the comment in
1367                  * that function for the gory details. -acme
1368                  */
1369
1370                 /* It is tricky place. Until this moment IPv4 tcp
1371                    worked with IPv6 icsk.icsk_af_ops.
1372                    Sync it now.
1373                  */
1374                 tcp_sync_mss(newsk, inet_csk(newsk)->icsk_pmtu_cookie);
1375
1376                 return newsk;
1377         }
1378
1379         treq = inet6_rsk(req);
1380         opt = np->opt;
1381
1382         if (sk_acceptq_is_full(sk))
1383                 goto out_overflow;
1384
1385         if (dst == NULL) {
1386                 struct in6_addr *final_p, final;
1387                 struct flowi fl;
1388
1389                 memset(&fl, 0, sizeof(fl));
1390                 fl.proto = IPPROTO_TCP;
1391                 ipv6_addr_copy(&fl.fl6_dst, &treq->rmt_addr);
1392                 final_p = fl6_update_dst(&fl, opt, &final);
1393                 ipv6_addr_copy(&fl.fl6_src, &treq->loc_addr);
1394                 fl.oif = sk->sk_bound_dev_if;
1395                 fl.mark = sk->sk_mark;
1396                 fl.fl_ip_dport = inet_rsk(req)->rmt_port;
1397                 fl.fl_ip_sport = inet_rsk(req)->loc_port;
1398                 security_req_classify_flow(req, &fl);
1399
1400                 if (ip6_dst_lookup(sk, &dst, &fl))
1401                         goto out;
1402
1403                 if (final_p)
1404                         ipv6_addr_copy(&fl.fl6_dst, final_p);
1405
1406                 if ((xfrm_lookup(sock_net(sk), &dst, &fl, sk, 0)) < 0)
1407                         goto out;
1408         }
1409
1410         newsk = tcp_create_openreq_child(sk, req, skb);
1411         if (newsk == NULL)
1412                 goto out;
1413
1414         /*
1415          * No need to charge this sock to the relevant IPv6 refcnt debug socks
1416          * count here, tcp_create_openreq_child now does this for us, see the
1417          * comment in that function for the gory details. -acme
1418          */
1419
1420         newsk->sk_gso_type = SKB_GSO_TCPV6;
1421         __ip6_dst_store(newsk, dst, NULL, NULL);
1422
1423         newtcp6sk = (struct tcp6_sock *)newsk;
1424         inet_sk(newsk)->pinet6 = &newtcp6sk->inet6;
1425
1426         newtp = tcp_sk(newsk);
1427         newinet = inet_sk(newsk);
1428         newnp = inet6_sk(newsk);
1429
1430         memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1431
1432         ipv6_addr_copy(&newnp->daddr, &treq->rmt_addr);
1433         ipv6_addr_copy(&newnp->saddr, &treq->loc_addr);
1434         ipv6_addr_copy(&newnp->rcv_saddr, &treq->loc_addr);
1435         newsk->sk_bound_dev_if = treq->iif;
1436
1437         /* Now IPv6 options...
1438
1439            First: no IPv4 options.
1440          */
1441         newinet->opt = NULL;
1442         newnp->ipv6_fl_list = NULL;
1443
1444         /* Clone RX bits */
1445         newnp->rxopt.all = np->rxopt.all;
1446
1447         /* Clone pktoptions received with SYN */
1448         newnp->pktoptions = NULL;
1449         if (treq->pktopts != NULL) {
1450                 newnp->pktoptions = skb_clone(treq->pktopts, GFP_ATOMIC);
1451                 kfree_skb(treq->pktopts);
1452                 treq->pktopts = NULL;
1453                 if (newnp->pktoptions)
1454                         skb_set_owner_r(newnp->pktoptions, newsk);
1455         }
1456         newnp->opt        = NULL;
1457         newnp->mcast_oif  = inet6_iif(skb);
1458         newnp->mcast_hops = ipv6_hdr(skb)->hop_limit;
1459
1460         /* Clone native IPv6 options from listening socket (if any)
1461
1462            Yes, keeping reference count would be much more clever,
1463            but we make one more one thing there: reattach optmem
1464            to newsk.
1465          */
1466         if (opt) {
1467                 newnp->opt = ipv6_dup_options(newsk, opt);
1468                 if (opt != np->opt)
1469                         sock_kfree_s(sk, opt, opt->tot_len);
1470         }
1471
1472         inet_csk(newsk)->icsk_ext_hdr_len = 0;
1473         if (newnp->opt)
1474                 inet_csk(newsk)->icsk_ext_hdr_len = (newnp->opt->opt_nflen +
1475                                                      newnp->opt->opt_flen);
1476
1477         tcp_mtup_init(newsk);
1478         tcp_sync_mss(newsk, dst_mtu(dst));
1479         newtp->advmss = dst_metric(dst, RTAX_ADVMSS);
1480         tcp_initialize_rcv_mss(newsk);
1481
1482         newinet->inet_daddr = newinet->inet_saddr = LOOPBACK4_IPV6;
1483         newinet->inet_rcv_saddr = LOOPBACK4_IPV6;
1484
1485 #ifdef CONFIG_TCP_MD5SIG
1486         /* Copy over the MD5 key from the original socket */
1487         if ((key = tcp_v6_md5_do_lookup(sk, &newnp->daddr)) != NULL) {
1488                 /* We're using one, so create a matching key
1489                  * on the newsk structure. If we fail to get
1490                  * memory, then we end up not copying the key
1491                  * across. Shucks.
1492                  */
1493                 char *newkey = kmemdup(key->key, key->keylen, GFP_ATOMIC);
1494                 if (newkey != NULL)
1495                         tcp_v6_md5_do_add(newsk, &newnp->daddr,
1496                                           newkey, key->keylen);
1497         }
1498 #endif
1499
1500         __inet6_hash(newsk, NULL);
1501         __inet_inherit_port(sk, newsk);
1502
1503         return newsk;
1504
1505 out_overflow:
1506         NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS);
1507 out:
1508         NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS);
1509         if (opt && opt != np->opt)
1510                 sock_kfree_s(sk, opt, opt->tot_len);
1511         dst_release(dst);
1512         return NULL;
1513 }
1514
1515 static __sum16 tcp_v6_checksum_init(struct sk_buff *skb)
1516 {
1517         if (skb->ip_summed == CHECKSUM_COMPLETE) {
1518                 if (!tcp_v6_check(skb->len, &ipv6_hdr(skb)->saddr,
1519                                   &ipv6_hdr(skb)->daddr, skb->csum)) {
1520                         skb->ip_summed = CHECKSUM_UNNECESSARY;
1521                         return 0;
1522                 }
1523         }
1524
1525         skb->csum = ~csum_unfold(tcp_v6_check(skb->len,
1526                                               &ipv6_hdr(skb)->saddr,
1527                                               &ipv6_hdr(skb)->daddr, 0));
1528
1529         if (skb->len <= 76) {
1530                 return __skb_checksum_complete(skb);
1531         }
1532         return 0;
1533 }
1534
1535 /* The socket must have it's spinlock held when we get
1536  * here.
1537  *
1538  * We have a potential double-lock case here, so even when
1539  * doing backlog processing we use the BH locking scheme.
1540  * This is because we cannot sleep with the original spinlock
1541  * held.
1542  */
1543 static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
1544 {
1545         struct ipv6_pinfo *np = inet6_sk(sk);
1546         struct tcp_sock *tp;
1547         struct sk_buff *opt_skb = NULL;
1548
1549         /* Imagine: socket is IPv6. IPv4 packet arrives,
1550            goes to IPv4 receive handler and backlogged.
1551            From backlog it always goes here. Kerboom...
1552            Fortunately, tcp_rcv_established and rcv_established
1553            handle them correctly, but it is not case with
1554            tcp_v6_hnd_req and tcp_v6_send_reset().   --ANK
1555          */
1556
1557         if (skb->protocol == htons(ETH_P_IP))
1558                 return tcp_v4_do_rcv(sk, skb);
1559
1560 #ifdef CONFIG_TCP_MD5SIG
1561         if (tcp_v6_inbound_md5_hash (sk, skb))
1562                 goto discard;
1563 #endif
1564
1565         if (sk_filter(sk, skb))
1566                 goto discard;
1567
1568         /*
1569          *      socket locking is here for SMP purposes as backlog rcv
1570          *      is currently called with bh processing disabled.
1571          */
1572
1573         /* Do Stevens' IPV6_PKTOPTIONS.
1574
1575            Yes, guys, it is the only place in our code, where we
1576            may make it not affecting IPv4.
1577            The rest of code is protocol independent,
1578            and I do not like idea to uglify IPv4.
1579
1580            Actually, all the idea behind IPV6_PKTOPTIONS
1581            looks not very well thought. For now we latch
1582            options, received in the last packet, enqueued
1583            by tcp. Feel free to propose better solution.
1584                                                --ANK (980728)
1585          */
1586         if (np->rxopt.all)
1587                 opt_skb = skb_clone(skb, GFP_ATOMIC);
1588
1589         if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */
1590                 TCP_CHECK_TIMER(sk);
1591                 if (tcp_rcv_established(sk, skb, tcp_hdr(skb), skb->len))
1592                         goto reset;
1593                 TCP_CHECK_TIMER(sk);
1594                 if (opt_skb)
1595                         goto ipv6_pktoptions;
1596                 return 0;
1597         }
1598
1599         if (skb->len < tcp_hdrlen(skb) || tcp_checksum_complete(skb))
1600                 goto csum_err;
1601
1602         if (sk->sk_state == TCP_LISTEN) {
1603                 struct sock *nsk = tcp_v6_hnd_req(sk, skb);
1604                 if (!nsk)
1605                         goto discard;
1606
1607                 /*
1608                  * Queue it on the new socket if the new socket is active,
1609                  * otherwise we just shortcircuit this and continue with
1610                  * the new socket..
1611                  */
1612                 if(nsk != sk) {
1613                         if (tcp_child_process(sk, nsk, skb))
1614                                 goto reset;
1615                         if (opt_skb)
1616                                 __kfree_skb(opt_skb);
1617                         return 0;
1618                 }
1619         }
1620
1621         TCP_CHECK_TIMER(sk);
1622         if (tcp_rcv_state_process(sk, skb, tcp_hdr(skb), skb->len))
1623                 goto reset;
1624         TCP_CHECK_TIMER(sk);
1625         if (opt_skb)
1626                 goto ipv6_pktoptions;
1627         return 0;
1628
1629 reset:
1630         tcp_v6_send_reset(sk, skb);
1631 discard:
1632         if (opt_skb)
1633                 __kfree_skb(opt_skb);
1634         kfree_skb(skb);
1635         return 0;
1636 csum_err:
1637         TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_INERRS);
1638         goto discard;
1639
1640
1641 ipv6_pktoptions:
1642         /* Do you ask, what is it?
1643
1644            1. skb was enqueued by tcp.
1645            2. skb is added to tail of read queue, rather than out of order.
1646            3. socket is not in passive state.
1647            4. Finally, it really contains options, which user wants to receive.
1648          */
1649         tp = tcp_sk(sk);
1650         if (TCP_SKB_CB(opt_skb)->end_seq == tp->rcv_nxt &&
1651             !((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) {
1652                 if (np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo)
1653                         np->mcast_oif = inet6_iif(opt_skb);
1654                 if (np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim)
1655                         np->mcast_hops = ipv6_hdr(opt_skb)->hop_limit;
1656                 if (ipv6_opt_accepted(sk, opt_skb)) {
1657                         skb_set_owner_r(opt_skb, sk);
1658                         opt_skb = xchg(&np->pktoptions, opt_skb);
1659                 } else {
1660                         __kfree_skb(opt_skb);
1661                         opt_skb = xchg(&np->pktoptions, NULL);
1662                 }
1663         }
1664
1665         kfree_skb(opt_skb);
1666         return 0;
1667 }
1668
1669 static int tcp_v6_rcv(struct sk_buff *skb)
1670 {
1671         struct tcphdr *th;
1672         struct ipv6hdr *hdr;
1673         struct sock *sk;
1674         int ret;
1675         struct net *net = dev_net(skb->dev);
1676
1677         if (skb->pkt_type != PACKET_HOST)
1678                 goto discard_it;
1679
1680         /*
1681          *      Count it even if it's bad.
1682          */
1683         TCP_INC_STATS_BH(net, TCP_MIB_INSEGS);
1684
1685         if (!pskb_may_pull(skb, sizeof(struct tcphdr)))
1686                 goto discard_it;
1687
1688         th = tcp_hdr(skb);
1689
1690         if (th->doff < sizeof(struct tcphdr)/4)
1691                 goto bad_packet;
1692         if (!pskb_may_pull(skb, th->doff*4))
1693                 goto discard_it;
1694
1695         if (!skb_csum_unnecessary(skb) && tcp_v6_checksum_init(skb))
1696                 goto bad_packet;
1697
1698         th = tcp_hdr(skb);
1699         hdr = ipv6_hdr(skb);
1700         TCP_SKB_CB(skb)->seq = ntohl(th->seq);
1701         TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin +
1702                                     skb->len - th->doff*4);
1703         TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq);
1704         TCP_SKB_CB(skb)->when = 0;
1705         TCP_SKB_CB(skb)->flags = ipv6_get_dsfield(hdr);
1706         TCP_SKB_CB(skb)->sacked = 0;
1707
1708         sk = __inet6_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest);
1709         if (!sk)
1710                 goto no_tcp_socket;
1711
1712 process:
1713         if (sk->sk_state == TCP_TIME_WAIT)
1714                 goto do_time_wait;
1715
1716         if (hdr->hop_limit < inet6_sk(sk)->min_hopcount) {
1717                 NET_INC_STATS_BH(net, LINUX_MIB_TCPMINTTLDROP);
1718                 goto discard_and_relse;
1719         }
1720
1721         if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
1722                 goto discard_and_relse;
1723
1724         if (sk_filter(sk, skb))
1725                 goto discard_and_relse;
1726
1727         skb->dev = NULL;
1728
1729         bh_lock_sock_nested(sk);
1730         ret = 0;
1731         if (!sock_owned_by_user(sk)) {
1732 #ifdef CONFIG_NET_DMA
1733                 struct tcp_sock *tp = tcp_sk(sk);
1734                 if (!tp->ucopy.dma_chan && tp->ucopy.pinned_list)
1735                         tp->ucopy.dma_chan = dma_find_channel(DMA_MEMCPY);
1736                 if (tp->ucopy.dma_chan)
1737                         ret = tcp_v6_do_rcv(sk, skb);
1738                 else
1739 #endif
1740                 {
1741                         if (!tcp_prequeue(sk, skb))
1742                                 ret = tcp_v6_do_rcv(sk, skb);
1743                 }
1744         } else if (unlikely(sk_add_backlog(sk, skb))) {
1745                 bh_unlock_sock(sk);
1746                 NET_INC_STATS_BH(net, LINUX_MIB_TCPBACKLOGDROP);
1747                 goto discard_and_relse;
1748         }
1749         bh_unlock_sock(sk);
1750
1751         sock_put(sk);
1752         return ret ? -1 : 0;
1753
1754 no_tcp_socket:
1755         if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
1756                 goto discard_it;
1757
1758         if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) {
1759 bad_packet:
1760                 TCP_INC_STATS_BH(net, TCP_MIB_INERRS);
1761         } else {
1762                 tcp_v6_send_reset(NULL, skb);
1763         }
1764
1765 discard_it:
1766
1767         /*
1768          *      Discard frame
1769          */
1770
1771         kfree_skb(skb);
1772         return 0;
1773
1774 discard_and_relse:
1775         sock_put(sk);
1776         goto discard_it;
1777
1778 do_time_wait:
1779         if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
1780                 inet_twsk_put(inet_twsk(sk));
1781                 goto discard_it;
1782         }
1783
1784         if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) {
1785                 TCP_INC_STATS_BH(net, TCP_MIB_INERRS);
1786                 inet_twsk_put(inet_twsk(sk));
1787                 goto discard_it;
1788         }
1789
1790         switch (tcp_timewait_state_process(inet_twsk(sk), skb, th)) {
1791         case TCP_TW_SYN:
1792         {
1793                 struct sock *sk2;
1794
1795                 sk2 = inet6_lookup_listener(dev_net(skb->dev), &tcp_hashinfo,
1796                                             &ipv6_hdr(skb)->daddr,
1797                                             ntohs(th->dest), inet6_iif(skb));
1798                 if (sk2 != NULL) {
1799                         struct inet_timewait_sock *tw = inet_twsk(sk);
1800                         inet_twsk_deschedule(tw, &tcp_death_row);
1801                         inet_twsk_put(tw);
1802                         sk = sk2;
1803                         goto process;
1804                 }
1805                 /* Fall through to ACK */
1806         }
1807         case TCP_TW_ACK:
1808                 tcp_v6_timewait_ack(sk, skb);
1809                 break;
1810         case TCP_TW_RST:
1811                 goto no_tcp_socket;
1812         case TCP_TW_SUCCESS:;
1813         }
1814         goto discard_it;
1815 }
1816
1817 static int tcp_v6_remember_stamp(struct sock *sk)
1818 {
1819         /* Alas, not yet... */
1820         return 0;
1821 }
1822
1823 static const struct inet_connection_sock_af_ops ipv6_specific = {
1824         .queue_xmit        = inet6_csk_xmit,
1825         .send_check        = tcp_v6_send_check,
1826         .rebuild_header    = inet6_sk_rebuild_header,
1827         .conn_request      = tcp_v6_conn_request,
1828         .syn_recv_sock     = tcp_v6_syn_recv_sock,
1829         .remember_stamp    = tcp_v6_remember_stamp,
1830         .net_header_len    = sizeof(struct ipv6hdr),
1831         .setsockopt        = ipv6_setsockopt,
1832         .getsockopt        = ipv6_getsockopt,
1833         .addr2sockaddr     = inet6_csk_addr2sockaddr,
1834         .sockaddr_len      = sizeof(struct sockaddr_in6),
1835         .bind_conflict     = inet6_csk_bind_conflict,
1836 #ifdef CONFIG_COMPAT
1837         .compat_setsockopt = compat_ipv6_setsockopt,
1838         .compat_getsockopt = compat_ipv6_getsockopt,
1839 #endif
1840 };
1841
1842 #ifdef CONFIG_TCP_MD5SIG
1843 static const struct tcp_sock_af_ops tcp_sock_ipv6_specific = {
1844         .md5_lookup     =       tcp_v6_md5_lookup,
1845         .calc_md5_hash  =       tcp_v6_md5_hash_skb,
1846         .md5_add        =       tcp_v6_md5_add_func,
1847         .md5_parse      =       tcp_v6_parse_md5_keys,
1848 };
1849 #endif
1850
1851 /*
1852  *      TCP over IPv4 via INET6 API
1853  */
1854
1855 static const struct inet_connection_sock_af_ops ipv6_mapped = {
1856         .queue_xmit        = ip_queue_xmit,
1857         .send_check        = tcp_v4_send_check,
1858         .rebuild_header    = inet_sk_rebuild_header,
1859         .conn_request      = tcp_v6_conn_request,
1860         .syn_recv_sock     = tcp_v6_syn_recv_sock,
1861         .remember_stamp    = tcp_v4_remember_stamp,
1862         .net_header_len    = sizeof(struct iphdr),
1863         .setsockopt        = ipv6_setsockopt,
1864         .getsockopt        = ipv6_getsockopt,
1865         .addr2sockaddr     = inet6_csk_addr2sockaddr,
1866         .sockaddr_len      = sizeof(struct sockaddr_in6),
1867         .bind_conflict     = inet6_csk_bind_conflict,
1868 #ifdef CONFIG_COMPAT
1869         .compat_setsockopt = compat_ipv6_setsockopt,
1870         .compat_getsockopt = compat_ipv6_getsockopt,
1871 #endif
1872 };
1873
1874 #ifdef CONFIG_TCP_MD5SIG
1875 static const struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific = {
1876         .md5_lookup     =       tcp_v4_md5_lookup,
1877         .calc_md5_hash  =       tcp_v4_md5_hash_skb,
1878         .md5_add        =       tcp_v6_md5_add_func,
1879         .md5_parse      =       tcp_v6_parse_md5_keys,
1880 };
1881 #endif
1882
1883 /* NOTE: A lot of things set to zero explicitly by call to
1884  *       sk_alloc() so need not be done here.
1885  */
1886 static int tcp_v6_init_sock(struct sock *sk)
1887 {
1888         struct inet_connection_sock *icsk = inet_csk(sk);
1889         struct tcp_sock *tp = tcp_sk(sk);
1890
1891         skb_queue_head_init(&tp->out_of_order_queue);
1892         tcp_init_xmit_timers(sk);
1893         tcp_prequeue_init(tp);
1894
1895         icsk->icsk_rto = TCP_TIMEOUT_INIT;
1896         tp->mdev = TCP_TIMEOUT_INIT;
1897
1898         /* So many TCP implementations out there (incorrectly) count the
1899          * initial SYN frame in their delayed-ACK and congestion control
1900          * algorithms that we must have the following bandaid to talk
1901          * efficiently to them.  -DaveM
1902          */
1903         tp->snd_cwnd = 2;
1904
1905         /* See draft-stevens-tcpca-spec-01 for discussion of the
1906          * initialization of these values.
1907          */
1908         tp->snd_ssthresh = TCP_INFINITE_SSTHRESH;
1909         tp->snd_cwnd_clamp = ~0;
1910         tp->mss_cache = TCP_MSS_DEFAULT;
1911
1912         tp->reordering = sysctl_tcp_reordering;
1913
1914         sk->sk_state = TCP_CLOSE;
1915
1916         icsk->icsk_af_ops = &ipv6_specific;
1917         icsk->icsk_ca_ops = &tcp_init_congestion_ops;
1918         icsk->icsk_sync_mss = tcp_sync_mss;
1919         sk->sk_write_space = sk_stream_write_space;
1920         sock_set_flag(sk, SOCK_USE_WRITE_QUEUE);
1921
1922 #ifdef CONFIG_TCP_MD5SIG
1923         tp->af_specific = &tcp_sock_ipv6_specific;
1924 #endif
1925
1926         /* TCP Cookie Transactions */
1927         if (sysctl_tcp_cookie_size > 0) {
1928                 /* Default, cookies without s_data_payload. */
1929                 tp->cookie_values =
1930                         kzalloc(sizeof(*tp->cookie_values),
1931                                 sk->sk_allocation);
1932                 if (tp->cookie_values != NULL)
1933                         kref_init(&tp->cookie_values->kref);
1934         }
1935         /* Presumed zeroed, in order of appearance:
1936          *      cookie_in_always, cookie_out_never,
1937          *      s_data_constant, s_data_in, s_data_out
1938          */
1939         sk->sk_sndbuf = sysctl_tcp_wmem[1];
1940         sk->sk_rcvbuf = sysctl_tcp_rmem[1];
1941
1942         local_bh_disable();
1943         percpu_counter_inc(&tcp_sockets_allocated);
1944         local_bh_enable();
1945
1946         return 0;
1947 }
1948
1949 static void tcp_v6_destroy_sock(struct sock *sk)
1950 {
1951 #ifdef CONFIG_TCP_MD5SIG
1952         /* Clean up the MD5 key list */
1953         if (tcp_sk(sk)->md5sig_info)
1954                 tcp_v6_clear_md5_list(sk);
1955 #endif
1956         tcp_v4_destroy_sock(sk);
1957         inet6_destroy_sock(sk);
1958 }
1959
1960 #ifdef CONFIG_PROC_FS
1961 /* Proc filesystem TCPv6 sock list dumping. */
1962 static void get_openreq6(struct seq_file *seq,
1963                          struct sock *sk, struct request_sock *req, int i, int uid)
1964 {
1965         int ttd = req->expires - jiffies;
1966         struct in6_addr *src = &inet6_rsk(req)->loc_addr;
1967         struct in6_addr *dest = &inet6_rsk(req)->rmt_addr;
1968
1969         if (ttd < 0)
1970                 ttd = 0;
1971
1972         seq_printf(seq,
1973                    "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
1974                    "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p\n",
1975                    i,
1976                    src->s6_addr32[0], src->s6_addr32[1],
1977                    src->s6_addr32[2], src->s6_addr32[3],
1978                    ntohs(inet_rsk(req)->loc_port),
1979                    dest->s6_addr32[0], dest->s6_addr32[1],
1980                    dest->s6_addr32[2], dest->s6_addr32[3],
1981                    ntohs(inet_rsk(req)->rmt_port),
1982                    TCP_SYN_RECV,
1983                    0,0, /* could print option size, but that is af dependent. */
1984                    1,   /* timers active (only the expire timer) */
1985                    jiffies_to_clock_t(ttd),
1986                    req->retrans,
1987                    uid,
1988                    0,  /* non standard timer */
1989                    0, /* open_requests have no inode */
1990                    0, req);
1991 }
1992
1993 static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)
1994 {
1995         struct in6_addr *dest, *src;
1996         __u16 destp, srcp;
1997         int timer_active;
1998         unsigned long timer_expires;
1999         struct inet_sock *inet = inet_sk(sp);
2000         struct tcp_sock *tp = tcp_sk(sp);
2001         const struct inet_connection_sock *icsk = inet_csk(sp);
2002         struct ipv6_pinfo *np = inet6_sk(sp);
2003
2004         dest  = &np->daddr;
2005         src   = &np->rcv_saddr;
2006         destp = ntohs(inet->inet_dport);
2007         srcp  = ntohs(inet->inet_sport);
2008
2009         if (icsk->icsk_pending == ICSK_TIME_RETRANS) {
2010                 timer_active    = 1;
2011                 timer_expires   = icsk->icsk_timeout;
2012         } else if (icsk->icsk_pending == ICSK_TIME_PROBE0) {
2013                 timer_active    = 4;
2014                 timer_expires   = icsk->icsk_timeout;
2015         } else if (timer_pending(&sp->sk_timer)) {
2016                 timer_active    = 2;
2017                 timer_expires   = sp->sk_timer.expires;
2018         } else {
2019                 timer_active    = 0;
2020                 timer_expires = jiffies;
2021         }
2022
2023         seq_printf(seq,
2024                    "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
2025                    "%02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %lu %lu %u %u %d\n",
2026                    i,
2027                    src->s6_addr32[0], src->s6_addr32[1],
2028                    src->s6_addr32[2], src->s6_addr32[3], srcp,
2029                    dest->s6_addr32[0], dest->s6_addr32[1],
2030                    dest->s6_addr32[2], dest->s6_addr32[3], destp,
2031                    sp->sk_state,
2032                    tp->write_seq-tp->snd_una,
2033                    (sp->sk_state == TCP_LISTEN) ? sp->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq),
2034                    timer_active,
2035                    jiffies_to_clock_t(timer_expires - jiffies),
2036                    icsk->icsk_retransmits,
2037                    sock_i_uid(sp),
2038                    icsk->icsk_probes_out,
2039                    sock_i_ino(sp),
2040                    atomic_read(&sp->sk_refcnt), sp,
2041                    jiffies_to_clock_t(icsk->icsk_rto),
2042                    jiffies_to_clock_t(icsk->icsk_ack.ato),
2043                    (icsk->icsk_ack.quick << 1 ) | icsk->icsk_ack.pingpong,
2044                    tp->snd_cwnd,
2045                    tcp_in_initial_slowstart(tp) ? -1 : tp->snd_ssthresh
2046                    );
2047 }
2048
2049 static void get_timewait6_sock(struct seq_file *seq,
2050                                struct inet_timewait_sock *tw, int i)
2051 {
2052         struct in6_addr *dest, *src;
2053         __u16 destp, srcp;
2054         struct inet6_timewait_sock *tw6 = inet6_twsk((struct sock *)tw);
2055         int ttd = tw->tw_ttd - jiffies;
2056
2057         if (ttd < 0)
2058                 ttd = 0;
2059
2060         dest = &tw6->tw_v6_daddr;
2061         src  = &tw6->tw_v6_rcv_saddr;
2062         destp = ntohs(tw->tw_dport);
2063         srcp  = ntohs(tw->tw_sport);
2064
2065         seq_printf(seq,
2066                    "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
2067                    "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p\n",
2068                    i,
2069                    src->s6_addr32[0], src->s6_addr32[1],
2070                    src->s6_addr32[2], src->s6_addr32[3], srcp,
2071                    dest->s6_addr32[0], dest->s6_addr32[1],
2072                    dest->s6_addr32[2], dest->s6_addr32[3], destp,
2073                    tw->tw_substate, 0, 0,
2074                    3, jiffies_to_clock_t(ttd), 0, 0, 0, 0,
2075                    atomic_read(&tw->tw_refcnt), tw);
2076 }
2077
2078 static int tcp6_seq_show(struct seq_file *seq, void *v)
2079 {
2080         struct tcp_iter_state *st;
2081
2082         if (v == SEQ_START_TOKEN) {
2083                 seq_puts(seq,
2084                          "  sl  "
2085                          "local_address                         "
2086                          "remote_address                        "
2087                          "st tx_queue rx_queue tr tm->when retrnsmt"
2088                          "   uid  timeout inode\n");
2089                 goto out;
2090         }
2091         st = seq->private;
2092
2093         switch (st->state) {
2094         case TCP_SEQ_STATE_LISTENING:
2095         case TCP_SEQ_STATE_ESTABLISHED:
2096                 get_tcp6_sock(seq, v, st->num);
2097                 break;
2098         case TCP_SEQ_STATE_OPENREQ:
2099                 get_openreq6(seq, st->syn_wait_sk, v, st->num, st->uid);
2100                 break;
2101         case TCP_SEQ_STATE_TIME_WAIT:
2102                 get_timewait6_sock(seq, v, st->num);
2103                 break;
2104         }
2105 out:
2106         return 0;
2107 }
2108
2109 static struct tcp_seq_afinfo tcp6_seq_afinfo = {
2110         .name           = "tcp6",
2111         .family         = AF_INET6,
2112         .seq_fops       = {
2113                 .owner          = THIS_MODULE,
2114         },
2115         .seq_ops        = {
2116                 .show           = tcp6_seq_show,
2117         },
2118 };
2119
2120 int __net_init tcp6_proc_init(struct net *net)
2121 {
2122         return tcp_proc_register(net, &tcp6_seq_afinfo);
2123 }
2124
2125 void tcp6_proc_exit(struct net *net)
2126 {
2127         tcp_proc_unregister(net, &tcp6_seq_afinfo);
2128 }
2129 #endif
2130
2131 struct proto tcpv6_prot = {
2132         .name                   = "TCPv6",
2133         .owner                  = THIS_MODULE,
2134         .close                  = tcp_close,
2135         .connect                = tcp_v6_connect,
2136         .disconnect             = tcp_disconnect,
2137         .accept                 = inet_csk_accept,
2138         .ioctl                  = tcp_ioctl,
2139         .init                   = tcp_v6_init_sock,
2140         .destroy                = tcp_v6_destroy_sock,
2141         .shutdown               = tcp_shutdown,
2142         .setsockopt             = tcp_setsockopt,
2143         .getsockopt             = tcp_getsockopt,
2144         .recvmsg                = tcp_recvmsg,
2145         .sendmsg                = tcp_sendmsg,
2146         .sendpage               = tcp_sendpage,
2147         .backlog_rcv            = tcp_v6_do_rcv,
2148         .hash                   = tcp_v6_hash,
2149         .unhash                 = inet_unhash,
2150         .get_port               = inet_csk_get_port,
2151         .enter_memory_pressure  = tcp_enter_memory_pressure,
2152         .sockets_allocated      = &tcp_sockets_allocated,
2153         .memory_allocated       = &tcp_memory_allocated,
2154         .memory_pressure        = &tcp_memory_pressure,
2155         .orphan_count           = &tcp_orphan_count,
2156         .sysctl_mem             = sysctl_tcp_mem,
2157         .sysctl_wmem            = sysctl_tcp_wmem,
2158         .sysctl_rmem            = sysctl_tcp_rmem,
2159         .max_header             = MAX_TCP_HEADER,
2160         .obj_size               = sizeof(struct tcp6_sock),
2161         .slab_flags             = SLAB_DESTROY_BY_RCU,
2162         .twsk_prot              = &tcp6_timewait_sock_ops,
2163         .rsk_prot               = &tcp6_request_sock_ops,
2164         .h.hashinfo             = &tcp_hashinfo,
2165         .no_autobind            = true,
2166 #ifdef CONFIG_COMPAT
2167         .compat_setsockopt      = compat_tcp_setsockopt,
2168         .compat_getsockopt      = compat_tcp_getsockopt,
2169 #endif
2170 };
2171
2172 static const struct inet6_protocol tcpv6_protocol = {
2173         .handler        =       tcp_v6_rcv,
2174         .err_handler    =       tcp_v6_err,
2175         .gso_send_check =       tcp_v6_gso_send_check,
2176         .gso_segment    =       tcp_tso_segment,
2177         .gro_receive    =       tcp6_gro_receive,
2178         .gro_complete   =       tcp6_gro_complete,
2179         .flags          =       INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
2180 };
2181
2182 static struct inet_protosw tcpv6_protosw = {
2183         .type           =       SOCK_STREAM,
2184         .protocol       =       IPPROTO_TCP,
2185         .prot           =       &tcpv6_prot,
2186         .ops            =       &inet6_stream_ops,
2187         .no_check       =       0,
2188         .flags          =       INET_PROTOSW_PERMANENT |
2189                                 INET_PROTOSW_ICSK,
2190 };
2191
2192 static int __net_init tcpv6_net_init(struct net *net)
2193 {
2194         return inet_ctl_sock_create(&net->ipv6.tcp_sk, PF_INET6,
2195                                     SOCK_RAW, IPPROTO_TCP, net);
2196 }
2197
2198 static void __net_exit tcpv6_net_exit(struct net *net)
2199 {
2200         inet_ctl_sock_destroy(net->ipv6.tcp_sk);
2201 }
2202
2203 static void __net_exit tcpv6_net_exit_batch(struct list_head *net_exit_list)
2204 {
2205         inet_twsk_purge(&tcp_hashinfo, &tcp_death_row, AF_INET6);
2206 }
2207
2208 static struct pernet_operations tcpv6_net_ops = {
2209         .init       = tcpv6_net_init,
2210         .exit       = tcpv6_net_exit,
2211         .exit_batch = tcpv6_net_exit_batch,
2212 };
2213
2214 int __init tcpv6_init(void)
2215 {
2216         int ret;
2217
2218         ret = inet6_add_protocol(&tcpv6_protocol, IPPROTO_TCP);
2219         if (ret)
2220                 goto out;
2221
2222         /* register inet6 protocol */
2223         ret = inet6_register_protosw(&tcpv6_protosw);
2224         if (ret)
2225                 goto out_tcpv6_protocol;
2226
2227         ret = register_pernet_subsys(&tcpv6_net_ops);
2228         if (ret)
2229                 goto out_tcpv6_protosw;
2230 out:
2231         return ret;
2232
2233 out_tcpv6_protocol:
2234         inet6_del_protocol(&tcpv6_protocol, IPPROTO_TCP);
2235 out_tcpv6_protosw:
2236         inet6_unregister_protosw(&tcpv6_protosw);
2237         goto out;
2238 }
2239
2240 void tcpv6_exit(void)
2241 {
2242         unregister_pernet_subsys(&tcpv6_net_ops);
2243         inet6_unregister_protosw(&tcpv6_protosw);
2244         inet6_del_protocol(&tcpv6_protocol, IPPROTO_TCP);
2245 }