• Roger Dingledine's avatar
    Introduce a notion of 'internal' circs, which are chosen without regard · d2400a5a
    Roger Dingledine authored
    to the exit policy of the last hop. Intro and rendezvous circs must
    be internal circs, to avoid leaking information. Resolve and connect
    streams can use internal circs if they want.
    New circuit pooling algorithm: make sure to have enough circs around
    to satisfy any predicted ports, and also make sure to have 2 internal
    circs around if we've required internal circs lately (with high uptime
    if we've seen that lately).
    Split NewCircuitPeriod config option into NewCircuitPeriod (30 secs),
    which describes how often we retry making new circuits if current ones
    are dirty, and MaxCircuitDirtiness (10 mins), which describes how long
    we're willing to make use of an already-dirty circuit.
    Once rendezvous circuits are established, keep using the same circuit as
    long as you attach a new stream to it at least every 10 minutes. (So web
    browsing doesn't require you to build new rend circs every 30 seconds.)
    Cannibalize GENERAL circs to be C_REND, C_INTRO, S_INTRO, and S_REND
    circ as necessary, if there are any completed ones lying around when
    we try to launch one.
    Re-instate the ifdef's to use version-0 style introduce cells, since
    there was yet another bug in handling version-1 style. We'll try switching
    over again after 0.0.9 is obsolete.
    Bugfix: when choosing an exit node for a new non-internal circ, don't take
    into account whether it'll be useful for any pending x.onion addresses --
    it won't.
    Bugfix: we weren't actually publishing the hidden service descriptor when
    it became dirty. So we only published it every 20 minutes or so, which
    means when you first start your Tor, the hidden service will seem broken.