mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-22 23:04:43 +00:00
net: Do delayed neigh confirmation.
When a dst_confirm() happens, mark the confirmation as pending in the dst. Then on the next packet out, when we have the neigh in-hand, do the update. This removes the dependency in dst_confirm() of dst's having an attached neigh. While we're here, remove the explicit 'dst' NULL check, all except 2 or 3 call sites ensure it's not NULL. So just fix those cases up. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
60d354ebeb
commit
5110effee8
6 changed files with 38 additions and 32 deletions
|
@ -740,13 +740,13 @@ void tcp_update_metrics(struct sock *sk)
|
|||
if (sysctl_tcp_nometrics_save)
|
||||
return;
|
||||
|
||||
dst_confirm(dst);
|
||||
|
||||
if (dst && (dst->flags & DST_HOST)) {
|
||||
const struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
int m;
|
||||
unsigned long rtt;
|
||||
|
||||
dst_confirm(dst);
|
||||
|
||||
if (icsk->icsk_backoff || !tp->srtt) {
|
||||
/* This session failed to estimate rtt. Why?
|
||||
* Probably, no packets returned in time.
|
||||
|
@ -3869,9 +3869,11 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
|
|||
tcp_cong_avoid(sk, ack, prior_in_flight);
|
||||
}
|
||||
|
||||
if ((flag & FLAG_FORWARD_PROGRESS) || !(flag & FLAG_NOT_DUP))
|
||||
dst_confirm(__sk_dst_get(sk));
|
||||
|
||||
if ((flag & FLAG_FORWARD_PROGRESS) || !(flag & FLAG_NOT_DUP)) {
|
||||
struct dst_entry *dst = __sk_dst_get(sk);
|
||||
if (dst)
|
||||
dst_confirm(dst);
|
||||
}
|
||||
return 1;
|
||||
|
||||
no_queue:
|
||||
|
@ -6140,9 +6142,14 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
|
|||
|
||||
case TCP_FIN_WAIT1:
|
||||
if (tp->snd_una == tp->write_seq) {
|
||||
struct dst_entry *dst;
|
||||
|
||||
tcp_set_state(sk, TCP_FIN_WAIT2);
|
||||
sk->sk_shutdown |= SEND_SHUTDOWN;
|
||||
dst_confirm(__sk_dst_get(sk));
|
||||
|
||||
dst = __sk_dst_get(sk);
|
||||
if (dst)
|
||||
dst_confirm(dst);
|
||||
|
||||
if (!sock_flag(sk, SOCK_DEAD))
|
||||
/* Wake up lingering close() */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue