Added purge_tree for connection_t's which are no longer in the connection,
[tinc] / src / protocol.c
index 8d9a551..d0dd9f7 100644 (file)
@@ -17,7 +17,7 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id: protocol.c,v 1.28.4.99 2001/07/15 18:07:31 guus Exp $
+    $Id: protocol.c,v 1.28.4.102 2001/07/20 20:25:10 guus Exp $
 */
 
 #include "config.h"
@@ -173,7 +173,6 @@ cp
 
 int id_h(connection_t *cl)
 {
-  connection_t *old;
   char name[MAX_STRING_SIZE];
 cp
   if(sscanf(cl->buffer, "%*d "MAX_STRING" %d %lx %hd", name, &cl->protocol_version, &cl->options, &cl->port) != 4)
@@ -206,17 +205,6 @@ cp
     
   cl->name = xstrdup(name);
 
-  /* Make sure we don't make an outgoing connection to a host that is already in our connection list */
-
-  if(cl->status.outgoing)
-    if((old = lookup_id(cl->name)))
-      {
-        if(debug_lvl >= DEBUG_CONNECTIONS)
-          syslog(LOG_NOTICE, _("We are already connected to %s."), cl->name);
-        old->status.outgoing = 1;
-        return -1;
-      }
-    
   /* Load information about peer */
 
   if(read_host_config(cl))
@@ -261,10 +249,6 @@ cp
       return 0;
     }
     
-  /* Now we can add the name to the id tree */
-  
-  id_add(cl);
-
   /* Also check if no other tinc daemon uses the same IP and port for UDP traffic */
   
   old = avl_search(active_tree, cl);
@@ -278,7 +262,6 @@ cp
   /* Activate this connection */
 
   cl->allow_request = ALL;
-  cl->status.active = 1;
   cl->nexthop = cl;
   cl->cipher_pkttype = EVP_bf_cbc();
   cl->cipher_pktkeylength = cl->cipher_pkttype->key_len + cl->cipher_pkttype->iv_len;
@@ -315,11 +298,11 @@ cp
 
   /* And send him all the hosts and their subnets we know... */
   
-  for(node = connection_tree->head; node; node = node->next)
+  for(node = active_tree->head; node; node = node->next)
     {
       p = (connection_t *)node->data;
       
-      if(p != cl && p->status.active)
+      if(p != cl)
         {
           /* Notify others of this connection */
 
@@ -336,7 +319,7 @@ cp
               send_add_subnet(cl, subnet);
             }
         }
-    }  
+    }
 cp
   return 0;
 }
@@ -702,7 +685,7 @@ cp
   for(node = connection_tree->head; node; node = node->next)
     {
       p = (connection_t *)node->data;
-      if(p->status.meta && p->status.active && p!= cl)
+      if(p->status.active && p!= cl)
         send_add_subnet(p, subnet);
     }
 cp
@@ -786,7 +769,7 @@ cp
   for(node = connection_tree->head; node; node = node->next)
     {
       p = (connection_t *)node->data;
-      if(p->status.meta && p->status.active && p!= cl)
+      if(p->status.active && p!= cl)
         send_del_subnet(p, subnet);
     }
 cp
@@ -850,7 +833,7 @@ cp
         {
           if(debug_lvl >= DEBUG_CONNECTIONS)
             syslog(LOG_NOTICE, _("Got duplicate ADD_HOST for %s (%s) from %s (%s)"),
-                   old->name, old->hostname, name, new->hostname);
+                   old->name, old->hostname, cl->name, cl->hostname);
           free_connection(new);
           return 0;
         }
@@ -864,25 +847,23 @@ cp
         }
     }
 
-  /* Hook it up into the connection */
+  /* Hook it up into the active tree */
 
   new->name = xstrdup(name);
-  connection_add(new);
-  id_add(new);
+  active_add(new);
 
   /* Tell the rest about the new host */
 
   for(node = connection_tree->head; node; node = node->next)
     {
       p = (connection_t *)node->data;
-      if(p->status.meta && p->status.active && p!=cl)
+      if(p->status.active && p!=cl)
         send_add_host(p, new);
     }
 
   /* Fill in rest of connection structure */
 
   new->nexthop = cl;
-  new->status.active = 1;
   new->cipher_pkttype = EVP_bf_cbc();
   new->cipher_pktkeylength = cl->cipher_pkttype->key_len + cl->cipher_pkttype->iv_len;
 cp
@@ -933,12 +914,12 @@ cp
       return 0;
     }
 
-  /* Check if the new host already exists in the connnection list */
+  /* Check if the deleted host already exists in the connnection list */
 
   if(!(old = lookup_id(name)))
     {
       syslog(LOG_ERR, _("Got DEL_HOST from %s (%s) for %s which is not in our connection list"),
-             name, cl->name, cl->hostname);
+             cl->name, cl->hostname, name);
       return -1;
     }
   
@@ -952,15 +933,14 @@ cp
 
   /* Ok, since EVERYTHING seems to check out all right, delete it */
 
-  old->status.active = 0;
   terminate_connection(old);
 
-  /* Tell the rest about the new host */
+  /* Tell the rest about the deleted host */
 
   for(node = connection_tree->head; node; node = node->next)
     {
       p = (connection_t *)node->data;
-      if(p->status.meta && p->status.active && p!=cl)
+      if(p->status.active && p!=cl)
         send_del_host(p, old);
     }
 cp
@@ -1100,7 +1080,7 @@ cp
   for(node = connection_tree->head; node; node = node->next)
     {
       p = (connection_t *)node->data;
-      if(p != cl && p->status.meta && p->status.active)
+      if(p != cl && p->status.active)
         if(!(p->options & OPTION_INDIRECT) || from == myself)
           send_request(p, "%d %s", KEY_CHANGED, from->name);
     }