diff options
author | Roger Dingledine <arma@torproject.org> | 2003-09-30 19:06:22 +0000 |
---|---|---|
committer | Roger Dingledine <arma@torproject.org> | 2003-09-30 19:06:22 +0000 |
commit | 2da3e4da0d2bf7ddde416f634c6e2a2d2445f861 (patch) | |
tree | 2d2502b7a3f9504bfd380c5138e03339e1554eed | |
parent | e7e858d0d1c39933c7cd2ada4cb8b19795782472 (diff) | |
download | tor-2da3e4da0d2bf7ddde416f634c6e2a2d2445f861.tar.gz tor-2da3e4da0d2bf7ddde416f634c6e2a2d2445f861.zip |
move connection_array accessors from main.c to connection.c
(leave poll_array accessors in main.c)
svn:r512
-rw-r--r-- | src/or/connection.c | 93 | ||||
-rw-r--r-- | src/or/main.c | 89 | ||||
-rw-r--r-- | src/or/or.h | 14 |
3 files changed, 103 insertions, 93 deletions
diff --git a/src/or/connection.c b/src/or/connection.c index bac327b604..61b6cb0c8a 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -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); diff --git a/src/or/main.c b/src/or/main.c index e96b8306d0..37e506ac07 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -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) { @@ -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, diff --git a/src/or/or.h b/src/or/or.h index 40401c3044..1d445dc764 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -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) @@ -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); |