summaryrefslogtreecommitdiff
path: root/sys/netinet
diff options
context:
space:
mode:
authorAlexander Bluhm <bluhm@cvs.openbsd.org>2021-08-09 17:03:09 +0000
committerAlexander Bluhm <bluhm@cvs.openbsd.org>2021-08-09 17:03:09 +0000
commit07e61cea9f1dc494c4b9d3f3b3c060564c4c9936 (patch)
treed56811fb28d04e881ed3d3fec0611ab2876c6146 /sys/netinet
parent0f6b5bf9774997a0541b21af6d7df35944e8e062 (diff)
During unidirectional data transmission, a TCP connection may stall.
The sending machine is doing zero window probes, but is not sending any more data although the other machine announced that it has space again. The header prediction code did not update snd_wl2. If there was a sequence number wrap, the send window update block is not reached. Update snd_wl2 when receiving predicted ACKs and and update snd_wl1 and rcv_up for predicted pure data. from FreeBSD; OK sashan@ claudio@
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/tcp_input.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index 94cba7a4df6..288cfa87706 100644
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tcp_input.c,v 1.369 2021/08/09 16:06:31 bluhm Exp $ */
+/* $OpenBSD: tcp_input.c,v 1.370 2021/08/09 17:03:08 bluhm Exp $ */
/* $NetBSD: tcp_input.c,v 1.23 1996/02/13 23:43:44 christos Exp $ */
/*
@@ -966,6 +966,8 @@ findpcb:
tp->t_pmtud_mss_acked = acked;
tp->snd_una = th->th_ack;
+ /* Pull snd_wl2 up to prevent seq wrap. */
+ tp->snd_wl2 = th->th_ack;
/*
* We want snd_last to track snd_una so
* as to avoid sequence wraparound problems
@@ -1015,6 +1017,10 @@ findpcb:
tcp_clean_sackreport(tp);
tcpstat_inc(tcps_preddat);
tp->rcv_nxt += tlen;
+ /* Pull snd_wl1 and rcv_up up to prevent seq wrap. */
+ tp->snd_wl1 = th->th_seq;
+ /* Packet has most recent segment, no urgent exists. */
+ tp->rcv_up = tp->rcv_nxt;
tcpstat_pkt(tcps_rcvpack, tcps_rcvbyte, tlen);
ND6_HINT(tp);