aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2018-11-16 08:57:56 -0500
committerNick Mathewson <nickm@torproject.org>2018-11-16 08:57:56 -0500
commit35558c39dd162902a0e007b6e9dbd66d979043fd (patch)
tree01831f58159f0a12c712d778fcc25435a8028f6e /src/core
parentc9906cc3f6b7ba529173612ad87a8a9ce2dd6cf8 (diff)
parent8b2e72106ae87c8018d9bae25f826c7bd92a88e8 (diff)
downloadtor-35558c39dd162902a0e007b6e9dbd66d979043fd.tar.gz
tor-35558c39dd162902a0e007b6e9dbd66d979043fd.zip
Merge remote-tracking branch 'dgoulet/ticket27471_035_02' into maint-0.3.5
Diffstat (limited to 'src/core')
-rw-r--r--src/core/or/circuitlist.c49
-rw-r--r--src/core/or/circuitlist.h3
2 files changed, 39 insertions, 13 deletions
diff --git a/src/core/or/circuitlist.c b/src/core/or/circuitlist.c
index 5ff142c15c..35efc6541f 100644
--- a/src/core/or/circuitlist.c
+++ b/src/core/or/circuitlist.c
@@ -1644,15 +1644,24 @@ circuit_get_ready_rend_circ_by_rend_data(const rend_data_t *rend_data)
return NULL;
}
-/** Return the first service introduction circuit originating from the global
- * circuit list after <b>start</b> or at the start of the list if <b>start</b>
- * is NULL. Return NULL if no circuit is found.
+/** Return the first introduction circuit originating from the global circuit
+ * list after <b>start</b> or at the start of the list if <b>start</b> is
+ * NULL. Return NULL if no circuit is found.
+ *
+ * If <b>want_client_circ</b> is true, then we are looking for client-side
+ * introduction circuits: A client introduction point circuit has a purpose of
+ * either CIRCUIT_PURPOSE_C_INTRODUCING, CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT
+ * or CIRCUIT_PURPOSE_C_INTRODUCE_ACKED. This does not return a circuit marked
+ * for close, but it returns circuits regardless of their circuit state.
*
- * A service introduction point circuit has a purpose of either
- * CIRCUIT_PURPOSE_S_ESTABLISH_INTRO or CIRCUIT_PURPOSE_S_INTRO. This does not
- * return a circuit marked for close and its state must be open. */
+ * If <b>want_client_circ</b> is false, then we are looking for service-side
+ * introduction circuits: A service introduction point circuit has a purpose of
+ * either CIRCUIT_PURPOSE_S_ESTABLISH_INTRO or CIRCUIT_PURPOSE_S_INTRO. This
+ * does not return circuits marked for close, or in any state other than open.
+ */
origin_circuit_t *
-circuit_get_next_service_intro_circ(origin_circuit_t *start)
+circuit_get_next_intro_circ(const origin_circuit_t *start,
+ bool want_client_circ)
{
int idx = 0;
smartlist_t *lst = circuit_get_global_list();
@@ -1664,13 +1673,29 @@ circuit_get_next_service_intro_circ(origin_circuit_t *start)
for ( ; idx < smartlist_len(lst); ++idx) {
circuit_t *circ = smartlist_get(lst, idx);
- /* Ignore a marked for close circuit or purpose not matching a service
- * intro point or if the state is not open. */
- if (circ->marked_for_close || circ->state != CIRCUIT_STATE_OPEN ||
- (circ->purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO &&
- circ->purpose != CIRCUIT_PURPOSE_S_INTRO)) {
+ /* Ignore a marked for close circuit or if the state is not open. */
+ if (circ->marked_for_close) {
continue;
}
+
+ /* Depending on whether we are looking for client or service circs, skip
+ * circuits with other purposes. */
+ if (want_client_circ) {
+ if (circ->purpose != CIRCUIT_PURPOSE_C_INTRODUCING &&
+ circ->purpose != CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT &&
+ circ->purpose != CIRCUIT_PURPOSE_C_INTRODUCE_ACKED) {
+ continue;
+ }
+ } else { /* we are looking for service-side circs */
+ if (circ->state != CIRCUIT_STATE_OPEN) {
+ continue;
+ }
+ if (circ->purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO &&
+ circ->purpose != CIRCUIT_PURPOSE_S_INTRO) {
+ continue;
+ }
+ }
+
/* The purposes we are looking for are only for origin circuits so the
* following is valid. */
return TO_ORIGIN_CIRCUIT(circ);
diff --git a/src/core/or/circuitlist.h b/src/core/or/circuitlist.h
index dac11431c9..cb89d1820d 100644
--- a/src/core/or/circuitlist.h
+++ b/src/core/or/circuitlist.h
@@ -202,7 +202,8 @@ origin_circuit_t *circuit_get_ready_rend_circ_by_rend_data(
const rend_data_t *rend_data);
origin_circuit_t *circuit_get_next_by_pk_and_purpose(origin_circuit_t *start,
const uint8_t *digest, uint8_t purpose);
-origin_circuit_t *circuit_get_next_service_intro_circ(origin_circuit_t *start);
+origin_circuit_t *circuit_get_next_intro_circ(const origin_circuit_t *start,
+ bool want_client_circ);
origin_circuit_t *circuit_get_next_service_rp_circ(origin_circuit_t *start);
origin_circuit_t *circuit_get_next_service_hsdir_circ(origin_circuit_t *start);
origin_circuit_t *circuit_find_to_cannibalize(uint8_t purpose,