aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Scheffenegger <rscheff@FreeBSD.org>2021-03-25 22:18:06 +0000
committerRichard Scheffenegger <rscheff@FreeBSD.org>2021-03-25 22:23:48 +0000
commit0533fab89e37caab886568df88d9f939e85eeb6c (patch)
tree1566f4f215ab9ae6d4108667bdc76d98008d1892
parent653a437c04440495cd8e7712c7cf39444f26f1ee (diff)
downloadsrc-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.c5
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;