|
@@ -583,8 +583,6 @@ circuit_expire_old_circuits(time_t now)
|
|
|
log_debug(LD_CIRC, "Closing n_circ_id %d (dirty %d secs ago, purp %d)",
|
|
|
circ->n_circ_id, (int)(now - circ->timestamp_dirty),
|
|
|
circ->purpose);
|
|
|
- /* (only general and purpose_c circs can get dirty) */
|
|
|
- tor_assert(circ->purpose <= CIRCUIT_PURPOSE_C_REND_JOINED);
|
|
|
circuit_mark_for_close(circ, END_CIRC_AT_ORIGIN);
|
|
|
} else if (!circ->timestamp_dirty &&
|
|
|
circ->state == CIRCUIT_STATE_OPEN &&
|
|
@@ -599,14 +597,55 @@ circuit_expire_old_circuits(time_t now)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/** A testing circuit has completed. Take whatever stats we want. */
|
|
|
+#define NUM_PARALLEL_TESTING_CIRCS 4
|
|
|
+
|
|
|
+static int have_performed_bandwidth_test = 0;
|
|
|
+
|
|
|
+/** Reset have_performed_bandwidth_test, so we'll start building
|
|
|
+ * testing circuits again so we can exercise our bandwidth. */
|
|
|
+void
|
|
|
+reset_bandwidth_test(void)
|
|
|
+{
|
|
|
+ have_performed_bandwidth_test = 0;
|
|
|
+}
|
|
|
+
|
|
|
+/** Return 1 if we've already exercised our bandwidth, or if we
|
|
|
+ * have fewer than NUM_PARALLEL_TESTING_CIRCS testing circuits
|
|
|
+ * established or on the way. Else return 0.
|
|
|
+ */
|
|
|
+int
|
|
|
+circuit_enough_testing_circs(void)
|
|
|
+{
|
|
|
+ circuit_t *circ;
|
|
|
+ int num = 0;
|
|
|
+
|
|
|
+ if (have_performed_bandwidth_test)
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ for (circ = global_circuitlist; circ; circ = circ->next) {
|
|
|
+ if (!circ->marked_for_close && CIRCUIT_IS_ORIGIN(circ) &&
|
|
|
+ circ->purpose == CIRCUIT_PURPOSE_TESTING &&
|
|
|
+ circ->state == CIRCUIT_STATE_OPEN)
|
|
|
+ num++;
|
|
|
+ }
|
|
|
+ return num >= NUM_PARALLEL_TESTING_CIRCS;
|
|
|
+}
|
|
|
+
|
|
|
+/** A testing circuit has completed. Take whatever stats we want.
|
|
|
+ * Noticing reachability is taken care of in onionskin_answer(),
|
|
|
+ * so there's no need to record anything here. But if we still want
|
|
|
+ * to do the bandwidth test, and we now have enough testing circuits
|
|
|
+ * open, do it.
|
|
|
+ */
|
|
|
static void
|
|
|
circuit_testing_opened(origin_circuit_t *circ)
|
|
|
{
|
|
|
- /* For now, we only use testing circuits to see if our ORPort is
|
|
|
- reachable. But we remember reachability in onionskin_answer(),
|
|
|
- so there's no need to record anything here. Just close the circ. */
|
|
|
- circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_AT_ORIGIN);
|
|
|
+ if (have_performed_bandwidth_test) {
|
|
|
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_AT_ORIGIN);
|
|
|
+ } else if (circuit_enough_testing_circs()) {
|
|
|
+ router_perform_bandwidth_test(NUM_PARALLEL_TESTING_CIRCS, time(NULL));
|
|
|
+ have_performed_bandwidth_test = 1;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/** A testing circuit has failed to build. Take whatever stats we want. */
|