mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
tcp: replace dst_confirm with sk_dst_confirm
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:5110effee8
("net: Do delayed neigh confirmation.") Fixes:f2bb4bedf3
("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>
This commit is contained in:
parent
c86a773c78
commit
c3a2e83705
3 changed files with 7 additions and 14 deletions
|
@ -3644,11 +3644,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);
|
||||
|
@ -5995,7 +5992,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
|
||||
|
@ -6022,9 +6018,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() */
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -980,6 +980,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;
|
||||
|
|
Loading…
Reference in a new issue