[tor-commits] [tor/main] Prop#324: Add fields to edge connection.

dgoulet at torproject.org dgoulet at torproject.org
Mon Oct 4 14:49:58 UTC 2021


commit ca7f5c05a6f7016f9f96a2260c474632c5b5c529
Author: Mike Perry <mikeperry-git at torproject.org>
Date:   Tue Aug 10 21:35:22 2021 +0000

    Prop#324: Add fields to edge connection.
---
 src/core/or/edge_connection_st.h | 55 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/src/core/or/edge_connection_st.h b/src/core/or/edge_connection_st.h
index 0120c3df25..dab32fc8d0 100644
--- a/src/core/or/edge_connection_st.h
+++ b/src/core/or/edge_connection_st.h
@@ -15,6 +15,7 @@
 #include "core/or/or.h"
 
 #include "core/or/connection_st.h"
+#include "lib/evloop/token_bucket.h"
 
 /** Subtype of connection_t for an "edge connection" -- that is, an entry (ap)
  * connection, or an exit. */
@@ -73,6 +74,60 @@ struct edge_connection_t {
    * that's going away and being used on channels instead.  We still tag
    * edge connections with dirreq_id from circuits, so it's copied here. */
   uint64_t dirreq_id;
+
+  /* The following are flow control fields */
+
+  /** Used for rate limiting the read side of this edge connection when
+   * congestion control is enabled on its circuit. The XON cell ewma_drain_rate
+   * parameter is used to set the bucket limits. */
+  token_bucket_rw_t bucket;
+
+  /**
+   * Monotime timestamp of the last time we sent a flow control message
+   * for this edge, used to compute advisory rates */
+  uint64_t drain_start_usec;
+
+  /**
+   * Number of bytes written since we either emptied our buffers,
+   * or sent an advisory drate rate. Can wrap, buf if so,
+   * we must reset the usec timestamp above. (Or make this u64, idk).
+   */
+  uint32_t drained_bytes;
+  uint32_t prev_drained_bytes;
+
+  /**
+   * N_EWMA of the drain rate of writes on this edge conn
+   * while buffers were present.
+   */
+  uint32_t ewma_drain_rate;
+
+  /**
+   * The ewma drain rate the last time we sent an xon.
+   */
+  uint32_t ewma_rate_last_sent;
+
+  /**
+   * The following fields are used to count the total bytes sent on this
+   * stream, and compare them to the number of XON and XOFFs recieved, so
+   * that clients can check rate limits of XOFF/XON to prevent dropmark
+   * attacks. */
+  uint32_t total_bytes_xmit;
+
+  /** Number of XOFFs received */
+  uint8_t num_xoff_recv;
+
+  /** Number of XONs received */
+  uint8_t num_xon_recv;
+
+  /**
+   * Flag that tells us if an XOFF has been sent; cleared when we send an XON.
+   * Used to avoid sending multiple */
+  uint8_t xoff_sent : 1;
+
+  /** Flag that tells us if an XOFF has been received; cleared when we get
+   * an XON. Used to ensure that this edge keeps reads on its edge socket
+   * disabled. */
+  uint8_t xoff_received : 1;
 };
 
 #endif /* !defined(EDGE_CONNECTION_ST_H) */





More information about the tor-commits mailing list