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 Differential Revision: D2946 Submitted by: jlott at averesystems dot com Reviewed by: jhb, jch, gnn, hiren Tested by: jlott at averesystems dot com, jch MFC after: 2 weeks
This commit is contained in:
parent
8971c13ffa
commit
f85680793b
@ -1394,6 +1394,30 @@ tcp_output(struct tcpcb *tp)
|
||||
tp->t_rxtshift = 0;
|
||||
}
|
||||
tcp_timer_activate(tp, TT_REXMT, tp->t_rxtcur);
|
||||
} else if (len == 0 && sbavail(&so->so_snd) &&
|
||||
!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 {
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user