31 lines
1.1 KiB
Diff
31 lines
1.1 KiB
Diff
Index: sys/netinet/tcp_output.c
|
|
===================================================================
|
|
--- sys/netinet/tcp_output.c (revision 285435)
|
|
+++ sys/netinet/tcp_output.c (working copy)
|
|
@@ -397,7 +397,7 @@ after_sack_rexmit:
|
|
flags &= ~TH_FIN;
|
|
}
|
|
|
|
- if (len < 0) {
|
|
+ if (len <= 0) {
|
|
/*
|
|
* If FIN has been sent but not acked,
|
|
* but we haven't been called to retransmit,
|
|
@@ -407,9 +407,16 @@ after_sack_rexmit:
|
|
* to (closed) window, and set the persist timer
|
|
* if it isn't already going. If the window didn't
|
|
* close completely, just wait for an ACK.
|
|
+ *
|
|
+ * We also do a general check here to ensure that
|
|
+ * we will set the persist timer when we have data
|
|
+ * to send, but a 0-byte window. This makes sure
|
|
+ * the persist timer is set even if the packet
|
|
+ * hits one of the "goto send" lines below.
|
|
*/
|
|
len = 0;
|
|
- if (sendwin == 0) {
|
|
+ if ((sendwin == 0) && (TCPS_HAVEESTABLISHED(tp->t_state)) &&
|
|
+ (off < (int) so->so_snd.sb_cc)) {
|
|
tcp_timer_activate(tp, TT_REXMT, 0);
|
|
tp->t_rxtshift = 0;
|
|
tp->snd_nxt = tp->snd_una;
|