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