diff options
author | Richard Scheffenegger <rscheff@FreeBSD.org> | 2021-03-25 22:18:06 +0000 |
---|---|---|
committer | Richard Scheffenegger <rscheff@FreeBSD.org> | 2021-03-25 22:23:48 +0000 |
commit | 0533fab89e37caab886568df88d9f939e85eeb6c (patch) | |
tree | 1566f4f215ab9ae6d4108667bdc76d98008d1892 | |
parent | 653a437c04440495cd8e7712c7cf39444f26f1ee (diff) | |
download | src-0533fab89e37caab886568df88d9f939e85eeb6c.tar.gz src-0533fab89e37caab886568df88d9f939e85eeb6c.zip |
tcp: Perform simple fast retransmit when SACK Blocks are missing on SACK session
MFC after: 2 weeks
Reviewed By: #transport, rrs
Sponsored by: NetApp, Inc.
Differential Revision: https://reviews.freebsd.org/D28634
-rw-r--r-- | sys/netinet/tcp_input.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c index bdc0e872c36e..685a5e020c3b 100644 --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -2564,6 +2564,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so, */ if (th->th_ack != tp->snd_una || ((tp->t_flags & TF_SACK_PERMIT) && + (to.to_flags & TOF_SACK) && !sack_changed)) break; else if (!tcp_timer_active(tp, TT_REXMT)) @@ -2617,6 +2618,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so, tp->snd_cwnd = imax(maxseg, tp->snd_nxt - tp->snd_recover + tp->sackhint.sack_bytes_rexmit + (snd_cnt * maxseg)); } else if ((tp->t_flags & TF_SACK_PERMIT) && + (to.to_flags & TOF_SACK) && IN_FASTRECOVERY(tp->t_flags)) { int awnd; @@ -2694,7 +2696,8 @@ enter_recovery: tp->sackhint.recover_fs = max(1, tp->snd_nxt - tp->snd_una); } - if (tp->t_flags & TF_SACK_PERMIT) { + if ((tp->t_flags & TF_SACK_PERMIT) && + (to.to_flags & TOF_SACK)) { TCPSTAT_INC( tcps_sack_recovery_episode); tp->snd_recover = tp->snd_nxt; |