- eliminate broken paths
authorBart Polot <bart@net.in.tum.de>
Sat, 22 Mar 2014 02:58:32 +0000 (02:58 +0000)
committerBart Polot <bart@net.in.tum.de>
Sat, 22 Mar 2014 02:58:32 +0000 (02:58 +0000)
src/mesh/gnunet-service-mesh_connection.c
src/mesh/gnunet-service-mesh_peer.c
src/mesh/gnunet-service-mesh_peer.h

index 31e8a48a8d42938a626e444d8e5fb024d457c540..15a6164cb8eae557ea269ff750f4f578e28282ca 100644 (file)
@@ -1775,16 +1775,17 @@ GMC_handle_broken (void* cls,
   fwd = is_fwd (c, id);
   if (GMC_is_terminal (c, fwd))
   {
-    struct GNUNET_MessageHeader *msg;
+    struct GNUNET_MessageHeader *out_msg;
     struct MeshPeer *peer;
 
     peer = get_hop (c, !fwd);
     path_invalidate (c->path);
+    GMP_notify_broken_link (c->t, &msg->peer1, &msg->peer2);
     c->state = MESH_CONNECTION_DESTROYED;
-    while (NULL != (msg = GMP_connection_pop (peer, c)))
+    while (NULL != (out_msg = GMP_connection_pop (peer, c)))
     {
       GNUNET_assert (NULL ==
-                     GMT_send_prebuilt_message (msg, c->t, NULL, GNUNET_YES,
+                     GMT_send_prebuilt_message (out_msg, c->t, NULL, GNUNET_YES,
                                                 NULL, NULL));
     }
 
index c1fc835a2cddc63b69a409509ec945ad92f1fafc..d45e4f2b9931d8b66c8e8359469e98bbe5c25ff9 100644 (file)
@@ -1234,6 +1234,7 @@ GMP_connection_pop (struct MeshPeer *peer, struct MeshConnection *c)
   struct MeshPeerQueue *q;
   struct GNUNET_MessageHeader *msg;
 
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "Connection pop on %s\n", GMC_2s (c));
   for (q = peer->queue_head; NULL != q; q = q->next)
   {
     if (q->c != c)
@@ -2027,6 +2028,57 @@ GMP_try_connect (struct MeshPeer *peer)
 }
 
 
+/**
+ * Notify a peer that a link between two other peers is broken. If any path
+ * used that link, eliminate it.
+ *
+ * @param peer Peer affected by the change.
+ * @param peer1 Peer whose link is broken.
+ * @param peer2 Peer whose link is broken.
+ */
+void
+GMP_notify_broken_link (struct MeshPeer *peer,
+                        struct GNUNET_PeerIdentity *peer1,
+                        struct GNUNET_PeerIdentity *peer2)
+{
+  struct MeshPeerPath *iter;
+  struct MeshPeerPath *next;
+  unsigned int i;
+  GNUNET_PEER_Id p1;
+  GNUNET_PEER_Id p2;
+
+  p1 = GNUNET_PEER_search (peer1);
+  p2 = GNUNET_PEER_search (peer2);
+
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "Link %u-%u broken\n", p1, p2);
+  if (0 == p1 || 0 == p2)
+  {
+    /* We don't even know them */
+    return;
+  }
+
+  for (iter = peer->path_head; NULL != iter; iter = next)
+  {
+    next = iter->next;
+    for (i = 0; i < iter->length - 1; i++)
+    {
+      if ((iter->peers[i] == p1 && iter->peers[i + 1] == p2)
+          || (iter->peers[i] == p2 && iter->peers[i + 1] == p1))
+      {
+        char *s;
+
+        s = path_2s (iter);
+        LOG (GNUNET_ERROR_TYPE_DEBUG, " - destroying %s\n", s);
+        GNUNET_free (s);
+
+        GNUNET_CONTAINER_DLL_remove (peer->path_head, peer->path_tail, iter);
+        path_destroy (iter);
+      }
+    }
+  }
+}
+
+
 /**
  * Count the number of known paths toward the peer.
  *
index dd8bd2a5ed6a347112c925520a333d5640766860..49bfd4050f1de875c6eb16a2211b8c0cbf8f9a51 100644 (file)
@@ -357,6 +357,19 @@ GMP_get_hello (struct MeshPeer *peer);
 void
 GMP_try_connect (struct MeshPeer *peer);
 
+/**
+ * Notify a peer that a link between two other peers is broken. If any path
+ * used that link, eliminate it.
+ *
+ * @param peer Peer affected by the change.
+ * @param peer1 Peer whose link is broken.
+ * @param peer2 Peer whose link is broken.
+ */
+void
+GMP_notify_broken_link (struct MeshPeer *peer,
+                        struct GNUNET_PeerIdentity *peer1,
+                        struct GNUNET_PeerIdentity *peer2);
+
 /**
  * Count the number of known paths toward the peer.
  *