- 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:
Lawrence Stewart 2010-12-02 01:36:00 +00:00
parent 26778a6c82
commit 2ea8da28e9
2 changed files with 20 additions and 36 deletions

View File

@ -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));
}

View File

@ -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) {