clean up for configs
[oweals/gnunet.git] / src / mesh / gnunet-service-mesh_peer.c
index 5f41725cea11d47492e8c9bd022332167ce4aec3..4d183bbd6dd4f6915f8d0449c4653870dd004fba 100644 (file)
@@ -225,12 +225,38 @@ notify_broken (void *cls,
   struct MeshPeer *peer = cls;
   struct MeshConnection *c = value;
 
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "  notifying %s due to %s\n",
+       GMC_2s (c), GMP_2s (peer));
   GMC_notify_broken (c, peer);
 
   return GNUNET_YES;
 }
 
 
+/**
+ * Remove the direct path to the peer.
+ *
+ * @param peer Peer to remove the direct path from.
+ *
+ */
+static struct MeshPeerPath *
+pop_direct_path (struct MeshPeer *peer)
+{
+  struct MeshPeerPath *iter;
+
+  for (iter = peer->path_head; NULL != iter; iter = iter->next)
+  {
+    if (2 <= iter->length)
+    {
+      GNUNET_CONTAINER_DLL_remove (peer->path_head, peer->path_tail, iter);
+      return iter;
+    }
+  }
+  return NULL;
+}
+
+
+
 /**
  * Method called whenever a given peer connects.
  *
@@ -278,6 +304,7 @@ static void
 core_disconnect (void *cls, const struct GNUNET_PeerIdentity *peer)
 {
   struct MeshPeer *p;
+  struct MeshPeerPath *direct_path;
 
   LOG (GNUNET_ERROR_TYPE_DEBUG, "Peer disconnected\n");
   p = GNUNET_CONTAINER_multipeermap_get (peers, peer);
@@ -287,11 +314,11 @@ core_disconnect (void *cls, const struct GNUNET_PeerIdentity *peer)
     return;
   }
   if (myid == p->id)
-    LOG (GNUNET_ERROR_TYPE_DEBUG, "     (self)\n");
+    LOG (GNUNET_ERROR_TYPE_DEBUG, "     (self: %s)\n", GMP_2s (p));
   else
     LOG (GNUNET_ERROR_TYPE_DEBUG, "     %s\n", GMP_2s (p));
 
-
+  direct_path = pop_direct_path (p);
   GNUNET_CONTAINER_multihashmap_iterate (p->connections, &notify_broken, p);
   GNUNET_CONTAINER_multihashmap_destroy (p->connections);
   p->connections = NULL;
@@ -302,6 +329,7 @@ core_disconnect (void *cls, const struct GNUNET_PeerIdentity *peer)
     }
   GNUNET_STATISTICS_update (stats, "# peers", -1, GNUNET_NO);
 
+  path_destroy (direct_path);
   return;
 }
 
@@ -667,6 +695,9 @@ peer_get_best_path (const struct MeshPeer *peer)
     if (GNUNET_YES == GMT_is_path_used (peer->tunnel, p))
       continue; /* If path is already in use, skip it. */
 
+    if (GNUNET_NO == path_is_valid (p))
+      continue; /* Don't use invalid paths. */
+
     if ((cost = GMT_get_path_cost (peer->tunnel, p)) < best_cost)
     {
       best_cost = cost;
@@ -685,7 +716,19 @@ queue_is_sendable (struct MeshPeerQueue *q)
   {
     case GNUNET_MESSAGE_TYPE_MESH_ACK:
     case GNUNET_MESSAGE_TYPE_MESH_POLL:
+    case GNUNET_MESSAGE_TYPE_MESH_KX:
+    case GNUNET_MESSAGE_TYPE_MESH_CONNECTION_CREATE:
+    case GNUNET_MESSAGE_TYPE_MESH_CONNECTION_ACK:
+    case GNUNET_MESSAGE_TYPE_MESH_CONNECTION_DESTROY:
+    case GNUNET_MESSAGE_TYPE_MESH_CONNECTION_BROKEN:
+    case GNUNET_MESSAGE_TYPE_MESH_KEEPALIVE:
       return GNUNET_YES;
+
+    case GNUNET_MESSAGE_TYPE_MESH_ENCRYPTED:
+      break;
+
+    default:
+      GNUNET_break (0);
   }
 
   if (GMC_is_sendable (q->c, q->fwd))
@@ -757,8 +800,6 @@ search_handler (void *cls, const struct MeshPeerPath *path)
  * @param buf Where the to write the message.
  *
  * @return number of bytes written to buf
- *
- * FIXME add GNUNET_MESSAGE_TYPE_MESH_KEEPALIVE
  */
 static size_t
 queue_send (void *cls, size_t size, void *buf)
@@ -770,7 +811,8 @@ queue_send (void *cls, size_t size, void *buf)
   size_t data_size;
 
   peer->core_transmit = NULL;
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "* Queue send (max %u)\n", size);
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "* Queue send towards %s (max %u)\n",
+       GMP_2s (peer), size);
 
   if (NULL == buf || 0 == size)
   {
@@ -788,7 +830,6 @@ queue_send (void *cls, size_t size, void *buf)
   c = queue->c;
 
   dst_id = GNUNET_PEER_resolve2 (peer->id);
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "*   towards %s\n", GNUNET_i2s (dst_id));
   LOG (GNUNET_ERROR_TYPE_DEBUG, "*   on connection %s\n", GMC_2s (c));
   /* Check if buffer size is enough for the message */
   if (queue->size > size)
