mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
put in the support for 'router twins'
basically, a twin is a router which is different except it shares the same keypair. so in cases where we want to find a "next router" and all we really care is that it can decrypt the next onion layer, then a twin is just as good. we still need to decide how to mark twins in the routerinfo_t and in the routers config file. svn:r30
This commit is contained in:
@@ -98,7 +98,7 @@ aci_t get_unique_aci_by_addr_port(uint32_t addr, uint16_t port, int aci_type) {
|
||||
if(test_aci == 0)
|
||||
return get_unique_aci_by_addr_port(addr, port, aci_type); /* try again */
|
||||
|
||||
conn = connection_get_by_addr_port(addr,port);
|
||||
conn = connection_exact_get_by_addr_port(addr,port);
|
||||
if(!conn) /* there can't be a conflict -- no connection of that sort yet */
|
||||
return test_aci;
|
||||
|
||||
|
||||
@@ -91,7 +91,7 @@ void command_process_create_cell(cell_t *cell, connection_t *conn) {
|
||||
}
|
||||
|
||||
if(circ->n_addr && circ->n_port) { /* must send create cells to the next router */
|
||||
n_conn = connection_get_by_addr_port(circ->n_addr,circ->n_port);
|
||||
n_conn = connection_twin_get_by_addr_port(circ->n_addr,circ->n_port);
|
||||
if(!n_conn || n_conn->type != CONN_TYPE_OR) {
|
||||
/* i've disabled making connections through OPs, but it's definitely
|
||||
* possible here. I'm not sure if it would be a bug or a feature. -RD
|
||||
|
||||
@@ -205,7 +205,7 @@ int retry_all_connections(int role, routerinfo_t **router_array, int rarray_len,
|
||||
if(role & ROLE_OR_CONNECT_ALL) {
|
||||
for (i=0;i<rarray_len;i++) {
|
||||
router = router_array[i];
|
||||
if(!connection_get_by_addr_port(router->addr,router->or_port)) { /* not in the list */
|
||||
if(!connection_exact_get_by_addr_port(router->addr,router->or_port)) { /* not in the list */
|
||||
log(LOG_DEBUG,"retry_all_connections(): connecting to OR %s:%u.",router->address,ntohs(router->or_port));
|
||||
connection_or_connect_as_or(router, prkey, &local);
|
||||
}
|
||||
|
||||
@@ -202,7 +202,7 @@ int ap_handshake_establish_circuit(connection_t *conn, unsigned int *route, int
|
||||
|
||||
log(LOG_DEBUG,"ap_handshake_establish_circuit(): Looking for firsthop '%s:%u'",
|
||||
firsthop->address,ntohs(firsthop->or_port));
|
||||
n_conn = connection_get_by_addr_port(firsthop->addr,firsthop->or_port);
|
||||
n_conn = connection_twin_get_by_addr_port(firsthop->addr,firsthop->or_port);
|
||||
if(!n_conn) { /* not currently connected */
|
||||
if(global_role & ROLE_OR_CONNECT_ALL) { /* we would be connected if he were up. but he's not. */
|
||||
log(LOG_DEBUG,"ap_handshake_establish_circuit(): Route's firsthop isn't connected.");
|
||||
|
||||
@@ -583,7 +583,7 @@ int or_handshake_server_process_auth(connection_t *conn) {
|
||||
log(LOG_DEBUG,"or_handshake_server_process_auth() : Router identified as %s:%u.",
|
||||
router->address,ntohs(router->or_port));
|
||||
|
||||
if(connection_get_by_addr_port(addr,port)) {
|
||||
if(connection_exact_get_by_addr_port(addr,port)) {
|
||||
log(LOG_DEBUG,"or_handshake_server_process_auth(): That router is already connected. Dropping.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
+19
-1
@@ -111,7 +111,25 @@ int connection_remove(connection_t *conn) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
connection_t *connection_get_by_addr_port(uint32_t addr, uint16_t port) {
|
||||
connection_t *connection_twin_get_by_addr_port(uint32_t addr, uint16_t port) {
|
||||
int i;
|
||||
connection_t *conn;
|
||||
|
||||
/* first check if it's there exactly */
|
||||
conn = connection_exact_get_by_addr_port(addr,port);
|
||||
if(conn)
|
||||
return conn;
|
||||
|
||||
/* now check if any of the other open connections are a twin for this one */
|
||||
|
||||
/* XXX */
|
||||
|
||||
/* guess not */
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
connection_t *connection_exact_get_by_addr_port(uint32_t addr, uint16_t port) {
|
||||
int i;
|
||||
connection_t *conn;
|
||||
|
||||
|
||||
+2
-1
@@ -486,7 +486,8 @@ int connection_add(connection_t *conn);
|
||||
int connection_remove(connection_t *conn);
|
||||
void connection_set_poll_socket(connection_t *conn);
|
||||
|
||||
connection_t *connection_get_by_addr_port(uint32_t addr, uint16_t port);
|
||||
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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user