diff options
author | Roger Dingledine <arma@torproject.org> | 2004-04-03 03:06:06 +0000 |
---|---|---|
committer | Roger Dingledine <arma@torproject.org> | 2004-04-03 03:06:06 +0000 |
commit | 8a1ad2b84e180f1851feb467ceb0a636689e724a (patch) | |
tree | 4cc12adf99ffb2d01e222f8aab6eefb3d6ed4ace | |
parent | 7451de5d9735e95be04d9e5613ae1118236e7668 (diff) | |
download | tor-8a1ad2b84e180f1851feb467ceb0a636689e724a.tar tor-8a1ad2b84e180f1851feb467ceb0a636689e724a.tar.gz |
more progress on alice's side
svn:r1461
-rw-r--r-- | src/or/circuit.c | 3 | ||||
-rw-r--r-- | src/or/connection_edge.c | 82 | ||||
-rw-r--r-- | src/or/or.h | 1 | ||||
-rw-r--r-- | src/or/rendclient.c | 15 |
4 files changed, 70 insertions, 31 deletions
diff --git a/src/or/circuit.c b/src/or/circuit.c index 1d5103bbb..c92956182 100644 --- a/src/or/circuit.c +++ b/src/or/circuit.c @@ -1069,6 +1069,9 @@ static void circuit_is_ready(circuit_t *circ) { /* at Bob, connecting to rend point */ rend_service_rendezvous_is_ready(circ); break; + default: + log_fn(LOG_ERR,"unhandled purpose %d",circ->purpose); + assert(0); } } diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index f8cdfb7c7..f8b90557e 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -763,6 +763,53 @@ static int connection_ap_handshake_process_socks(connection_t *conn) { return 0; } +/* find an open circ that we're happy with: return 1. if there isn't + * one, launch one and return 0. if it will never work, return -1. + * write the found or launched circ into *circp. + */ +static int +get_open_circ_or_launch(connection_t *conn, + uint8_t desired_circuit_purpose, + circuit_t **circp) { + circuit_t *circ; + uint32_t addr; + + assert(conn); + assert(circp); + + circ = circuit_get_newest(conn, 1, desired_circuit_purpose); + + if(circ) { + *circp = circ; + return 1; /* we're happy */ + } + + log_fn(LOG_INFO,"No safe circuit (purpose %d) ready for edge connection; delaying.", + desired_circuit_purpose); + + if(conn->purpose == AP_PURPOSE_GENERAL) { + addr = client_dns_lookup_entry(conn->socks_request->address); + if(router_exit_policy_all_routers_reject(addr, conn->socks_request->port)) { + log_fn(LOG_WARN,"No Tor server exists that allows exit to %s:%d. Rejecting.", + conn->socks_request->address, conn->socks_request->port); + return -1; + } + } + if(!circuit_get_newest(conn, 0, desired_circuit_purpose)) { + /* is one already on the way? */ + circ = circuit_launch_new(desired_circuit_purpose, NULL); + /* depending on purpose, store stuff into circ */ + if(circ && + (desired_circuit_purpose == CIRCUIT_PURPOSE_C_GENERAL || + desired_circuit_purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND)) { + /* then write the service_id into circ */ + strcpy(circ->rend_query, conn->rend_query); + } + } + *circp = circ; + return 0; +} + /* Try to find a safe live circuit for CONN_TYPE_AP connection conn. If * we don't find one: if conn cannot be handled by any known nodes, * warn and return -1 (conn needs to die); @@ -771,9 +818,9 @@ static int connection_ap_handshake_process_socks(connection_t *conn) { * right next step, and return 1. */ int connection_ap_handshake_attach_circuit(connection_t *conn) { - circuit_t *circ; - uint32_t addr; + circuit_t *circ=NULL; uint8_t desired_circuit_purpose; + int retval; assert(conn); assert(conn->type == CONN_TYPE_AP); @@ -799,34 +846,9 @@ int connection_ap_handshake_attach_circuit(connection_t *conn) { } /* find the circuit that we should use, if there is one. */ - circ = circuit_get_newest(conn, 1, desired_circuit_purpose); - - if(!circ) { - - log_fn(LOG_INFO,"No safe circuit (purpose %d) ready for edge connection; delaying.", - desired_circuit_purpose); - - if(conn->purpose == AP_PURPOSE_GENERAL) { - addr = client_dns_lookup_entry(conn->socks_request->address); - if(router_exit_policy_all_routers_reject(addr, conn->socks_request->port)) { - log_fn(LOG_WARN,"No Tor server exists that allows exit to %s:%d. Rejecting.", - conn->socks_request->address, conn->socks_request->port); - return -1; - } - } - if(!circuit_get_newest(conn, 0, desired_circuit_purpose)) { - /* is one already on the way? */ - circ = circuit_launch_new(desired_circuit_purpose, NULL); - /* depending on purpose, store stuff into circ */ - if(circ && - (desired_circuit_purpose == CIRCUIT_PURPOSE_C_GENERAL || - desired_circuit_purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND)) { - /* then write the service_id into circ */ - strcpy(circ->rend_query, conn->rend_query); - } - } - return 0; - } + retval = get_open_circ_or_launch(conn, desired_circuit_purpose, &circ); + if(retval < 1) + return retval; /* We have found a suitable circuit for our conn. Hurray. */ diff --git a/src/or/or.h b/src/or/or.h index d14496458..d551b2163 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -1054,6 +1054,7 @@ int rend_get_service_id(crypto_pk_env_t *pk, char *out); void rend_cache_init(void); void rend_cache_clean(void); +int rend_valid_service_id(char *query); int rend_cache_lookup(char *query, const char **desc, int *desc_len); int rend_cache_store(char *desc, int desc_len); diff --git a/src/or/rendclient.c b/src/or/rendclient.c index dbd7ba128..afaa4e294 100644 --- a/src/or/rendclient.c +++ b/src/or/rendclient.c @@ -16,9 +16,22 @@ rend_client_introcirc_is_ready(connection_t *apconn, circuit_t *circ) void rend_client_rendcirc_is_ready(connection_t *apconn, circuit_t *circ) { + circuit_t *introcirc; + assert(apconn->purpose == AP_PURPOSE_RENDPOINT_WAIT); + assert(circ->purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND); + assert(circ->cpath); - log_fn(LOG_WARN,"rendcirc is ready"); + log_fn(LOG_INFO,"rendcirc is ready"); + + /* XXX generate a rendezvous cookie, store it in circ */ + /* store rendcirc in apconn */ + + apconn->purpose = AP_PURPOSE_INTROPOINT_WAIT; + if (connection_ap_handshake_attach_circuit(apconn) < 0) { + log_fn(LOG_WARN,"failed to start intro point. Closing conn."); + connection_mark_for_close(apconn,0); + } } /* bob sent us a rendezvous cell, join the circs. */ |