svn commit: r352072 - in head/sys/netinet: . tcp_stacks
Michael Tuexen
tuexen at FreeBSD.org
Mon Sep 9 16:07:48 UTC 2019
Author: tuexen
Date: Mon Sep 9 16:07:47 2019
New Revision: 352072
URL: https://svnweb.freebsd.org/changeset/base/352072
Log:
Only update SACK/DSACK lists when a non-empty segment was received.
This fixes hitting a KASSERT with a valid packet exchange.
Reviewed by: rrs@, Richard Scheffenegger
MFC after: 3 days
Sponsored by: Netflix, Inc.
Differential Revision: https://reviews.freebsd.org/D21567
Modified:
head/sys/netinet/tcp_input.c
head/sys/netinet/tcp_stacks/rack.c
Modified: head/sys/netinet/tcp_input.c
==============================================================================
--- head/sys/netinet/tcp_input.c Mon Sep 9 15:57:24 2019 (r352071)
+++ head/sys/netinet/tcp_input.c Mon Sep 9 16:07:47 2019 (r352072)
@@ -3045,9 +3045,8 @@ dodata: /* XXX */
thflags = tcp_reass(tp, th, &temp, &tlen, m);
tp->t_flags |= TF_ACKNOW;
}
- if (tp->t_flags & TF_SACK_PERMIT) {
- if (((tlen == 0) && (save_tlen > 0) &&
- (SEQ_LT(save_start, save_rnxt)))) {
+ if ((tp->t_flags & TF_SACK_PERMIT) && (save_tlen > 0)) {
+ if ((tlen == 0) && (SEQ_LT(save_start, save_rnxt))) {
/*
* DSACK actually handled in the fastpath
* above.
@@ -3055,20 +3054,20 @@ dodata: /* XXX */
tcp_update_sack_list(tp, save_start,
save_start + save_tlen);
} else if ((tlen > 0) && SEQ_GT(tp->rcv_nxt, save_rnxt)) {
- /*
- * Cleaning sackblks by using zero length
- * update.
- */
if ((tp->rcv_numsacks >= 1) &&
(tp->sackblks[0].end == save_start)) {
- /* partial overlap, recorded at todrop above */
- tcp_update_sack_list(tp, tp->sackblks[0].start,
+ /*
+ * Partial overlap, recorded at todrop
+ * above.
+ */
+ tcp_update_sack_list(tp,
+ tp->sackblks[0].start,
tp->sackblks[0].end);
} else {
tcp_update_dsack_list(tp, save_start,
save_start + save_tlen);
}
- } else if ((tlen > 0) && (tlen >= save_tlen)) {
+ } else if (tlen >= save_tlen) {
/* Update of sackblks. */
tcp_update_dsack_list(tp, save_start,
save_start + save_tlen);
Modified: head/sys/netinet/tcp_stacks/rack.c
==============================================================================
--- head/sys/netinet/tcp_stacks/rack.c Mon Sep 9 15:57:24 2019 (r352071)
+++ head/sys/netinet/tcp_stacks/rack.c Mon Sep 9 16:07:47 2019 (r352072)
@@ -4942,35 +4942,36 @@ dodata: /* XXX */
thflags = tcp_reass(tp, th, &temp, &tlen, m);
tp->t_flags |= TF_ACKNOW;
}
- if (((tlen == 0) && (save_tlen > 0) &&
- (SEQ_LT(save_start, save_rnxt)))) {
- /*
- * DSACK actually handled in the fastpath
- * above.
- */
- tcp_update_sack_list(tp, save_start,
- save_start + save_tlen);
- } else if ((tlen > 0) && SEQ_GT(tp->rcv_nxt, save_rnxt)) {
- /*
- * Cleaning sackblks by using zero length
- * update.
- */
- if ((tp->rcv_numsacks >= 1) &&
- (tp->sackblks[0].end == save_start)) {
- /* partial overlap, recorded at todrop above */
- tcp_update_sack_list(tp, tp->sackblks[0].start,
- tp->sackblks[0].end);
- } else {
+ if ((tp->t_flags & TF_SACK_PERMIT) && (save_tlen > 0)) {
+ if ((tlen == 0) && (SEQ_LT(save_start, save_rnxt))) {
+ /*
+ * DSACK actually handled in the fastpath
+ * above.
+ */
+ tcp_update_sack_list(tp, save_start,
+ save_start + save_tlen);
+ } else if ((tlen > 0) && SEQ_GT(tp->rcv_nxt, save_rnxt)) {
+ if ((tp->rcv_numsacks >= 1) &&
+ (tp->sackblks[0].end == save_start)) {
+ /*
+ * Partial overlap, recorded at todrop
+ * above.
+ */
+ tcp_update_sack_list(tp,
+ tp->sackblks[0].start,
+ tp->sackblks[0].end);
+ } else {
+ tcp_update_dsack_list(tp, save_start,
+ save_start + save_tlen);
+ }
+ } else if (tlen >= save_tlen) {
+ /* Update of sackblks. */
tcp_update_dsack_list(tp, save_start,
save_start + save_tlen);
+ } else if (tlen > 0) {
+ tcp_update_dsack_list(tp, save_start,
+ save_start + tlen);
}
- } else if ((tlen > 0) && (tlen >= save_tlen)) {
- /* Update of sackblks. */
- tcp_update_dsack_list(tp, save_start,
- save_start + save_tlen);
- } else if (tlen > 0) {
- tcp_update_dsack_list(tp, save_start,
- save_start + tlen);
}
} else {
m_freem(m);
More information about the svn-src-all
mailing list