trying to make KX logic slightly more readable
[oweals/gnunet.git] / src / cadet / gnunet-service-cadet-new_core.c
index 8de780ce0a7bcffd5f517f7178538a751d4e392e..086337c9ab25af579fa1d776744470e503fa459d 100644 (file)
@@ -446,7 +446,7 @@ handle_connection_create (void *cls,
   {
     /* Duplicate CREATE, pass it on, previous one might have been lost! */
     LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "Passing on duplicate CREATE message on connection %s\n",
+         "Passing on duplicate CADET_CONNECTION_CREATE message on connection %s\n",
          GNUNET_sh2s (&msg->cid.connection_of_tunnel));
     route_message (sender,
                    &msg->cid,
@@ -465,7 +465,7 @@ handle_connection_create (void *cls,
     if (NULL != cc)
     {
       LOG (GNUNET_ERROR_TYPE_DEBUG,
-           "Received duplicate CREATE message on connection %s\n",
+           "Received duplicate CADET_CONNECTION_CREATE message on connection %s\n",
            GNUNET_sh2s (&msg->cid.connection_of_tunnel));
       GCC_handle_duplicate_create (cc);
       return;
@@ -474,15 +474,35 @@ handle_connection_create (void *cls,
     origin = GCP_get (&pids[0],
                       GNUNET_YES);
     LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "Received CREATE message from %s for connection %s, building inverse path\n",
+         "Received CADET_CONNECTION_CREATE message from %s for connection %s, building inverse path\n",
          GCP_2s (origin),
          GNUNET_sh2s (&msg->cid.connection_of_tunnel));
     path = GCPP_get_path_from_route (path_length - 1,
                                      pids);
-    GCT_add_inbound_connection (GCP_get_tunnel (origin,
-                                                GNUNET_YES),
-                                &msg->cid,
-                                path);
+    if (GNUNET_OK !=
+        GCT_add_inbound_connection (GCP_get_tunnel (origin,
+                                                    GNUNET_YES),
+                                    &msg->cid,
+                                    path))
+    {
+      /* Send back BROKEN: duplicate connection on the same path,
+         we will use the other one. */
+      struct GNUNET_MQ_Envelope *env;
+      struct GNUNET_CADET_ConnectionBrokenMessage *bm;
+
+      LOG (GNUNET_ERROR_TYPE_DEBUG,
+           "Received CADET_CONNECTION_CREATE from %s for %s, but %s already has a connection. Sending BROKEN\n",
+           GCP_2s (sender),
+           GNUNET_sh2s (&msg->cid.connection_of_tunnel),
+           GCPP_2s (path));
+      env = GNUNET_MQ_msg (bm,
+                           GNUNET_MESSAGE_TYPE_CADET_CONNECTION_BROKEN);
+      bm->cid = msg->cid;
+      bm->peer1 = my_full_id;
+      GCP_send_ooo (sender,
+                    env);
+      return;
+    }
     return;
   }
   /* We are merely a hop on the way, check if we can support the route */
@@ -496,7 +516,7 @@ handle_connection_create (void *cls,
     struct GNUNET_CADET_ConnectionBrokenMessage *bm;
 
     LOG (GNUNET_ERROR_TYPE_DEBUG,
-         "Received CONNECTION_CREATE from %s for %s. Next hop %s:%u is down. Sending BROKEN\n",
+         "Received CADET_CONNECTION_CREATE from %s for %s. Next hop %s:%u is down. Sending BROKEN\n",
          GCP_2s (sender),
          GNUNET_sh2s (&msg->cid.connection_of_tunnel),
          GNUNET_i2s (&pids[off + 1]),
@@ -513,7 +533,7 @@ handle_connection_create (void *cls,
 
   /* Workable route, create routing entry */
   LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Received CONNECTION_CREATE from %s for %s. Next hop %s:%u is up. Creating route\n",
+       "Received CADET_CONNECTION_CREATE from %s for %s. Next hop %s:%u is up. Creating route\n",
        GCP_2s (sender),
        GNUNET_sh2s (&msg->cid.connection_of_tunnel),
        GNUNET_i2s (&pids[off + 1]),
@@ -611,7 +631,7 @@ handle_connection_broken (void *cls,
     LOG (GNUNET_ERROR_TYPE_DEBUG,
          "Received CONNECTION_BROKEN for connection %s. Destroying it.\n",
          GNUNET_sh2s (&msg->cid.connection_of_tunnel));
-    GCC_destroy (cc);
+    GCC_destroy_without_core (cc);
 
     /* FIXME: also destroy the path up to the specified link! */
     return;
@@ -661,7 +681,7 @@ handle_connection_destroy (void *cls,
          "Received CONNECTION_DESTROY for connection %s. Destroying connection.\n",
          GNUNET_sh2s (&msg->cid.connection_of_tunnel));
 
-    GCC_destroy (cc);
+    GCC_destroy_without_core (cc);
     return;
   }