svn commit: r351801 - head/sys/netinet

Michael Tuexen tuexen at FreeBSD.org
Wed Sep 4 04:38:32 UTC 2019


Author: tuexen
Date: Wed Sep  4 04:38:31 2019
New Revision: 351801
URL: https://svnweb.freebsd.org/changeset/base/351801

Log:
  Fix the SACK block generation in the base TCP stack by bringing it in
  sync with the RACK stack.
  
  Reviewed by:		rrs@
  MFC after:		5 days
  Sponsored by:		Netflix, Inc.
  Differential Revision:	https://reviews.freebsd.org/D21513

Modified:
  head/sys/netinet/tcp_input.c

Modified: head/sys/netinet/tcp_input.c
==============================================================================
--- head/sys/netinet/tcp_input.c	Tue Sep  3 22:26:01 2019	(r351800)
+++ head/sys/netinet/tcp_input.c	Wed Sep  4 04:38:31 2019	(r351801)
@@ -2264,7 +2264,8 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, stru
 		 * DSACK - add SACK block for dropped range
 		 */
 		if (tp->t_flags & TF_SACK_PERMIT) {
-			tcp_update_sack_list(tp, th->th_seq, th->th_seq+tlen);
+			tcp_update_sack_list(tp, th->th_seq,
+			    th->th_seq + todrop);
 			/*
 			 * ACK now, as the next in-sequence segment
 			 * will clear the DSACK block again
@@ -3051,21 +3052,29 @@ dodata:							/* XXX */
 				 * 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)) {
+				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.
 				 */
-				tcp_update_sack_list(tp, save_start, save_start);
-			} else
-			if ((tlen > 0) && (tlen >= save_tlen)) {
+				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 > 0) && (tlen >= save_tlen)) {
 				/* Update of sackblks. */
-				tcp_update_sack_list(tp, save_start, save_start + save_tlen);
-			} else
-			if (tlen > 0) {
-				tcp_update_sack_list(tp, save_start, save_start+tlen);
+				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);
 			}
 		}
 #if 0


More information about the svn-src-head mailing list