|
@@ -57,45 +57,11 @@ R - Hunt for places that change networkstatus info that I might have
|
|
|
TunnelDirConns and PreferTunneledDirConns
|
|
|
R - actually cause the directory.c functions to know about or_port
|
|
|
and use it when we're supposed to.
|
|
|
-N - for tunneled edge conns, stop reading to the bridge connection
|
|
|
+N o for tunneled edge conns, stop reading to the bridge connection
|
|
|
when the or_conn we're writing to has a full outbuf.
|
|
|
- - This is iffy. Really, it would've been better to stop writing
|
|
|
- on the dir conn when the edge conn's inbuf is getting full.
|
|
|
- But the issue there is that we package from edge
|
|
|
- connections aggressively until we hit their package windows or the
|
|
|
- circuit package windows, even if the buffer on the corresponding OR
|
|
|
- connection is pretty damn big. This sucks from a RAM usage POV.
|
|
|
- Now, we could try to stop reading on the edges (or just the edges
|
|
|
- connected to a local bridge) when an or_conn's outbuf is full. But
|
|
|
- if we're a server, and we stop reading on some exit conns when OR
|
|
|
- conns are full, soon OR conns will contain only traffic from other OR
|
|
|
- conns, and the exit data in question will never get written.
|
|
|
-
|
|
|
- - The right solution in the long run (0.2.0) is probably as follows:
|
|
|
- - Remove socketpair-based bridges: use shared (or connected) buffers
|
|
|
- for communication, rather than sockets.
|
|
|
- - When relaying cells from an OR conn to an OR conn, have them wait
|
|
|
- in a queue on the or_circuit_t object; don't move them onto the
|
|
|
- target conn until there is space in the target conn's outbuf.
|
|
|
- Also, only package data from exitconns when there is space in the
|
|
|
- target conn's outbuf.
|
|
|
- - As an added advantage, this would let us kill stalled _circuits_
|
|
|
- when their buffers get too full, rather than killing entire OR
|
|
|
- conns. But we must think about anonymity implications of that.
|
|
|
- - We'll probably want to do some kind of big refactoring of our
|
|
|
- dataflow when we do these changes; stuff is hairy enough already,
|
|
|
- and it will only get harrier with this stuff.
|
|
|
-
|
|
|
- - For the short run, our options seem to be:
|
|
|
- - Disable BEGIN_DIR support at the server-side unless it's
|
|
|
- explicitly turned on.
|
|
|
- - Go ahead and make directory bridge data not get produced when the
|
|
|
- corresponding or_conn is full, and accept the sometimes directory
|
|
|
- data will just never get written.
|
|
|
- - Rate-limit directory bridge data somehow when the corresponding
|
|
|
- or_conn is full. Possibly based on the flush rate of the or_conn?
|
|
|
- - Reject BEGIN_DIR requests that we think will be insanely big.
|
|
|
-
|
|
|
+ . make directory bridge data not get produced when the corresponding
|
|
|
+ or_conn is full, and accept the sometimes directory data will just
|
|
|
+ never get written.
|
|
|
|
|
|
N - DNS improvements
|
|
|
. Asynchronous DNS
|
|
@@ -157,6 +123,10 @@ N - Implement, if we think it's smart.
|
|
|
a descriptor.
|
|
|
NR - Design
|
|
|
N - Implement, if we think it's smart.
|
|
|
+ - Check for any outstanding checks we do on the form or number of client
|
|
|
+ certificates that would prevent us from executing certain
|
|
|
+ blocking-resistance strategies.
|
|
|
+
|
|
|
|
|
|
Topics to think about during 0.1.2.x development:
|
|
|
* Figure out incentives.
|
|
@@ -197,6 +167,29 @@ P - Figure out why openssl 0.9.8d "make test" fails at sha256t test.
|
|
|
- What do we do about the fact that people can't read zlib-
|
|
|
compressed files manually?
|
|
|
|
|
|
+ - Change the way we handle cells, flow-control, and bridges.
|
|
|
+ - The issue is that we package from edge connections aggressively until
|
|
|
+ we hit their package windows or the circuit package windows, even if
|
|
|
+ the buffer on the corresponding OR connection is pretty damn big. This
|
|
|
+ sucks from a RAM usage POV. Now, we could try to stop reading on the
|
|
|
+ edges (or just the edges connected to a local bridge) when an or_conn's
|
|
|
+ outbuf is full. But if we're a server, and we stop reading on some
|
|
|
+ exit conns when OR conns are full, soon OR conns will contain only
|
|
|
+ traffic from other OR conns, and the exit data in question will never
|
|
|
+ get written.
|
|
|
+ - Remove socketpair-based bridges: use shared (or connected) buffers for
|
|
|
+ communication, rather than sockets.
|
|
|
+ - When relaying cells from an OR conn to an OR conn, have them wait in a
|
|
|
+ queue on the or_circuit_t object; don't move them onto the target conn
|
|
|
+ until there is space in the target conn's outbuf. Also, only package
|
|
|
+ data from exitconns when there is space in the target conn's outbuf.
|
|
|
+ - As an added advantage, this would let us kill stalled _circuits_
|
|
|
+ when their buffers get too full, rather than killing entire OR
|
|
|
+ conns. But we must think about anonymity implications of that.
|
|
|
+ - We'll probably want to do some kind of big refactoring of our
|
|
|
+ dataflow when we do these changes; stuff is hairy enough already,
|
|
|
+ and it will only get harrier with this stuff.
|
|
|
+
|
|
|
- If the client's clock is too far in the past, it will drop (or
|
|
|
just not try to get) descriptors, so it'll never build circuits.
|
|
|
- Tolerate clock skew on bridge relays.
|