Merge tag 'cleanup2' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / net / ipv6 / tcp_ipv6.c
index 86cfe6005f40a76c716676161efa521cbd808171..554d5999abc40534e37c7817f13722b620b821e7 100644 (file)
@@ -723,12 +723,10 @@ static int tcp_v6_inbound_md5_hash(struct sock *sk, const struct sk_buff *skb)
                                      NULL, NULL, skb);
 
        if (genhash || memcmp(hash_location, newhash, 16) != 0) {
-               if (net_ratelimit()) {
-                       printk(KERN_INFO "MD5 Hash %s for [%pI6c]:%u->[%pI6c]:%u\n",
-                              genhash ? "failed" : "mismatch",
-                              &ip6h->saddr, ntohs(th->source),
-                              &ip6h->daddr, ntohs(th->dest));
-               }
+               net_info_ratelimited("MD5 Hash %s for [%pI6c]:%u->[%pI6c]:%u\n",
+                                    genhash ? "failed" : "mismatch",
+                                    &ip6h->saddr, ntohs(th->source),
+                                    &ip6h->daddr, ntohs(th->dest));
                return 1;
        }
        return 0;
@@ -1057,7 +1055,7 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
        struct tcp_sock *tp = tcp_sk(sk);
        __u32 isn = TCP_SKB_CB(skb)->when;
        struct dst_entry *dst = NULL;
-       int want_cookie = 0;
+       bool want_cookie = false;
 
        if (skb->protocol == htons(ETH_P_IP))
                return tcp_v4_conn_request(sk, skb);
@@ -1118,7 +1116,7 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
                while (l-- > 0)
                        *c++ ^= *hash_location++;
 
-               want_cookie = 0;        /* not our kind of cookie */
+               want_cookie = false;    /* not our kind of cookie */
                tmp_ext.cookie_out_never = 0; /* false */
                tmp_ext.cookie_plus = tmp_opt.cookie_plus;
        } else if (!tp->rx_opt.cookie_in_always) {
@@ -1140,7 +1138,7 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
        treq->rmt_addr = ipv6_hdr(skb)->saddr;
        treq->loc_addr = ipv6_hdr(skb)->daddr;
        if (!want_cookie || tmp_opt.tstamp_ok)
-               TCP_ECN_create_request(req, tcp_hdr(skb));
+               TCP_ECN_create_request(req, skb);
 
        treq->iif = sk->sk_bound_dev_if;
 
@@ -1353,7 +1351,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
        newnp->pktoptions = NULL;
        if (treq->pktopts != NULL) {
                newnp->pktoptions = skb_clone(treq->pktopts, GFP_ATOMIC);
-               kfree_skb(treq->pktopts);
+               consume_skb(treq->pktopts);
                treq->pktopts = NULL;
                if (newnp->pktoptions)
                        skb_set_owner_r(newnp->pktoptions, newsk);
@@ -1383,6 +1381,10 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
        tcp_mtup_init(newsk);
        tcp_sync_mss(newsk, dst_mtu(dst));
        newtp->advmss = dst_metric_advmss(dst);
+       if (tcp_sk(sk)->rx_opt.user_mss &&
+           tcp_sk(sk)->rx_opt.user_mss < newtp->advmss)
+               newtp->advmss = tcp_sk(sk)->rx_opt.user_mss;
+
        tcp_initialize_rcv_mss(newsk);
        if (tcp_rsk(req)->snt_synack)
                tcp_valid_rtt_meas(newsk,
@@ -1654,7 +1656,8 @@ process:
                        if (!tcp_prequeue(sk, skb))
                                ret = tcp_v6_do_rcv(sk, skb);
                }
-       } else if (unlikely(sk_add_backlog(sk, skb))) {
+       } else if (unlikely(sk_add_backlog(sk, skb,
+                                          sk->sk_rcvbuf + sk->sk_sndbuf))) {
                bh_unlock_sock(sk);
                NET_INC_STATS_BH(net, LINUX_MIB_TCPBACKLOGDROP);
                goto discard_and_relse;
@@ -1773,6 +1776,7 @@ static const struct inet_connection_sock_af_ops ipv6_specific = {
        .syn_recv_sock     = tcp_v6_syn_recv_sock,
        .get_peer          = tcp_v6_get_peer,
        .net_header_len    = sizeof(struct ipv6hdr),
+       .net_frag_header_len = sizeof(struct frag_hdr),
        .setsockopt        = ipv6_setsockopt,
        .getsockopt        = ipv6_getsockopt,
        .addr2sockaddr     = inet6_csk_addr2sockaddr,
@@ -1829,64 +1833,15 @@ static const struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific = {
 static int tcp_v6_init_sock(struct sock *sk)
 {
        struct inet_connection_sock *icsk = inet_csk(sk);
-       struct tcp_sock *tp = tcp_sk(sk);
-
-       skb_queue_head_init(&tp->out_of_order_queue);
-       tcp_init_xmit_timers(sk);
-       tcp_prequeue_init(tp);
-
-       icsk->icsk_rto = TCP_TIMEOUT_INIT;
-       tp->mdev = TCP_TIMEOUT_INIT;
-
-       /* So many TCP implementations out there (incorrectly) count the
-        * initial SYN frame in their delayed-ACK and congestion control
-        * algorithms that we must have the following bandaid to talk
-        * efficiently to them.  -DaveM
-        */
-       tp->snd_cwnd = 2;
 
-       /* See draft-stevens-tcpca-spec-01 for discussion of the
-        * initialization of these values.
-        */
-       tp->snd_ssthresh = TCP_INFINITE_SSTHRESH;
-       tp->snd_cwnd_clamp = ~0;
-       tp->mss_cache = TCP_MSS_DEFAULT;
-
-       tp->reordering = sysctl_tcp_reordering;
-
-       sk->sk_state = TCP_CLOSE;
+       tcp_init_sock(sk);
 
        icsk->icsk_af_ops = &ipv6_specific;
-       icsk->icsk_ca_ops = &tcp_init_congestion_ops;
-       icsk->icsk_sync_mss = tcp_sync_mss;
-       sk->sk_write_space = sk_stream_write_space;
-       sock_set_flag(sk, SOCK_USE_WRITE_QUEUE);
 
 #ifdef CONFIG_TCP_MD5SIG
-       tp->af_specific = &tcp_sock_ipv6_specific;
+       tcp_sk(sk)->af_specific = &tcp_sock_ipv6_specific;
 #endif
 
-       /* TCP Cookie Transactions */
-       if (sysctl_tcp_cookie_size > 0) {
-               /* Default, cookies without s_data_payload. */
-               tp->cookie_values =
-                       kzalloc(sizeof(*tp->cookie_values),
-                               sk->sk_allocation);
-               if (tp->cookie_values != NULL)
-                       kref_init(&tp->cookie_values->kref);
-       }
-       /* Presumed zeroed, in order of appearance:
-        *      cookie_in_always, cookie_out_never,
-        *      s_data_constant, s_data_in, s_data_out
-        */
-       sk->sk_sndbuf = sysctl_tcp_wmem[1];
-       sk->sk_rcvbuf = sysctl_tcp_rmem[1];
-
-       local_bh_disable();
-       sock_update_memcg(sk);
-       sk_sockets_allocated_inc(sk);
-       local_bh_enable();
-
        return 0;
 }