- Reinstantiate the after_idle hook call in tcp_output(), which got lost
somewhere along the way due to mismerging r211464 in our development tree. - Capture the essence of r211464 in NewReno's after_idle() hook. We don't use V_ss_fltsz/V_ss_fltsz_local yet which needs to be revisited. Sponsored by: FreeBSD Foundation Submitted by: David Hayes <dahayes at swin edu au> MFC after: 9 weeks X-MFC with: r215166
This commit is contained in:
parent
26778a6c82
commit
2ea8da28e9
@ -216,15 +216,28 @@ newreno_post_recovery(struct cc_var *ccv)
|
||||
void
|
||||
newreno_after_idle(struct cc_var *ccv)
|
||||
{
|
||||
int rw;
|
||||
|
||||
/*
|
||||
* We have been idle for "a while" and no acks are expected to clock out
|
||||
* any data we send -- slow start to get ack "clock" running again.
|
||||
* If we've been idle for more than one retransmit timeout the old
|
||||
* congestion window is no longer current and we have to reduce it to
|
||||
* the restart window before we can transmit again.
|
||||
*
|
||||
* The restart window is the initial window or the last CWND, whichever
|
||||
* is smaller.
|
||||
*
|
||||
* This is done to prevent us from flooding the path with a full CWND at
|
||||
* wirespeed, overloading router and switch buffers along the way.
|
||||
*
|
||||
* See RFC5681 Section 4.1. "Restarting Idle Connections".
|
||||
*/
|
||||
if (V_tcp_do_rfc3390)
|
||||
CCV(ccv, snd_cwnd) = min(4 * CCV(ccv, t_maxseg),
|
||||
rw = min(4 * CCV(ccv, t_maxseg),
|
||||
max(2 * CCV(ccv, t_maxseg), 4380));
|
||||
else
|
||||
CCV(ccv, snd_cwnd) = CCV(ccv, t_maxseg) * 2;
|
||||
rw = CCV(ccv, t_maxseg) * 2;
|
||||
|
||||
CCV(ccv, snd_cwnd) = min(rw, CCV(ccv, snd_cwnd));
|
||||
}
|
||||
|
||||
|
||||
|
@ -148,7 +148,7 @@ tcp_output(struct tcpcb *tp)
|
||||
{
|
||||
struct socket *so = tp->t_inpcb->inp_socket;
|
||||
long len, recwin, sendwin;
|
||||
int off, flags, error, rw;
|
||||
int off, flags, error;
|
||||
struct mbuf *m;
|
||||
struct ip *ip = NULL;
|
||||
struct ipovly *ipov = NULL;
|
||||
@ -182,37 +182,8 @@ tcp_output(struct tcpcb *tp)
|
||||
* to send, then transmit; otherwise, investigate further.
|
||||
*/
|
||||
idle = (tp->t_flags & TF_LASTIDLE) || (tp->snd_max == tp->snd_una);
|
||||
if (idle && ticks - tp->t_rcvtime >= tp->t_rxtcur) {
|
||||
/*
|
||||
* If we've been idle for more than one retransmit
|
||||
* timeout the old congestion window is no longer
|
||||
* current and we have to reduce it to the restart
|
||||
* window before we can transmit again.
|
||||
*
|
||||
* The restart window is the initial window or the last
|
||||
* CWND, whichever is smaller.
|
||||
*
|
||||
* This is done to prevent us from flooding the path with
|
||||
* a full CWND at wirespeed, overloading router and switch
|
||||
* buffers along the way.
|
||||
*
|
||||
* See RFC5681 Section 4.1. "Restarting Idle Connections".
|
||||
*/
|
||||
if (V_tcp_do_rfc3390)
|
||||
rw = min(4 * tp->t_maxseg,
|
||||
max(2 * tp->t_maxseg, 4380));
|
||||
#ifdef INET6
|
||||
else if ((isipv6 ? in6_localaddr(&tp->t_inpcb->in6p_faddr) :
|
||||
in_localaddr(tp->t_inpcb->inp_faddr)))
|
||||
#else
|
||||
else if (in_localaddr(tp->t_inpcb->inp_faddr))
|
||||
#endif
|
||||
rw = V_ss_fltsz_local * tp->t_maxseg;
|
||||
else
|
||||
rw = V_ss_fltsz * tp->t_maxseg;
|
||||
|
||||
tp->snd_cwnd = min(rw, tp->snd_cwnd);
|
||||
}
|
||||
if (idle && ticks - tp->t_rcvtime >= tp->t_rxtcur)
|
||||
cc_after_idle(tp);
|
||||
tp->t_flags &= ~TF_LASTIDLE;
|
||||
if (idle) {
|
||||
if (tp->t_flags & TF_MORETOCOME) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user