mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-28 14:23:30 +01:00
circuit: Add a function to get the next service intro circuit
Signed-off-by: David Goulet <dgoulet@torproject.org>
This commit is contained in:
parent
df87812b41
commit
8a05e1a5d2
@ -1440,6 +1440,41 @@ circuit_get_ready_rend_circ_by_rend_data(const rend_data_t *rend_data)
|
|||||||
return NULL;
|
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.
|
||||||
|
*
|
||||||
|
* 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. */
|
||||||
|
origin_circuit_t *
|
||||||
|
circuit_get_next_service_intro_circ(origin_circuit_t *start)
|
||||||
|
{
|
||||||
|
int idx = 0;
|
||||||
|
smartlist_t *lst = circuit_get_global_list();
|
||||||
|
|
||||||
|
if (start) {
|
||||||
|
idx = TO_CIRCUIT(start)->global_circuitlist_idx + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* The purposes we are looking for are only for origin circuits so the
|
||||||
|
* following is valid. */
|
||||||
|
return TO_ORIGIN_CIRCUIT(circ);
|
||||||
|
}
|
||||||
|
/* Not found. */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/** Return the first circuit originating here in global_circuitlist after
|
/** Return the first circuit originating here in global_circuitlist after
|
||||||
* <b>start</b> whose purpose is <b>purpose</b>, and where <b>digest</b> (if
|
* <b>start</b> whose purpose is <b>purpose</b>, and where <b>digest</b> (if
|
||||||
* set) matches the private key digest of the rend data associated with the
|
* set) matches the private key digest of the rend data associated with the
|
||||||
|
@ -47,6 +47,7 @@ origin_circuit_t *circuit_get_ready_rend_circ_by_rend_data(
|
|||||||
const rend_data_t *rend_data);
|
const rend_data_t *rend_data);
|
||||||
origin_circuit_t *circuit_get_next_by_pk_and_purpose(origin_circuit_t *start,
|
origin_circuit_t *circuit_get_next_by_pk_and_purpose(origin_circuit_t *start,
|
||||||
const uint8_t *digest, uint8_t purpose);
|
const uint8_t *digest, uint8_t purpose);
|
||||||
|
origin_circuit_t *circuit_get_next_service_intro_circ(origin_circuit_t *start);
|
||||||
origin_circuit_t *circuit_find_to_cannibalize(uint8_t purpose,
|
origin_circuit_t *circuit_find_to_cannibalize(uint8_t purpose,
|
||||||
extend_info_t *info, int flags);
|
extend_info_t *info, int flags);
|
||||||
void circuit_mark_all_unused_circs(void);
|
void circuit_mark_all_unused_circs(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user