Index: sys/netinet/cc/cc_cubic.c =================================================================== --- sys/netinet/cc/cc_cubic.c +++ sys/netinet/cc/cc_cubic.c @@ -131,16 +131,13 @@ cubic_record_rtt(ccv); /* - * Regular ACK and we're not in cong/fast recovery and we're cwnd - * limited and we're either not doing ABC or are just coming out - * from slow-start or were application limited or are slow starting - * or are doing ABC and we've sent a cwnd's worth of bytes. + * For a regular ACK and we're not in cong/fast recovery and + * we're cwnd limited, recalculate cwnd. During the convex + * region of the cubic curve, cwnd steps can otherwise become + * very large and cause dramatic line-rate bursts. */ if (type == CC_ACK && !IN_RECOVERY(CCV(ccv, t_flags)) && - (ccv->flags & CCF_CWND_LIMITED) && (!V_tcp_do_rfc3465 || - (cubic_data->flags & (CUBICFLAG_IN_SLOWSTART | CUBICFLAG_IN_APPLIMIT)) || - CCV(ccv, snd_cwnd) <= CCV(ccv, snd_ssthresh) || - (V_tcp_do_rfc3465 && (ccv->flags & CCF_ABC_SENTAWND)))) { + (ccv->flags & CCF_CWND_LIMITED)) { /* Use the logic in NewReno ack_received() for slow start. */ if (CCV(ccv, snd_cwnd) <= CCV(ccv, snd_ssthresh) || cubic_data->min_rtt_ticks == TCPTV_SRTTBASE) { @@ -193,15 +190,8 @@ * cwnd growth. * Only update snd_cwnd, if it doesn't shrink. */ - if (V_tcp_do_rfc3465) - CCV(ccv, snd_cwnd) = ulmin(w_cubic_next, - INT_MAX); - else - CCV(ccv, snd_cwnd) += ulmax(1, - ((ulmin(w_cubic_next, INT_MAX) - - CCV(ccv, snd_cwnd)) * - CCV(ccv, t_maxseg)) / - CCV(ccv, snd_cwnd)); + CCV(ccv, snd_cwnd) = ulmin(w_cubic_next, + INT_MAX); } /*