]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
circ: Add function to learn if queue is full
authorDavid Goulet <dgoulet@torproject.org>
Wed, 14 Dec 2022 15:19:14 +0000 (10:19 -0500)
committerDavid Goulet <dgoulet@torproject.org>
Wed, 14 Dec 2022 15:19:14 +0000 (10:19 -0500)
Related to #40731

Signed-off-by: David Goulet <dgoulet@torproject.org>
src/core/or/circuitlist.c
src/core/or/circuitlist.h

index 50dc2ee3386d70b954f3dc59a2083c3152fbf724..cea3a2136fabbc5e55aef7303ca7b3636cf6271f 100644 (file)
@@ -2831,3 +2831,27 @@ assert_circuit_ok,(const circuit_t *c))
     tor_assert(!or_circ || !or_circ->rend_splice);
   }
 }
+
+/** Return true iff the circuit queue for the given direction is full that is
+ * above the high watermark. */
+bool
+circuit_is_queue_full(const circuit_t *circ, cell_direction_t direction)
+{
+  int queue_size;
+
+  tor_assert(circ);
+
+  /* Gather objects we need based on cell direction. */
+  if (direction == CELL_DIRECTION_OUT) {
+    /* Outbound. */
+    queue_size = circ->n_chan_cells.n;
+  } else {
+    /* Inbound. */
+    queue_size = CONST_TO_OR_CIRCUIT(circ)->p_chan_cells.n;
+  }
+
+  /* Then check if our cell queue has reached its high watermark as in its
+   * upper limit. This is so we avoid too much memory pressure by queuing a
+   * large amount of cells. */
+  return queue_size >= cell_queue_highwatermark();
+}
index 541a708de2c243094c4e915e1da920b12c47f4c0..49ded11f12919487ca5b0b22c173a24d16f8f60d 100644 (file)
@@ -247,6 +247,8 @@ MOCK_DECL(void, channel_note_destroy_not_pending,
 
 smartlist_t *circuit_find_circuits_to_upgrade_from_guard_wait(void);
 
+bool circuit_is_queue_full(const circuit_t *circ, cell_direction_t direction);
+
 /* Declare the handle helpers */
 HANDLE_DECL(circuit, circuit_t, )
 #define circuit_handle_free(h)    \