]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/commitdiff
tcp: replace dst_confirm with sk_dst_confirm
authorJulian Anastasov <ja@ssi.bg>
Fri, 8 Sep 2017 07:00:00 +0000 (09:00 +0200)
committerStefan Bader <stefan.bader@canonical.com>
Fri, 15 Sep 2017 13:49:14 +0000 (15:49 +0200)
BugLink: https://bugs.launchpad.net/bugs/1715812
When same struct dst_entry can be used for many different
neighbours we can not use it for pending confirmations.
Use the new sk_dst_confirm() helper to propagate the
indication from received packets to sock_confirm_neigh().

Reported-by: YueHaibing <yuehaibing@huawei.com>
Fixes: 5110effee8fd ("net: Do delayed neigh confirmation.")
Fixes: f2bb4bedf35d ("ipv4: Cache output routes in fib_info nexthops.")
Tested-by: YueHaibing <yuehaibing@huawei.com>
Signed-off-by: Julian Anastasov <ja@ssi.bg>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit c3a2e8370534f810cac6050169db0ed3e0f94f0b)
Signed-off-by: Daniel Axtens <daniel.axtens@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Acked-by: Colin King <colin.king@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
net/ipv4/tcp_input.c
net/ipv4/tcp_metrics.c
net/ipv4/tcp_output.c

index e7516efa99dc4b4e54bea5515599c1e0ce776fef..f3ed7c2f9429db974158e277516ab013f7d721ea 100644 (file)
@@ -3698,11 +3698,8 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
        if (tp->tlp_high_seq)
                tcp_process_tlp_ack(sk, ack, flag);
 
-       if ((flag & FLAG_FORWARD_PROGRESS) || !(flag & FLAG_NOT_DUP)) {
-               struct dst_entry *dst = __sk_dst_get(sk);
-               if (dst)
-                       dst_confirm(dst);
-       }
+       if ((flag & FLAG_FORWARD_PROGRESS) || !(flag & FLAG_NOT_DUP))
+               sk_dst_confirm(sk);
 
        if (icsk->icsk_pending == ICSK_TIME_RETRANS)
                tcp_schedule_loss_probe(sk);
@@ -6028,7 +6025,6 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
                break;
 
        case TCP_FIN_WAIT1: {
-               struct dst_entry *dst;
                int tmo;
 
                /* If we enter the TCP_FIN_WAIT1 state and we are a
@@ -6055,9 +6051,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
                tcp_set_state(sk, TCP_FIN_WAIT2);
                sk->sk_shutdown |= SEND_SHUTDOWN;
 
-               dst = __sk_dst_get(sk);
-               if (dst)
-                       dst_confirm(dst);
+               sk_dst_confirm(sk);
 
                if (!sock_flag(sk, SOCK_DEAD)) {
                        /* Wake up lingering close() */
index ba8f02d0f283c6eaaf14ed89103adea135093353..077d7b7ba403a77a1e7623ec3f8ac0e3699b80db 100644 (file)
@@ -375,12 +375,10 @@ void tcp_update_metrics(struct sock *sk)
        u32 val;
        int m;
 
+       sk_dst_confirm(sk);
        if (sysctl_tcp_nometrics_save || !dst)
                return;
 
-       if (dst->flags & DST_HOST)
-               dst_confirm(dst);
-
        rcu_read_lock();
        if (icsk->icsk_backoff || !tp->srtt_us) {
                /* This session failed to estimate rtt. Why?
@@ -493,11 +491,10 @@ void tcp_init_metrics(struct sock *sk)
        struct tcp_metrics_block *tm;
        u32 val, crtt = 0; /* cached RTT scaled by 8 */
 
+       sk_dst_confirm(sk);
        if (!dst)
                goto reset;
 
-       dst_confirm(dst);
-
        rcu_read_lock();
        tm = tcp_get_metrics(sk, dst, true);
        if (!tm) {
index b7236ad4d8326e673e26b02f9cae108fdd3287e0..4c49283900b696539c14c3c88ce68a019b76cd46 100644 (file)
@@ -975,6 +975,8 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
        skb_set_hash_from_sk(skb, sk);
        atomic_add(skb->truesize, &sk->sk_wmem_alloc);
 
+       skb_set_dst_pending_confirm(skb, sk->sk_dst_pending_confirm);
+
        /* Build TCP header and checksum it. */
        th = (struct tcphdr *)skb->data;
        th->source              = inet->inet_sport;