Author: hiren
Date: Wed Jul 22 15:05:45 2015
New Revision: 285793
URL: https://svnweb.freebsd.org/changeset/base/285793

Log:
  MFC r284941:
  Avoid a situation where we do not set persist timer after a zero window
  condition.
  If you send a 0-length packet, but there is data is the socket buffer, and
  neither the rexmt or persist timer is already set, then activate the persist
  timer.
  
  PR:           192599
  Approved by:  re (delphij)

Modified:
  stable/10/sys/netinet/tcp_output.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/netinet/tcp_output.c
==============================================================================
--- stable/10/sys/netinet/tcp_output.c  Wed Jul 22 11:30:37 2015        
(r285792)
+++ stable/10/sys/netinet/tcp_output.c  Wed Jul 22 15:05:45 2015        
(r285793)
@@ -1397,6 +1397,30 @@ timer:
                                tp->t_rxtshift = 0;
                        }
                        tcp_timer_activate(tp, TT_REXMT, tp->t_rxtcur);
+               } else if (len == 0 && so->so_snd.sb_cc &&
+                   !tcp_timer_active(tp, TT_REXMT) &&
+                   !tcp_timer_active(tp, TT_PERSIST)) {
+                       /*
+                        * Avoid a situation where we do not set persist timer
+                        * after a zero window condition. For example:
+                        * 1) A -> B: packet with enough data to fill the window
+                        * 2) B -> A: ACK for #1 + new data (0 window
+                        *    advertisement)
+                        * 3) A -> B: ACK for #2, 0 len packet
+                        *
+                        * In this case, A will not activate the persist timer,
+                        * because it chose to send a packet. Unless tcp_output
+                        * is called for some other reason (delayed ack timer,
+                        * another input packet from B, socket syscall), A will
+                        * not send zero window probes.
+                        *
+                        * So, if you send a 0-length packet, but there is data
+                        * in the socket buffer, and neither the rexmt or
+                        * persist timer is already set, then activate the
+                        * persist timer.
+                        */
+                       tp->t_rxtshift = 0;
+                       tcp_setpersist(tp);
                }
        } else {
                /*
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to