@@ -929,6 +970,7 @@ GMP_queue_destroy (struct MeshPeerQueue *queue, int clear_cls)
       case GNUNET_MESSAGE_TYPE_MESH_CONNECTION_ACK:
       case GNUNET_MESSAGE_TYPE_MESH_CONNECTION_CREATE:
       case GNUNET_MESSAGE_TYPE_MESH_CONNECTION_BROKEN:
+      case GNUNET_MESSAGE_TYPE_MESH_KEEPALIVE:
       case GNUNET_MESSAGE_TYPE_MESH_KX:
       case GNUNET_MESSAGE_TYPE_MESH_ENCRYPTED:
       case GNUNET_MESSAGE_TYPE_MESH_ACK:
@@ -1080,9 +1122,7 @@ GMP_queue_cancel (struct MeshPeer *peer, struct MeshConnection *c)
     prev = q->prev;
     if (q->c == c)
     {
-      LOG (GNUNET_ERROR_TYPE_DEBUG,
-                  "GMP_cancel_queue %s\n",
-                  GM_m2s (q->type));
+      LOG (GNUNET_ERROR_TYPE_DEBUG, "GMP_cancel_queue %s\n", GM_m2s (q->type));
       GMP_queue_destroy (q, GNUNET_YES);
 
       /* Get next from prev, q->next might be already freed:
@@ -1307,7 +1347,7 @@ GMP_connect (struct MeshPeer *peer)
 
   if (NULL != peer->path_head)
   {
-    LOG (GNUNET_ERROR_TYPE_DEBUG, "path exists\n");
+    LOG (GNUNET_ERROR_TYPE_DEBUG, "  some path exists\n");
     p = peer_get_best_path (peer);
     if (NULL != p)
     {
@@ -1340,8 +1380,7 @@ GMP_connect (struct MeshPeer *peer)
     }
     else
     {
-      LOG (GNUNET_ERROR_TYPE_DEBUG, "but is NULL!!\n");
-      GNUNET_break (0);
+      LOG (GNUNET_ERROR_TYPE_DEBUG, "  but is NULL, all paths are in use\n");
     }
   }
 
@@ -1440,15 +1479,31 @@ int
 GMP_add_connection (struct MeshPeer *peer,
                     struct MeshConnection *c)
 {
+  int result;
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "adding connection %s\n", GMC_2s (c));
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "to peer %s\n", GMP_2s (peer));
+
   if (NULL == peer->connections)
   {
     GNUNET_break (0);
+    LOG (GNUNET_ERROR_TYPE_DEBUG,
+         "Peer %s is not a neighbor!\n",
+         GMP_2s (peer));
     return GNUNET_SYSERR;
   }
-  return GNUNET_CONTAINER_multihashmap_put (peer->connections,
-                                            GMC_get_id (c),
-                                            c,
-                                            GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "peer %s ok, has %u connections.\n",
+       GMP_2s (peer), GNUNET_CONTAINER_multihashmap_size (peer->connections));
+  result = GNUNET_CONTAINER_multihashmap_put (peer->connections,
+                                              GMC_get_id (c),
+                                              c,
+                                              GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       " now has %u connections.\n",
+       GNUNET_CONTAINER_multihashmap_size (peer->connections));
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "result %u\n", result);
+
+  return result;
 }
 
 
@@ -1641,6 +1696,9 @@ int
 GMP_remove_connection (struct MeshPeer *peer,
                        const struct MeshConnection *c)
 {
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "removing connection %s\n", GMC_2s (c));
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "from peer %s\n", GMP_2s (peer));
+
   if (NULL == peer || NULL == peer->connections)
   {
     LOG (GNUNET_ERROR_TYPE_DEBUG,
@@ -1648,6 +1706,10 @@ GMP_remove_connection (struct MeshPeer *peer,
          GMP_2s (peer));
     return GNUNET_SYSERR;
   }
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "peer %s ok, has %u connections.\n",
+       GMP_2s (peer), GNUNET_CONTAINER_multihashmap_size (peer->connections));
+
   return GNUNET_CONTAINER_multihashmap_remove (peer->connections,
                                                GMC_get_id (c),
                                                c);