gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r32763 - gnunet/src/mesh


From: gnunet
Subject: [GNUnet-SVN] r32763 - gnunet/src/mesh
Date: Sat, 22 Mar 2014 03:58:32 +0100

Author: bartpolot
Date: 2014-03-22 03:58:32 +0100 (Sat, 22 Mar 2014)
New Revision: 32763

Modified:
   gnunet/src/mesh/gnunet-service-mesh_connection.c
   gnunet/src/mesh/gnunet-service-mesh_peer.c
   gnunet/src/mesh/gnunet-service-mesh_peer.h
Log:
- eliminate broken paths

Modified: gnunet/src/mesh/gnunet-service-mesh_connection.c
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_connection.c    2014-03-22 02:58:30 UTC 
(rev 32762)
+++ gnunet/src/mesh/gnunet-service-mesh_connection.c    2014-03-22 02:58:32 UTC 
(rev 32763)
@@ -1775,16 +1775,17 @@
   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));
     }
 

Modified: gnunet/src/mesh/gnunet-service-mesh_peer.c
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_peer.c  2014-03-22 02:58:30 UTC (rev 
32762)
+++ gnunet/src/mesh/gnunet-service-mesh_peer.c  2014-03-22 02:58:32 UTC (rev 
32763)
@@ -1234,6 +1234,7 @@
   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)
@@ -2028,6 +2029,57 @@
 
 
 /**
+ * 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.
  *
  * @param peer Peer to get path info.

Modified: gnunet/src/mesh/gnunet-service-mesh_peer.h
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_peer.h  2014-03-22 02:58:30 UTC (rev 
32762)
+++ gnunet/src/mesh/gnunet-service-mesh_peer.h  2014-03-22 02:58:32 UTC (rev 
32763)
@@ -358,6 +358,19 @@
 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.
  *
  * @param peer Peer to get path info.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]