Commit 4f3a0e39 authored by Mike Perry's avatar Mike Perry
Browse files

Guard against 0 time delta in BDP calc.

This can only happen in Shadow, but it will cause issues there.
parent 8052d0c2
Loading
Loading
Loading
Loading
+20 −15
Original line number Diff line number Diff line
@@ -937,10 +937,14 @@ congestion_control_update_circuit_bdp(congestion_control_t *cc,
      timestamp_usec = peek_timestamp(cc->sendme_arrival_timestamps);
      uint64_t delta = now_usec - timestamp_usec;

      /* The acked data is in sendme_cnt-1 chunks, because we are counting the
       * data that is processed by the other endpoint *between* all of these
       * sendmes. There's one less gap between the sendmes than the number
       * of sendmes. */
      /* In Shadow, the time delta between acks can be 0 if there is no
       * network activity between them. Only update BDP if the delta is
       * non-zero. */
      if (delta > 0) {
        /* The acked data is in sendme_cnt-1 chunks, because we are counting
         * the data that is processed by the other endpoint *between* all of
         * these sendmes. There's one less gap between the sendmes than the
         * number of sendmes. */
        uint64_t cells = (sendme_cnt-1)*cc->sendme_inc;

        /* The bandwidth estimate is cells/delta, which when multiplied
@@ -953,6 +957,7 @@ congestion_control_update_circuit_bdp(congestion_control_t *cc,
                   n_count_ewma(sendme_rate_bdp, cc->bdp[BDP_ALG_SENDME_RATE],
                                cc->ewma_cwnd_cnt*sendme_acks_per_cwnd(cc));
      }
    }

    /* In-flight BDP will cause the cwnd to drift down when underutilized.
     * It is most useful when the local OR conn is blocked, so we only