Loading src/or/circuit.c +21 −8 Original line number Diff line number Diff line Loading @@ -647,9 +647,18 @@ int circuit_establish_circuit(void) { circ = circuit_new(0, NULL); /* sets circ->p_circ_id and circ->p_conn */ circ->state = CIRCUIT_STATE_OR_WAIT; circ->cpath = onion_generate_cpath(&firsthop); circ->desired_cpath_len = onion_new_route_len(); if (circ->desired_cpath_len < 0) { log_fn(LOG_INFO,"Generating cpath length failed."); circuit_close(circ); return -1; } onion_extend_cpath(&circ->cpath, circ->desired_cpath_len, &firsthop); if(!circ->cpath) { log_fn(LOG_INFO,"Generating cpath failed."); log_fn(LOG_INFO,"Generating first cpath hop failed."); circuit_close(circ); return -1; } Loading Loading @@ -720,8 +729,9 @@ int circuit_send_next_onion_skin(circuit_t *circ) { cell_t cell; crypt_path_t *hop; routerinfo_t *router; int r; assert(circ && circ->cpath); assert(circ); if(circ->cpath->state == CPATH_STATE_CLOSED) { Loading @@ -747,17 +757,20 @@ int circuit_send_next_onion_skin(circuit_t *circ) { assert(circ->cpath->state == CPATH_STATE_OPEN); assert(circ->state == CIRCUIT_STATE_BUILDING); log_fn(LOG_DEBUG,"starting to send subsequent skin."); for(hop=circ->cpath->next; hop != circ->cpath && hop->state == CPATH_STATE_OPEN; hop=hop->next) ; if(hop == circ->cpath) { /* done building the circuit. whew. */ r = onion_extend_cpath(&circ->cpath, circ->desired_cpath_len, &router); if (r==1) { /* done building the circuit. whew. */ circ->state = CIRCUIT_STATE_OPEN; log_fn(LOG_INFO,"circuit built!"); log_fn(LOG_INFO,"circuit built! (%d hops long)",circ->desired_cpath_len); /* Tell any AP connections that have been waiting for a new * circuit that one is ready. */ connection_ap_attach_pending(); return 0; } else if (r<0) { log_fn(LOG_WARN,"Unable to extend circuit path."); return -1; } hop = circ->cpath->prev; router = router_get_by_addr_port(hop->addr,hop->port); if(!router) { Loading src/or/onion.c +7 −0 Original line number Diff line number Diff line Loading @@ -212,6 +212,13 @@ static int new_route_len(double cw, routerinfo_t **rarray, int rarray_len) { return routelen; } int onion_new_route_len(void) { directory_t *dir; router_get_directory(&dir); return new_route_len(options.CoinWeight, dir->routers, dir->n_routers); } static int count_acceptable_routers(routerinfo_t **rarray, int rarray_len) { int i, j; int num=0; Loading src/or/or.h +3 −0 Original line number Diff line number Diff line Loading @@ -409,6 +409,7 @@ struct circuit_t { crypto_cipher_env_t *p_crypto; /* used only for intermediate hops */ crypto_cipher_env_t *n_crypto; int desired_cpath_len; crypt_path_t *cpath; char onionskin[DH_ONIONSKIN_LEN]; /* for storage while onionskin pending */ Loading Loading @@ -710,6 +711,8 @@ int onion_skin_client_handshake(crypto_dh_env_t *handshake_state, char *key_out, int key_out_len); int onion_new_route_len(void); /********************************* routers.c ***************************/ int learn_my_address(struct sockaddr_in *me); Loading Loading
src/or/circuit.c +21 −8 Original line number Diff line number Diff line Loading @@ -647,9 +647,18 @@ int circuit_establish_circuit(void) { circ = circuit_new(0, NULL); /* sets circ->p_circ_id and circ->p_conn */ circ->state = CIRCUIT_STATE_OR_WAIT; circ->cpath = onion_generate_cpath(&firsthop); circ->desired_cpath_len = onion_new_route_len(); if (circ->desired_cpath_len < 0) { log_fn(LOG_INFO,"Generating cpath length failed."); circuit_close(circ); return -1; } onion_extend_cpath(&circ->cpath, circ->desired_cpath_len, &firsthop); if(!circ->cpath) { log_fn(LOG_INFO,"Generating cpath failed."); log_fn(LOG_INFO,"Generating first cpath hop failed."); circuit_close(circ); return -1; } Loading Loading @@ -720,8 +729,9 @@ int circuit_send_next_onion_skin(circuit_t *circ) { cell_t cell; crypt_path_t *hop; routerinfo_t *router; int r; assert(circ && circ->cpath); assert(circ); if(circ->cpath->state == CPATH_STATE_CLOSED) { Loading @@ -747,17 +757,20 @@ int circuit_send_next_onion_skin(circuit_t *circ) { assert(circ->cpath->state == CPATH_STATE_OPEN); assert(circ->state == CIRCUIT_STATE_BUILDING); log_fn(LOG_DEBUG,"starting to send subsequent skin."); for(hop=circ->cpath->next; hop != circ->cpath && hop->state == CPATH_STATE_OPEN; hop=hop->next) ; if(hop == circ->cpath) { /* done building the circuit. whew. */ r = onion_extend_cpath(&circ->cpath, circ->desired_cpath_len, &router); if (r==1) { /* done building the circuit. whew. */ circ->state = CIRCUIT_STATE_OPEN; log_fn(LOG_INFO,"circuit built!"); log_fn(LOG_INFO,"circuit built! (%d hops long)",circ->desired_cpath_len); /* Tell any AP connections that have been waiting for a new * circuit that one is ready. */ connection_ap_attach_pending(); return 0; } else if (r<0) { log_fn(LOG_WARN,"Unable to extend circuit path."); return -1; } hop = circ->cpath->prev; router = router_get_by_addr_port(hop->addr,hop->port); if(!router) { Loading
src/or/onion.c +7 −0 Original line number Diff line number Diff line Loading @@ -212,6 +212,13 @@ static int new_route_len(double cw, routerinfo_t **rarray, int rarray_len) { return routelen; } int onion_new_route_len(void) { directory_t *dir; router_get_directory(&dir); return new_route_len(options.CoinWeight, dir->routers, dir->n_routers); } static int count_acceptable_routers(routerinfo_t **rarray, int rarray_len) { int i, j; int num=0; Loading
src/or/or.h +3 −0 Original line number Diff line number Diff line Loading @@ -409,6 +409,7 @@ struct circuit_t { crypto_cipher_env_t *p_crypto; /* used only for intermediate hops */ crypto_cipher_env_t *n_crypto; int desired_cpath_len; crypt_path_t *cpath; char onionskin[DH_ONIONSKIN_LEN]; /* for storage while onionskin pending */ Loading Loading @@ -710,6 +711,8 @@ int onion_skin_client_handshake(crypto_dh_env_t *handshake_state, char *key_out, int key_out_len); int onion_new_route_len(void); /********************************* routers.c ***************************/ int learn_my_address(struct sockaddr_in *me); Loading