diff options
author | Nick Mathewson <nickm@torproject.org> | 2005-06-29 21:46:55 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2005-06-29 21:46:55 +0000 |
commit | ec83652357ba4772203e32f02dcc69910b964079 (patch) | |
tree | e5a5113d256fac9d34bdecaeaf77134998d570bc /src/or/relay.c | |
parent | 0505b31933ce386ad0ac11855d3f0a8d0ba17b75 (diff) | |
download | tor-ec83652357ba4772203e32f02dcc69910b964079.tar.gz tor-ec83652357ba4772203e32f02dcc69910b964079.zip |
Logic to implement rendezvous/introduction via unknown servers.
- Add a new extend_info_t datatype to hold information needed to
extend a circuit (addr,port,keyid,onion_key). Use it in cpath and
build_state. Make appropriate functions take or return it instead of
routerinfo_t or keyid.
- #if 0 needless check in circuit_get_by_edge_conn; if nobody triggers this
error in 0.1.0.10, nobody will trigger it.
- Implement new hidden service descriptor format, which contains "extend
info" for introduction points, along with protocol version list.
- Parse new format.
- Generate new format
- Cache old and new formats alongside each other.
- Directories serve "old" format if asked in old way, "newest available"
format if asked in new way.
- Use new format to find introduction points if possible; otherwise fall
back. Keep nickname lists and extendinfo lists in sync.
- Tests for new format.
- Implement new "v2" INTRODUCE cell format.
- Accept new format
- Use new format if we have a versioned service descriptor that says the
server accepts the new format.
- Add documentation for functions and data types.
svn:r4506
Diffstat (limited to 'src/or/relay.c')
-rw-r--r-- | src/or/relay.c | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/src/or/relay.c b/src/or/relay.c index dd424be107..ff77955110 100644 --- a/src/or/relay.c +++ b/src/or/relay.c @@ -633,11 +633,8 @@ connection_edge_process_end_not_open( log_fn(LOG_INFO,"Address '%s' refused due to '%s'. Considering retrying.", safe_str(conn->socks_request->address), connection_edge_end_reason_str(reason)); - exitrouter = router_get_by_digest(circ->build_state->chosen_exit_digest); - if (!exitrouter) { - log_fn(LOG_INFO,"Skipping broken circ (exit router vanished)"); - return 0; /* this circuit is screwed and doesn't know it yet */ - } + exitrouter = + router_get_by_digest(circ->build_state->chosen_exit->identity_digest); switch (reason) { case END_STREAM_REASON_EXITPOLICY: if (rh->length >= 5) { @@ -652,15 +649,15 @@ connection_edge_process_end_not_open( conn->chosen_exit_name); } /* check if he *ought* to have allowed it */ - if (rh->length < 5 || - (!tor_inet_aton(conn->socks_request->address, &in) && - !conn->chosen_exit_name)) { + if (exitrouter && + (rh->length < 5 || + (!tor_inet_aton(conn->socks_request->address, &in) && + !conn->chosen_exit_name))) { log_fn(LOG_NOTICE,"Exitrouter '%s' seems to be more restrictive than its exit policy. Not using this router as exit for now.", exitrouter->nickname); addr_policy_free(exitrouter->exit_policy); exitrouter->exit_policy = router_parse_addr_policy_from_string("reject *:*"); } - if (connection_ap_detach_retriable(conn, circ) >= 0) return 0; /* else, conn will get closed below */ @@ -683,10 +680,11 @@ connection_edge_process_end_not_open( break; case END_STREAM_REASON_HIBERNATING: case END_STREAM_REASON_RESOURCELIMIT: - addr_policy_free(exitrouter->exit_policy); - exitrouter->exit_policy = - router_parse_addr_policy_from_string("reject *:*"); - + if (exitrouter) { + addr_policy_free(exitrouter->exit_policy); + exitrouter->exit_policy = + router_parse_addr_policy_from_string("reject *:*"); + } if (connection_ap_detach_retriable(conn, circ) >= 0) return 0; /* else, will close below */ |