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;
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to