Author: tuexen
Date: Tue Dec  4 22:10:09 2018
New Revision: 341498
URL: https://svnweb.freebsd.org/changeset/base/341498

Log:
  MFC r340774:
  
  Ensure that TCP RST-segments announce consistently a receiver window of
  zero. This was already done when sending them via tcp_respond().
  
  Reviewed by:          rrs@
  Sponsored by:         Netflix, Inc.
  Differential Revision:        https://reviews.freebsd.org/D17949

Modified:
  stable/12/sys/netinet/tcp_output.c
  stable/12/sys/netinet/tcp_stacks/rack.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/netinet/tcp_output.c
==============================================================================
--- stable/12/sys/netinet/tcp_output.c  Tue Dec  4 22:05:36 2018        
(r341497)
+++ stable/12/sys/netinet/tcp_output.c  Tue Dec  4 22:10:09 2018        
(r341498)
@@ -1171,14 +1171,18 @@ send:
        /*
         * Calculate receive window.  Don't shrink window,
         * but avoid silly window syndrome.
+        * If a RST segment is sent, advertise a window of zero.
         */
-       if (recwin < (so->so_rcv.sb_hiwat / 4) &&
-           recwin < tp->t_maxseg)
+       if (flags & TH_RST) {
                recwin = 0;
-       if (SEQ_GT(tp->rcv_adv, tp->rcv_nxt) &&
-           recwin < (tp->rcv_adv - tp->rcv_nxt))
-               recwin = (tp->rcv_adv - tp->rcv_nxt);
-
+       } else {
+               if (recwin < (so->so_rcv.sb_hiwat / 4) &&
+                   recwin < tp->t_maxseg)
+                       recwin = 0;
+               if (SEQ_GT(tp->rcv_adv, tp->rcv_nxt) &&
+                   recwin < (tp->rcv_adv - tp->rcv_nxt))
+                       recwin = (tp->rcv_adv - tp->rcv_nxt);
+       }
        /*
         * According to RFC1323 the window field in a SYN (i.e., a <SYN>
         * or <SYN,ACK>) segment itself is never scaled.  The <SYN,ACK>

Modified: stable/12/sys/netinet/tcp_stacks/rack.c
==============================================================================
--- stable/12/sys/netinet/tcp_stacks/rack.c     Tue Dec  4 22:05:36 2018        
(r341497)
+++ stable/12/sys/netinet/tcp_stacks/rack.c     Tue Dec  4 22:10:09 2018        
(r341498)
@@ -8189,15 +8189,20 @@ send:
        /*
         * Calculate receive window.  Don't shrink window, but avoid silly
         * window syndrome.
+        * If a RST segment is sent, advertise a window of zero.
         */
-       if (recwin < (long)(so->so_rcv.sb_hiwat / 4) &&
-           recwin < (long)tp->t_maxseg)
+       if (flags & TH_RST) {
                recwin = 0;
-       if (SEQ_GT(tp->rcv_adv, tp->rcv_nxt) &&
-           recwin < (long)(tp->rcv_adv - tp->rcv_nxt))
-               recwin = (long)(tp->rcv_adv - tp->rcv_nxt);
-       if (recwin > (long)TCP_MAXWIN << tp->rcv_scale)
-               recwin = (long)TCP_MAXWIN << tp->rcv_scale;
+       } else {
+               if (recwin < (long)(so->so_rcv.sb_hiwat / 4) &&
+                   recwin < (long)tp->t_maxseg)
+                       recwin = 0;
+               if (SEQ_GT(tp->rcv_adv, tp->rcv_nxt) &&
+                   recwin < (long)(tp->rcv_adv - tp->rcv_nxt))
+                       recwin = (long)(tp->rcv_adv - tp->rcv_nxt);
+               if (recwin > (long)TCP_MAXWIN << tp->rcv_scale)
+                       recwin = (long)TCP_MAXWIN << tp->rcv_scale;
+       }
 
        /*
         * According to RFC1323 the window field in a SYN (i.e., a <SYN> or
_______________________________________________
[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