[tor-bugs] #18873 [Core Tor/Tor]: Refactor circuit_predict_and_launch_new()
Tor Bug Tracker & Wiki
blackhole at torproject.org
Wed Nov 2 17:27:42 UTC 2016
#18873: Refactor circuit_predict_and_launch_new()
--------------------------+------------------------------------
Reporter: asn | Owner:
Type: defect | Status: needs_revision
Priority: Low | Milestone: Tor: 0.3.0.x-final
Component: Core Tor/Tor | Version:
Severity: Normal | Resolution:
Keywords: refactoring | Actual Points:
Parent ID: | Points:
Reviewer: dgoulet | Sponsor:
--------------------------+------------------------------------
Comment (by chelseakomlo):
Ok, see changes at `git at github.com:chelseakomlo/tor_patches.git`, branch
`circuituse`. Thanks for all the great feedback!
> * This comment confuses me as it doesn't appear to indicate what the
function does or return. As I understand it, the function returns true iff
the circuit matches some criteria that made it available for use.
Documenting those criteria would be useful here. Also, what kind of
circuit can be passed. Any kind? Or origin only or? as I see that it must
be a GENERAL purpose for instance.
> {{{
> +/* Figure out how many circuits we have open that we can use. */
> +STATIC int
> +circuit_is_available_for_use(circuit_t *circ)
> }}}
Great, let me know if it is more clear now.
> * I would honestly break this one down inside the function. This has
quite the complicated conditions and the clearer the better as right now
it's not that easy to get and also very easy to misunderstand:
> {{{
> needs_hs_client_circuits(...)
> }}}
Ok, I pulled some of the logic out into separate variables. Let me know if
this makes it more readable/easy to understand.
> * This condition has disappeared which is not good as
`TO_ORIGIN_CIRCUIT()` in `circuit_is_available_for_use()` will explode if
it's not an origin circuit.
> {{{
> - if (!CIRCUIT_IS_ORIGIN(circ))
> - continue;
> }}}
>
> and furthermore, this also could explode:
> {{{
> cpath_build_state_t *build_state = TO_ORIGIN_CIRCUIT(circ)->build_state;
> }}}
Hey! Ok, here is my understanding:
A circuit with purpose CIRCUIT_PURPOSE_C_GENERAL will always be an origin
circuit, because:
in or.h
{{{
#define CIRCUIT_IS_ORIGIN(c) (CIRCUIT_PURPOSE_IS_ORIGIN((c)->purpose))
#define CIRCUIT_PURPOSE_IS_ORIGIN(p) ((p)>CIRCUIT_PURPOSE_OR_MAX_)
#define CIRCUIT_PURPOSE_OR_MAX_ 4
#define CIRCUIT_PURPOSE_C_GENERAL 5
}}}
so in circuit_is_available_for_use, circuituse.c
`origin_circ = TO_ORIGIN_CIRCUIT(circ);`
should not explode, because of the previous check:
{{{
if (circ->purpose != CIRCUIT_PURPOSE_C_GENERAL)
return 0;/* only pay attention to general
purpose circs */
}}}
So that is the reason we should be able to safely remove
{{{
if (!CIRCUIT_IS_ORIGIN(circ))
continue;
}}}
Let me know if you have a different understanding of this.
--
Ticket URL: <https://trac.torproject.org/projects/tor/ticket/18873#comment:15>
Tor Bug Tracker & Wiki <https://trac.torproject.org/>
The Tor Project: anonymity online
More information about the tor-bugs
mailing list