]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
put in the support for 'router twins'
authorRoger Dingledine <arma@torproject.org>
Mon, 8 Jul 2002 08:59:15 +0000 (08:59 +0000)
committerRoger Dingledine <arma@torproject.org>
Mon, 8 Jul 2002 08:59:15 +0000 (08:59 +0000)
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

src/or/circuit.c
src/or/command.c
src/or/connection.c
src/or/connection_ap.c
src/or/connection_or.c
src/or/main.c
src/or/or.h

index 6de76a6333a914c4a53a3f40d3056f2b7a01677a..20d6e254f04f79bad15e999d540457c6d176929e 100644 (file)
@@ -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;
 
index 621809677318e18921a7f6d341931a9ac648351f..dfe8edbaa35e74185cd3744d14137aa2d329af68 100644 (file)
@@ -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
index 099936e5dcdd540d09c0ed768af6178c11b0a269..0b80db7960d2738690dcefea35054959abc767a0 100644 (file)
@@ -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);
       }
index 666dd16cb438a8c1de6b397e77b5bcd831421767..0cb1d5314eb1644e334947146855ca194bb86b61 100644 (file)
@@ -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.");
index a2fb1a79690b20b5a2f1b71386244149d3a8c01f..7badd19c938fbeba40da8490629b965df35ecf23 100644 (file)
@@ -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;
   }
index 13ea9184b44828f548917342338b3e92f06cc71a..b81ca2a464a1b687ab5fc46c5cf19f526de55646 100644 (file)
@@ -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;
 
index 7e8d323b37fe348072fc0c540debe1ccd6d4d86a..75111d80e6db3118f3fa32161f264facfa935736 100644 (file)
@@ -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);