Loading src/or/connection.c +93 −0 Original line number Diff line number Diff line Loading @@ -510,6 +510,99 @@ int connection_write_to_buf(const char *string, int len, connection_t *conn) { return write_to_buf(string, len, conn->outbuf); } connection_t *connection_exact_get_by_addr_port(uint32_t addr, uint16_t port) { int i, n; connection_t *conn; connection_t **carray; get_connection_array(&carray,&n); for(i=0;i<n;i++) { conn = carray[i]; if(conn->addr == addr && conn->port == port && !conn->marked_for_close) return conn; } return NULL; } connection_t *connection_twin_get_by_addr_port(uint32_t addr, uint16_t port) { /* Find a connection to the router described by addr and port, * or alternately any router which knows its key. * This connection *must* be in 'open' state. * If not, return NULL. */ int i, n; connection_t *conn; routerinfo_t *router; connection_t **carray; /* first check if it's there exactly */ conn = connection_exact_get_by_addr_port(addr,port); if(conn && connection_state_is_open(conn)) { log(LOG_INFO,"connection_twin_get_by_addr_port(): Found exact match."); return conn; } /* now check if any of the other open connections are a twin for this one */ router = router_get_by_addr_port(addr,port); if(!router) return NULL; get_connection_array(&carray,&n); for(i=0;i<n;i++) { conn = carray[i]; assert(conn); if(connection_state_is_open(conn) && !conn->marked_for_close && !crypto_pk_cmp_keys(conn->onion_pkey, router->onion_pkey)) { log(LOG_INFO,"connection_twin_get_by_addr_port(): Found twin (%s).",conn->address); return conn; } } return NULL; } connection_t *connection_get_by_type(int type) { int i, n; connection_t *conn; connection_t **carray; get_connection_array(&carray,&n); for(i=0;i<n;i++) { conn = carray[i]; if(conn->type == type && !conn->marked_for_close) return conn; } return NULL; } connection_t *connection_get_by_type_state(int type, int state) { int i, n; connection_t *conn; connection_t **carray; for(i=0;i<n;i++) { conn = carray[i]; if(conn->type == type && conn->state == state && !conn->marked_for_close) return conn; } return NULL; } connection_t *connection_get_by_type_state_lastwritten(int type, int state) { int i, n; connection_t *conn, *best=NULL; connection_t **carray; for(i=0;i<n;i++) { conn = carray[i]; if(conn->type == type && conn->state == state && !conn->marked_for_close) if(!best || conn->timestamp_lastwritten < best->timestamp_lastwritten) best = conn; } return best; } int connection_receiver_bucket_should_increase(connection_t *conn) { assert(conn); Loading src/or/main.c +3 −86 Original line number Diff line number Diff line Loading @@ -131,91 +131,9 @@ int connection_remove(connection_t *conn) { return 0; } connection_t *connection_twin_get_by_addr_port(uint32_t addr, uint16_t port) { /* Find a connection to the router described by addr and port, * or alternately any router which knows its key. * This connection *must* be in 'open' state. * If not, return NULL. */ int i; connection_t *conn; routerinfo_t *router; /* first check if it's there exactly */ conn = connection_exact_get_by_addr_port(addr,port); if(conn && connection_state_is_open(conn)) { log(LOG_INFO,"connection_twin_get_by_addr_port(): Found exact match."); return conn; } /* now check if any of the other open connections are a twin for this one */ router = router_get_by_addr_port(addr,port); if(!router) return NULL; for(i=0;i<nfds;i++) { conn = connection_array[i]; assert(conn); if(connection_state_is_open(conn) && !conn->marked_for_close && !crypto_pk_cmp_keys(conn->onion_pkey, router->onion_pkey)) { log(LOG_INFO,"connection_twin_get_by_addr_port(): Found twin (%s).",conn->address); return conn; } } /* guess not */ return NULL; } connection_t *connection_exact_get_by_addr_port(uint32_t addr, uint16_t port) { int i; connection_t *conn; for(i=0;i<nfds;i++) { conn = connection_array[i]; if(conn->addr == addr && conn->port == port && !conn->marked_for_close) return conn; } return NULL; } connection_t *connection_get_by_type(int type) { int i; connection_t *conn; for(i=0;i<nfds;i++) { conn = connection_array[i]; if(conn->type == type && !conn->marked_for_close) return conn; } return NULL; } connection_t *connection_get_by_type_state(int type, int state) { int i; connection_t *conn; for(i=0;i<nfds;i++) { conn = connection_array[i]; if(conn->type == type && conn->state == state && !conn->marked_for_close) return conn; } return NULL; } connection_t *connection_get_by_type_state_lastwritten(int type, int state) { int i; connection_t *conn, *best=NULL; for(i=0;i<nfds;i++) { conn = connection_array[i]; if(conn->type == type && conn->state == state && !conn->marked_for_close) if(!best || conn->timestamp_lastwritten < best->timestamp_lastwritten) best = conn; } return best; void get_connection_array(connection_t ***array, int *n) { *array = connection_array; *n = nfds; } void connection_watch_events(connection_t *conn, short events) { Loading Loading @@ -740,7 +658,6 @@ static void dumpstats(void) { /* dump stats to stdout */ circuit_dump_by_conn(conn); /* dump info about all the circuits using this conn */ printf("\n"); } } int dump_router_to_string(char *s, int maxlen, routerinfo_t *router, Loading src/or/or.h +7 −7 Original line number Diff line number Diff line Loading @@ -540,6 +540,13 @@ int connection_flush_buf(connection_t *conn); int connection_handle_write(connection_t *conn); int connection_write_to_buf(const char *string, int len, connection_t *conn); connection_t *connection_twin_get_by_addr_port(uint32_t addr, uint16_t port); connection_t *connection_exact_get_by_addr_port(uint32_t addr, uint16_t port); connection_t *connection_get_by_type(int type); connection_t *connection_get_by_type_state(int type, int state); connection_t *connection_get_by_type_state_lastwritten(int type, int state); int connection_receiver_bucket_should_increase(connection_t *conn); #define connection_speaks_cells(conn) ((conn)->type == CONN_TYPE_OR) Loading Loading @@ -613,13 +620,6 @@ int connection_add(connection_t *conn); int connection_remove(connection_t *conn); void connection_set_poll_socket(connection_t *conn); connection_t *connection_twin_get_by_addr_port(uint32_t addr, uint16_t port); connection_t *connection_exact_get_by_addr_port(uint32_t addr, uint16_t port); connection_t *connection_get_by_type(int type); connection_t *connection_get_by_type_state(int type, int state); connection_t *connection_get_by_type_state_lastwritten(int type, int state); void connection_watch_events(connection_t *conn, short events); int connection_is_reading(connection_t *conn); void connection_stop_reading(connection_t *conn); Loading Loading
src/or/connection.c +93 −0 Original line number Diff line number Diff line Loading @@ -510,6 +510,99 @@ int connection_write_to_buf(const char *string, int len, connection_t *conn) { return write_to_buf(string, len, conn->outbuf); } connection_t *connection_exact_get_by_addr_port(uint32_t addr, uint16_t port) { int i, n; connection_t *conn; connection_t **carray; get_connection_array(&carray,&n); for(i=0;i<n;i++) { conn = carray[i]; if(conn->addr == addr && conn->port == port && !conn->marked_for_close) return conn; } return NULL; } connection_t *connection_twin_get_by_addr_port(uint32_t addr, uint16_t port) { /* Find a connection to the router described by addr and port, * or alternately any router which knows its key. * This connection *must* be in 'open' state. * If not, return NULL. */ int i, n; connection_t *conn; routerinfo_t *router; connection_t **carray; /* first check if it's there exactly */ conn = connection_exact_get_by_addr_port(addr,port); if(conn && connection_state_is_open(conn)) { log(LOG_INFO,"connection_twin_get_by_addr_port(): Found exact match."); return conn; } /* now check if any of the other open connections are a twin for this one */ router = router_get_by_addr_port(addr,port); if(!router) return NULL; get_connection_array(&carray,&n); for(i=0;i<n;i++) { conn = carray[i]; assert(conn); if(connection_state_is_open(conn) && !conn->marked_for_close && !crypto_pk_cmp_keys(conn->onion_pkey, router->onion_pkey)) { log(LOG_INFO,"connection_twin_get_by_addr_port(): Found twin (%s).",conn->address); return conn; } } return NULL; } connection_t *connection_get_by_type(int type) { int i, n; connection_t *conn; connection_t **carray; get_connection_array(&carray,&n); for(i=0;i<n;i++) { conn = carray[i]; if(conn->type == type && !conn->marked_for_close) return conn; } return NULL; } connection_t *connection_get_by_type_state(int type, int state) { int i, n; connection_t *conn; connection_t **carray; for(i=0;i<n;i++) { conn = carray[i]; if(conn->type == type && conn->state == state && !conn->marked_for_close) return conn; } return NULL; } connection_t *connection_get_by_type_state_lastwritten(int type, int state) { int i, n; connection_t *conn, *best=NULL; connection_t **carray; for(i=0;i<n;i++) { conn = carray[i]; if(conn->type == type && conn->state == state && !conn->marked_for_close) if(!best || conn->timestamp_lastwritten < best->timestamp_lastwritten) best = conn; } return best; } int connection_receiver_bucket_should_increase(connection_t *conn) { assert(conn); Loading
src/or/main.c +3 −86 Original line number Diff line number Diff line Loading @@ -131,91 +131,9 @@ int connection_remove(connection_t *conn) { return 0; } connection_t *connection_twin_get_by_addr_port(uint32_t addr, uint16_t port) { /* Find a connection to the router described by addr and port, * or alternately any router which knows its key. * This connection *must* be in 'open' state. * If not, return NULL. */ int i; connection_t *conn; routerinfo_t *router; /* first check if it's there exactly */ conn = connection_exact_get_by_addr_port(addr,port); if(conn && connection_state_is_open(conn)) { log(LOG_INFO,"connection_twin_get_by_addr_port(): Found exact match."); return conn; } /* now check if any of the other open connections are a twin for this one */ router = router_get_by_addr_port(addr,port); if(!router) return NULL; for(i=0;i<nfds;i++) { conn = connection_array[i]; assert(conn); if(connection_state_is_open(conn) && !conn->marked_for_close && !crypto_pk_cmp_keys(conn->onion_pkey, router->onion_pkey)) { log(LOG_INFO,"connection_twin_get_by_addr_port(): Found twin (%s).",conn->address); return conn; } } /* guess not */ return NULL; } connection_t *connection_exact_get_by_addr_port(uint32_t addr, uint16_t port) { int i; connection_t *conn; for(i=0;i<nfds;i++) { conn = connection_array[i]; if(conn->addr == addr && conn->port == port && !conn->marked_for_close) return conn; } return NULL; } connection_t *connection_get_by_type(int type) { int i; connection_t *conn; for(i=0;i<nfds;i++) { conn = connection_array[i]; if(conn->type == type && !conn->marked_for_close) return conn; } return NULL; } connection_t *connection_get_by_type_state(int type, int state) { int i; connection_t *conn; for(i=0;i<nfds;i++) { conn = connection_array[i]; if(conn->type == type && conn->state == state && !conn->marked_for_close) return conn; } return NULL; } connection_t *connection_get_by_type_state_lastwritten(int type, int state) { int i; connection_t *conn, *best=NULL; for(i=0;i<nfds;i++) { conn = connection_array[i]; if(conn->type == type && conn->state == state && !conn->marked_for_close) if(!best || conn->timestamp_lastwritten < best->timestamp_lastwritten) best = conn; } return best; void get_connection_array(connection_t ***array, int *n) { *array = connection_array; *n = nfds; } void connection_watch_events(connection_t *conn, short events) { Loading Loading @@ -740,7 +658,6 @@ static void dumpstats(void) { /* dump stats to stdout */ circuit_dump_by_conn(conn); /* dump info about all the circuits using this conn */ printf("\n"); } } int dump_router_to_string(char *s, int maxlen, routerinfo_t *router, Loading
src/or/or.h +7 −7 Original line number Diff line number Diff line Loading @@ -540,6 +540,13 @@ int connection_flush_buf(connection_t *conn); int connection_handle_write(connection_t *conn); int connection_write_to_buf(const char *string, int len, connection_t *conn); connection_t *connection_twin_get_by_addr_port(uint32_t addr, uint16_t port); connection_t *connection_exact_get_by_addr_port(uint32_t addr, uint16_t port); connection_t *connection_get_by_type(int type); connection_t *connection_get_by_type_state(int type, int state); connection_t *connection_get_by_type_state_lastwritten(int type, int state); int connection_receiver_bucket_should_increase(connection_t *conn); #define connection_speaks_cells(conn) ((conn)->type == CONN_TYPE_OR) Loading Loading @@ -613,13 +620,6 @@ int connection_add(connection_t *conn); int connection_remove(connection_t *conn); void connection_set_poll_socket(connection_t *conn); connection_t *connection_twin_get_by_addr_port(uint32_t addr, uint16_t port); connection_t *connection_exact_get_by_addr_port(uint32_t addr, uint16_t port); connection_t *connection_get_by_type(int type); connection_t *connection_get_by_type_state(int type, int state); connection_t *connection_get_by_type_state_lastwritten(int type, int state); void connection_watch_events(connection_t *conn, short events); int connection_is_reading(connection_t *conn); void connection_stop_reading(connection_t *conn); Loading