svn commit: r348728 - head/sys/netinet/tcp_stacks

Michael Tuexen tuexen at FreeBSD.org
Thu Jun 6 07:49:04 UTC 2019


Author: tuexen
Date: Thu Jun  6 07:49:03 2019
New Revision: 348728
URL: https://svnweb.freebsd.org/changeset/base/348728

Log:
  r347382 added receiver side DSACK support for the TCP base stack.
  The corresponding changes for the RACK stack where missed and are added
  by this commit.
  
  Reviewed by:		Richard Scheffenegger, rrs@
  MFC after:		3 days
  Differential Revision:	https://reviews.freebsd.org/D20372

Modified:
  head/sys/netinet/tcp_stacks/rack.c

Modified: head/sys/netinet/tcp_stacks/rack.c
==============================================================================
--- head/sys/netinet/tcp_stacks/rack.c	Thu Jun  6 06:38:29 2019	(r348727)
+++ head/sys/netinet/tcp_stacks/rack.c	Thu Jun  6 07:49:03 2019	(r348728)
@@ -1721,6 +1721,17 @@ rack_drop_checks(struct tcpopt *to, struct mbuf *m, st
 			TCPSTAT_INC(tcps_rcvpartduppack);
 			TCPSTAT_ADD(tcps_rcvpartdupbyte, todrop);
 		}
+		/*
+		 * 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);
+			/*
+			 * ACK now, as the next in-sequence segment
+			 * will clear the DSACK block again
+			 */
+			tp->t_flags |= TF_ACKNOW;
+		}
 		*drop_hdrlen += todrop;	/* drop from the top afterwards */
 		th->th_seq += todrop;
 		tlen -= todrop;
@@ -4753,6 +4764,8 @@ dodata:				/* XXX */
 	if ((tlen || (thflags & TH_FIN) || tfo_syn) &&
 	    TCPS_HAVERCVDFIN(tp->t_state) == 0) {
 		tcp_seq save_start = th->th_seq;
+		tcp_seq save_rnxt  = tp->rcv_nxt;
+		int     save_tlen  = tlen;
 
 		m_adj(m, drop_hdrlen);	/* delayed header drop */
 		/*
@@ -4795,11 +4808,29 @@ dodata:				/* XXX */
 			 * m_adj() doesn't actually frees any mbufs when
 			 * trimming from the head.
 			 */
-			thflags = tcp_reass(tp, th, &save_start, &tlen, m);
+			tcp_seq temp = save_start;
+			thflags = tcp_reass(tp, th, &temp, &tlen, m);
 			tp->t_flags |= TF_ACKNOW;
 		}
-		if (tlen > 0)
-			tcp_update_sack_list(tp, save_start, save_start + tlen);
+		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.
+			 */
+			tcp_update_sack_list(tp, save_start, save_start);
+		} 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);
+		}
 	} else {
 		m_freem(m);
 		thflags &= ~TH_FIN;


More information about the svn-src-all mailing list