summaryrefslogtreecommitdiffstats
path: root/sys/netinet/tcp_reass.c
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2002-10-31 23:24:13 +0000
committerjeff <jeff@FreeBSD.org>2002-10-31 23:24:13 +0000
commitb6176d93b1df287a5a9776b3de562aef877b931c (patch)
treeb10fef8ca11fc02a6f6bd5f39e9cd76599d1ba0e /sys/netinet/tcp_reass.c
parentd93f84495b026a1b7c262a0bfe1b9c0b3175105b (diff)
downloadFreeBSD-src-b6176d93b1df287a5a9776b3de562aef877b931c.zip
FreeBSD-src-b6176d93b1df287a5a9776b3de562aef877b931c.tar.gz
- Consistently update snd_wl1, snd_wl2, and rcv_up in the header
prediction code. Previously, 2GB worth of header predicted data could leave these variables too far out of sequence which would cause problems after receiving a packet that did not match the header prediction. Submitted by: Bill Baumann <bbaumann@isilon.com> Sponsored by: Isilon Systems, Inc. Reviewed by: hsu, pete@isilon.com, neal@isilon.com, aaronp@isilon.com
Diffstat (limited to 'sys/netinet/tcp_reass.c')
-rw-r--r--sys/netinet/tcp_reass.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/sys/netinet/tcp_reass.c b/sys/netinet/tcp_reass.c
index 6175a81..32567ca 100644
--- a/sys/netinet/tcp_reass.c
+++ b/sys/netinet/tcp_reass.c
@@ -1027,7 +1027,11 @@ after_listen:
tcpstat.tcps_rcvackpack++;
tcpstat.tcps_rcvackbyte += acked;
sbdrop(&so->so_snd, acked);
- tp->snd_una = th->th_ack;
+ /*
+ * pull snd_wl2 up to prevent seq wrap relative
+ * to th_ack.
+ */
+ tp->snd_wl2 = tp->snd_una = th->th_ack;
tp->t_dupacks = 0;
m_freem(m);
ND6_HINT(tp); /* some progress has been done */
@@ -1067,6 +1071,16 @@ after_listen:
*/
++tcpstat.tcps_preddat;
tp->rcv_nxt += tlen;
+ /*
+ * Pull snd_wl1 up to prevent seq wrap relative to
+ * th_seq.
+ */
+ tp->snd_wl1 = th->th_seq;
+ /*
+ * Pull rcv_up up to prevent seq wrap relative to
+ * rcv_nxt.
+ */
+ tp->rcv_up = tp->rcv_nxt;
tcpstat.tcps_rcvpack++;
tcpstat.tcps_rcvbyte += tlen;
ND6_HINT(tp); /* some progress has been done */
OpenPOWER on IntegriCloud