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-head mailing list