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