Sigh. I'll revert this and do it right.

On 10/25/16 at 05:03P, Hiren Panchasara wrote:
> Author: hiren
> Date: Tue Oct 25 05:03:33 2016
> New Revision: 307899
> URL: https://svnweb.freebsd.org/changeset/base/307899
> 
> Log:
>   In Collaboration with:          Matt Macy <mmacy at nextbsd dot com>
>   Reviewed by:                    jtl
>   Sponsored by:                   Limelight Networks
>   Differential Revision:          https://reviews.freebsd.org/D8225
> 
> Modified:
>   head/sys/netinet/cc/cc_cdg.c
>   head/sys/netinet/cc/cc_chd.c
>   head/sys/netinet/cc/cc_cubic.c
>   head/sys/netinet/cc/cc_dctcp.c
>   head/sys/netinet/cc/cc_htcp.c
>   head/sys/netinet/cc/cc_newreno.c
>   head/sys/netinet/tcp_input.c
> 
> Modified: head/sys/netinet/cc/cc_cdg.c
> ==============================================================================
> --- head/sys/netinet/cc/cc_cdg.c      Tue Oct 25 04:14:03 2016        
> (r307898)
> +++ head/sys/netinet/cc/cc_cdg.c      Tue Oct 25 05:03:33 2016        
> (r307899)
> @@ -431,6 +431,11 @@ static void
>  cdg_cong_signal(struct cc_var *ccv, uint32_t signal_type)
>  {
>       struct cdg *cdg_data = ccv->cc_data;
> +     uint32_t cwin;
> +     u_int mss;
> +
> +     cwin = CCV(ccv, snd_cwnd);
> +     mss = CCV(ccv, t_maxseg);
>  
>       switch(signal_type) {
>       case CC_CDG_DELAY:
> @@ -448,7 +453,7 @@ cdg_cong_signal(struct cc_var *ccv, uint
>                */
>               if (IN_CONGRECOVERY(CCV(ccv, t_flags)) ||
>                   cdg_data->queue_state < CDG_Q_FULL) {
> -                     CCV(ccv, snd_ssthresh) = CCV(ccv, snd_cwnd);
> +                     CCV(ccv, snd_ssthresh) = cwin;
>                       CCV(ccv, snd_recover) = CCV(ccv, snd_max);
>               } else {
>                       /*
> @@ -461,13 +466,17 @@ cdg_cong_signal(struct cc_var *ccv, uint
>                                   cdg_data->shadow_w, RENO_BETA);
>  
>                       CCV(ccv, snd_ssthresh) = max(cdg_data->shadow_w,
> -                         cdg_window_decrease(ccv, CCV(ccv, snd_cwnd),
> -                         V_cdg_beta_loss));
> +                         cdg_window_decrease(ccv, cwin, V_cdg_beta_loss));
> +                     CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
>  
>                       cdg_data->window_incr = cdg_data->rtt_count = 0;
>               }
>               ENTER_RECOVERY(CCV(ccv, t_flags));
>               break;
> +     case CC_RTO:
> +             CCV(ccv, snd_ssthresh) = max(2*mss, cwin/2);
> +             CCV(ccv, snd_cwnd) = mss;
> +             break;
>       default:
>               newreno_cc_algo.cong_signal(ccv, signal_type);
>               break;
> 
> Modified: head/sys/netinet/cc/cc_chd.c
> ==============================================================================
> --- head/sys/netinet/cc/cc_chd.c      Tue Oct 25 04:14:03 2016        
> (r307898)
> +++ head/sys/netinet/cc/cc_chd.c      Tue Oct 25 05:03:33 2016        
> (r307899)
> @@ -330,10 +330,14 @@ chd_cong_signal(struct cc_var *ccv, uint
>       struct ertt *e_t;
>       struct chd *chd_data;
>       int qdly;
> +     uint32_t cwin;
> +     u_int mss;
>  
>       e_t = khelp_get_osd(CCV(ccv, osd), ertt_id);
>       chd_data = ccv->cc_data;
>       qdly = imax(e_t->rtt, chd_data->maxrtt_in_rtt) - e_t->minrtt;
> +     cwin = CCV(ccv, snd_cwnd);
> +     mss = CCV(ccv, t_maxseg);
>  
>       switch(signal_type) {
>       case CC_CHD_DELAY:
> @@ -373,6 +377,10 @@ chd_cong_signal(struct cc_var *ccv, uint
>               }
>               ENTER_FASTRECOVERY(CCV(ccv, t_flags));
>               break;
> +     case CC_RTO:
> +             CCV(ccv, snd_ssthresh) = max(2*mss, cwin/2);
> +             CCV(ccv, snd_cwnd) = mss;
> +             break;
>  
>       default:
>               newreno_cc_algo.cong_signal(ccv, signal_type);
> 
> Modified: head/sys/netinet/cc/cc_cubic.c
> ==============================================================================
> --- head/sys/netinet/cc/cc_cubic.c    Tue Oct 25 04:14:03 2016        
> (r307898)
> +++ head/sys/netinet/cc/cc_cubic.c    Tue Oct 25 05:03:33 2016        
> (r307899)
> @@ -225,8 +225,12 @@ static void
>  cubic_cong_signal(struct cc_var *ccv, uint32_t type)
>  {
>       struct cubic *cubic_data;
> +     uint32_t cwin;
> +     u_int mss;
>  
>       cubic_data = ccv->cc_data;
> +     cwin = CCV(ccv, snd_cwnd);
> +     mss = CCV(ccv, t_maxseg);
>  
>       switch (type) {
>       case CC_NDUPACK:
> @@ -235,7 +239,8 @@ cubic_cong_signal(struct cc_var *ccv, ui
>                               cubic_ssthresh_update(ccv);
>                               cubic_data->num_cong_events++;
>                               cubic_data->prev_max_cwnd = 
> cubic_data->max_cwnd;
> -                             cubic_data->max_cwnd = CCV(ccv, snd_cwnd);
> +                             cubic_data->max_cwnd = cwin;
> +                             CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
>                       }
>                       ENTER_RECOVERY(CCV(ccv, t_flags));
>               }
> @@ -246,7 +251,7 @@ cubic_cong_signal(struct cc_var *ccv, ui
>                       cubic_ssthresh_update(ccv);
>                       cubic_data->num_cong_events++;
>                       cubic_data->prev_max_cwnd = cubic_data->max_cwnd;
> -                     cubic_data->max_cwnd = CCV(ccv, snd_cwnd);
> +                     cubic_data->max_cwnd = cwin;
>                       cubic_data->t_last_cong = ticks;
>                       CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
>                       ENTER_CONGRECOVERY(CCV(ccv, t_flags));
> @@ -261,9 +266,13 @@ cubic_cong_signal(struct cc_var *ccv, ui
>                * chance the first one is a false alarm and may not indicate
>                * congestion.
>                */
> -             if (CCV(ccv, t_rxtshift) >= 2)
> +             if (CCV(ccv, t_rxtshift) >= 2) {
>                       cubic_data->num_cong_events++;
>                       cubic_data->t_last_cong = ticks;
> +                     cubic_ssthresh_update(ccv);
> +                     cubic_data->max_cwnd = cwin;
> +                     CCV(ccv, snd_cwnd) = mss;
> +             }
>               break;
>       }
>  }
> 
> Modified: head/sys/netinet/cc/cc_dctcp.c
> ==============================================================================
> --- head/sys/netinet/cc/cc_dctcp.c    Tue Oct 25 04:14:03 2016        
> (r307898)
> +++ head/sys/netinet/cc/cc_dctcp.c    Tue Oct 25 05:03:33 2016        
> (r307899)
> @@ -230,10 +230,11 @@ static void
>  dctcp_cong_signal(struct cc_var *ccv, uint32_t type)
>  {
>       struct dctcp *dctcp_data;
> -     u_int win, mss;
> +     uint32_t cwin;
> +     u_int mss;
>  
>       dctcp_data = ccv->cc_data;
> -     win = CCV(ccv, snd_cwnd);
> +     cwin = CCV(ccv, snd_cwnd);
>       mss = CCV(ccv, t_maxseg);
>  
>       switch (type) {
> @@ -241,16 +242,16 @@ dctcp_cong_signal(struct cc_var *ccv, ui
>               if (!IN_FASTRECOVERY(CCV(ccv, t_flags))) {
>                       if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) {
>                               CCV(ccv, snd_ssthresh) = mss *
> -                                 max(win / 2 / mss, 2);
> +                                 max(cwin / 2 / mss, 2);
>                               dctcp_data->num_cong_events++;
>                       } else {
>                               /* cwnd has already updated as congestion
>                                * recovery. Reverse cwnd value using
>                                * snd_cwnd_prev and recalculate snd_ssthresh
>                                */
> -                             win = CCV(ccv, snd_cwnd_prev);
> +                             cwin = CCV(ccv, snd_cwnd_prev);
>                               CCV(ccv, snd_ssthresh) =
> -                                 max(win / 2 / mss, 2) * mss;
> +                                 max(cwin / 2 / mss, 2) * mss;
>                       }
>                       ENTER_RECOVERY(CCV(ccv, t_flags));
>               }
> @@ -260,18 +261,18 @@ dctcp_cong_signal(struct cc_var *ccv, ui
>                * Save current snd_cwnd when the host encounters both
>                * congestion recovery and fast recovery.
>                */
> -             CCV(ccv, snd_cwnd_prev) = win;
> +             CCV(ccv, snd_cwnd_prev) = cwin;
>               if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) {
>                       if (V_dctcp_slowstart &&
>                           dctcp_data->num_cong_events++ == 0) {
>                               CCV(ccv, snd_ssthresh) =
> -                                 mss * max(win / 2 / mss, 2);
> +                                 mss * max(cwin / 2 / mss, 2);
>                               dctcp_data->alpha = MAX_ALPHA_VALUE;
>                               dctcp_data->bytes_ecn = 0;
>                               dctcp_data->bytes_total = 0;
>                               dctcp_data->save_sndnxt = CCV(ccv, snd_nxt);
>                       } else
> -                             CCV(ccv, snd_ssthresh) = max((win - ((win *
> +                             CCV(ccv, snd_ssthresh) = max((cwin - ((cwin *
>                                   dctcp_data->alpha) >> 11)) / mss, 2) * mss;
>                       CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
>                       ENTER_CONGRECOVERY(CCV(ccv, t_flags));
> @@ -284,6 +285,8 @@ dctcp_cong_signal(struct cc_var *ccv, ui
>                       dctcp_update_alpha(ccv);
>                       dctcp_data->save_sndnxt += CCV(ccv, t_maxseg);
>                       dctcp_data->num_cong_events++;
> +                     CCV(ccv, snd_ssthresh) = max(2 * mss, cwin / 2);
> +                     CCV(ccv, snd_cwnd) = mss;
>               }
>               break;
>       }
> 
> Modified: head/sys/netinet/cc/cc_htcp.c
> ==============================================================================
> --- head/sys/netinet/cc/cc_htcp.c     Tue Oct 25 04:14:03 2016        
> (r307898)
> +++ head/sys/netinet/cc/cc_htcp.c     Tue Oct 25 05:03:33 2016        
> (r307899)
> @@ -271,8 +271,12 @@ static void
>  htcp_cong_signal(struct cc_var *ccv, uint32_t type)
>  {
>       struct htcp *htcp_data;
> +     uint32_t cwin;
> +     u_int mss;
>  
>       htcp_data = ccv->cc_data;
> +     cwin = CCV(ccv, snd_cwnd);
> +     mss = CCV(ccv, t_maxseg);
>  
>       switch (type) {
>       case CC_NDUPACK:
> @@ -287,8 +291,9 @@ htcp_cong_signal(struct cc_var *ccv, uin
>                                   (htcp_data->maxrtt - htcp_data->minrtt) *
>                                   95) / 100;
>                               htcp_ssthresh_update(ccv);
> +                             CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
>                               htcp_data->t_last_cong = ticks;
> -                             htcp_data->prev_cwnd = CCV(ccv, snd_cwnd);
> +                             htcp_data->prev_cwnd = cwin;
>                       }
>                       ENTER_RECOVERY(CCV(ccv, t_flags));
>               }
> @@ -305,7 +310,7 @@ htcp_cong_signal(struct cc_var *ccv, uin
>                       htcp_ssthresh_update(ccv);
>                       CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
>                       htcp_data->t_last_cong = ticks;
> -                     htcp_data->prev_cwnd = CCV(ccv, snd_cwnd);
> +                     htcp_data->prev_cwnd = cwin;
>                       ENTER_CONGRECOVERY(CCV(ccv, t_flags));
>               }
>               break;
> @@ -320,6 +325,8 @@ htcp_cong_signal(struct cc_var *ccv, uin
>                */
>               if (CCV(ccv, t_rxtshift) >= 2)
>                       htcp_data->t_last_cong = ticks;
> +             CCV(ccv, snd_ssthresh) = max(2 * mss, cwin / 2);
> +             CCV(ccv, snd_cwnd) = mss;
>               break;
>       }
>  }
> 
> Modified: head/sys/netinet/cc/cc_newreno.c
> ==============================================================================
> --- head/sys/netinet/cc/cc_newreno.c  Tue Oct 25 04:14:03 2016        
> (r307898)
> +++ head/sys/netinet/cc/cc_newreno.c  Tue Oct 25 05:03:33 2016        
> (r307899)
> @@ -182,30 +182,39 @@ newreno_after_idle(struct cc_var *ccv)
>  static void
>  newreno_cong_signal(struct cc_var *ccv, uint32_t type)
>  {
> -     u_int win;
> +     uint32_t cwin;
> +     u_int mss;
> +
> +     cwin = CCV(ccv, snd_cwnd);
> +     mss = CCV(ccv, t_maxseg);
>  
>       /* Catch algos which mistakenly leak private signal types. */
>       KASSERT((type & CC_SIGPRIVMASK) == 0,
>           ("%s: congestion signal type 0x%08x is private\n", __func__, type));
>  
> -     win = max(CCV(ccv, snd_cwnd) / 2 / CCV(ccv, t_maxseg), 2) *
> -         CCV(ccv, t_maxseg);
> +     cwin = max(2*mss, cwin/2);
>  
>       switch (type) {
>       case CC_NDUPACK:
>               if (!IN_FASTRECOVERY(CCV(ccv, t_flags))) {
> -                     if (!IN_CONGRECOVERY(CCV(ccv, t_flags)))
> -                             CCV(ccv, snd_ssthresh) = win;
> +                     if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) {
> +                             CCV(ccv, snd_ssthresh) = cwin;
> +                             CCV(ccv, snd_cwnd) = cwin;
> +                     }
>                       ENTER_RECOVERY(CCV(ccv, t_flags));
>               }
>               break;
>       case CC_ECN:
>               if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) {
> -                     CCV(ccv, snd_ssthresh) = win;
> -                     CCV(ccv, snd_cwnd) = win;
> +                     CCV(ccv, snd_ssthresh) = cwin;
> +                     CCV(ccv, snd_cwnd) = cwin;
>                       ENTER_CONGRECOVERY(CCV(ccv, t_flags));
>               }
>               break;
> +     case CC_RTO:
> +             CCV(ccv, snd_ssthresh) = cwin;
> +             CCV(ccv, snd_cwnd) = mss;
> +             break;
>       }
>  }
>  
> 
> Modified: head/sys/netinet/tcp_input.c
> ==============================================================================
> --- head/sys/netinet/tcp_input.c      Tue Oct 25 04:14:03 2016        
> (r307898)
> +++ head/sys/netinet/tcp_input.c      Tue Oct 25 05:03:33 2016        
> (r307899)
> @@ -438,9 +438,15 @@ cc_cong_signal(struct tcpcb *tp, struct 
>               tp->t_dupacks = 0;
>               tp->t_bytes_acked = 0;
>               EXIT_RECOVERY(tp->t_flags);
> -             tp->snd_ssthresh = max(2, min(tp->snd_wnd, tp->snd_cwnd) / 2 /
> -                 maxseg) * maxseg;
> -             tp->snd_cwnd = maxseg;
> +             if (CC_ALGO(tp)->cong_signal == NULL) {
> +                     /*
> +                      * RFC5681 Section 3.1 
> +                      * ssthresh = max (FlightSize / 2, 2*SMSS) eq (4)
> +                      */
> +                     tp->snd_ssthresh =
> +                         max((tp->snd_max - tp->snd_una) / 2, 2 * maxseg);
> +                     tp->snd_cwnd = maxseg;
> +             }
>               break;
>       case CC_RTO_ERR:
>               TCPSTAT_INC(tcps_sndrexmitbad);
> @@ -2613,6 +2619,15 @@ tcp_do_segment(struct mbuf *m, struct tc
>  
>                                               if (awnd < tp->snd_ssthresh) {
>                                                       tp->snd_cwnd += maxseg;
> +                                                     /*
> +                                                      * RFC5681 Section 3.2 
> talks about cwnd
> +                                                      * inflation on 
> additional dupacks and
> +                                                      * deflation on 
> recovering from loss.
> +                                                      *
> +                                                      * We keep cwnd into 
> check so that
> +                                                      * we don't have to 
> 'deflate' it when we
> +                                                      * get out of recovery.
> +                                                      */
>                                                       if (tp->snd_cwnd > 
> tp->snd_ssthresh)
>                                                               tp->snd_cwnd = 
> tp->snd_ssthresh;
>                                               }
> @@ -2652,19 +2667,22 @@ tcp_do_segment(struct mbuf *m, struct tc
>                                               TCPSTAT_INC(
>                                                   tcps_sack_recovery_episode);
>                                               tp->sack_newdata = tp->snd_nxt;
> -                                             tp->snd_cwnd = maxseg;
> +                                             if (CC_ALGO(tp)->cong_signal == 
> NULL)
> +                                                     tp->snd_cwnd = maxseg;
>                                               (void) 
> tp->t_fb->tfb_tcp_output(tp);
>                                               goto drop;
>                                       }
>                                       tp->snd_nxt = th->th_ack;
> -                                     tp->snd_cwnd = maxseg;
> +                                     if (CC_ALGO(tp)->cong_signal == NULL)
> +                                             tp->snd_cwnd = maxseg;
>                                       (void) tp->t_fb->tfb_tcp_output(tp);
>                                       KASSERT(tp->snd_limited <= 2,
>                                           ("%s: tp->snd_limited too big",
>                                           __func__));
> -                                     tp->snd_cwnd = tp->snd_ssthresh +
> -                                          maxseg *
> -                                          (tp->t_dupacks - tp->snd_limited);
> +                                     if (CC_ALGO(tp)->cong_signal == NULL)
> +                                             tp->snd_cwnd = tp->snd_ssthresh 
> +
> +                                                 maxseg *
> +                                                 (tp->t_dupacks - 
> tp->snd_limited);
>                                       if (SEQ_GT(onxt, tp->snd_nxt))
>                                               tp->snd_nxt = onxt;
>                                       goto drop;
> 

Attachment: pgpOd5qaMqAJh.pgp
Description: PGP signature



Reply via email to