]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Guard against 0 time delta in BDP calc.
authorMike Perry <mikeperry-git@torproject.org>
Fri, 21 Jan 2022 18:40:49 +0000 (18:40 +0000)
committerMike Perry <mikeperry-git@torproject.org>
Tue, 22 Feb 2022 19:28:35 +0000 (19:28 +0000)
This can only happen in Shadow, but it will cause issues there.

src/core/or/congestion_control_common.c

index fe3228262a21abe74a44cc793e073e74b8196bff..4b483a90b07f8608aaa6c216f144b761853be8aa 100644 (file)
@@ -937,21 +937,26 @@ 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. */
-      uint64_t cells = (sendme_cnt-1)*cc->sendme_inc;
-
-      /* The bandwidth estimate is cells/delta, which when multiplied
-       * by min RTT obtains the BDP. However, we multiply first to
-       * avoid precision issues with the RTT being close to delta in size. */
-      sendme_rate_bdp = cells*cc->min_rtt_usec/delta;
-
-      /* Calculate BDP_EWMA_COUNT N-EWMA */
-      cc->bdp[BDP_ALG_SENDME_RATE] =
-                 n_count_ewma(sendme_rate_bdp, cc->bdp[BDP_ALG_SENDME_RATE],
-                              cc->ewma_cwnd_cnt*sendme_acks_per_cwnd(cc));
+      /* 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
+         * by min RTT obtains the BDP. However, we multiply first to
+         * avoid precision issues with the RTT being close to delta in size. */
+        sendme_rate_bdp = cells*cc->min_rtt_usec/delta;
+
+        /* Calculate BDP_EWMA_COUNT N-EWMA */
+        cc->bdp[BDP_ALG_SENDME_RATE] =
+                   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.