gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r19327 - gnunet/src/mesh
Date: Mon, 23 Jan 2012 15:21:03 +0100

Author: bartpolot
Date: 2012-01-23 15:21:03 +0100 (Mon, 23 Jan 2012)
New Revision: 19327

Modified:
   gnunet/src/mesh/gnunet-service-mesh.c
Log:
- Attempted to fix #2095 (add incoming tunnel to incomings), don't let 
destination destroy tunnel, disconnect instead

Modified: gnunet/src/mesh/gnunet-service-mesh.c
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh.c       2012-01-23 13:08:11 UTC (rev 
19326)
+++ gnunet/src/mesh/gnunet-service-mesh.c       2012-01-23 14:21:03 UTC (rev 
19327)
@@ -1312,14 +1312,16 @@
   path_info->pos = peer_info_transmit_slot (neighbor);
   neighbor->types[path_info->pos] = GNUNET_MESSAGE_TYPE_MESH_PATH_CREATE;
   neighbor->infos[path_info->pos] = path_info;
-  neighbor->core_transmit[path_info->pos] = GNUNET_CORE_notify_transmit_ready 
(core_handle,     /* handle */
-                                                                               
0,       /* cork */
-                                                                               
0,       /* priority */
-                                                                               
GNUNET_TIME_UNIT_FOREVER_REL,    /* timeout */
-                                                                               
&id,     /* target */
-                                                                               
sizeof (struct GNUNET_MESH_ManipulatePath) + (p->length * sizeof (struct 
GNUNET_PeerIdentity)),  /*size */
-                                                                               
&send_core_create_path,  /* callback */
-                                                                               
path_info);      /* cls */
+  neighbor->core_transmit[path_info->pos] =
+    GNUNET_CORE_notify_transmit_ready (core_handle,     /* handle */
+                                       0,       /* cork */
+                                       0,       /* priority */
+                                       GNUNET_TIME_UNIT_FOREVER_REL,    /* 
timeout */
+                                       &id,     /* target */
+                                       sizeof (struct 
GNUNET_MESH_ManipulatePath) +
+                                         (p->length * sizeof (struct 
GNUNET_PeerIdentity)),  /*size */
+                                       &send_core_create_path,  /* callback */
+                                       path_info);      /* cls */
 }
 
 
@@ -2234,10 +2236,15 @@
   }
   c = t->client_dest;
   GNUNET_CRYPTO_hash (&t->local_tid_dest, sizeof (MESH_TunnelNumber), &hash);
-  if (NULL != c &&
-      GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (c->tunnels, &hash, 
t))
+  if (NULL != c)
   {
-    r = GNUNET_SYSERR;
+    if (GNUNET_YES !=
+          GNUNET_CONTAINER_multihashmap_remove (c->tunnels, &hash, t) ||
+        GNUNET_YES !=
+          GNUNET_CONTAINER_multihashmap_remove (incoming_tunnels, &hash, t))
+    {
+      r = GNUNET_SYSERR;
+    }
   }
   if (t->local_tid >= GNUNET_MESH_LOCAL_TUNNEL_ID_SERV)
   {
@@ -3782,6 +3789,17 @@
   send_client_tunnel_disconnect(t, c);
   GNUNET_assert (GNUNET_YES ==
                  GNUNET_CONTAINER_multihashmap_remove (c->tunnels, &hash, t));
+  if (c == t->client_dest)
+  {
+    GNUNET_assert (GNUNET_YES ==
+                   GNUNET_CONTAINER_multihashmap_remove (incoming_tunnels, 
&hash, t));
+    GNUNET_assert (GNUNET_YES ==
+                   GNUNET_CONTAINER_multihashmap_remove (t->peers, 
&my_full_id.hashPubKey, t));
+    t->client_dest = NULL;
+    t->local_tid_dest = 0;
+    GNUNET_SERVER_receive_done (client, GNUNET_OK);
+    return;
+  }
 
   t->client = NULL;
   tunnel_send_destroy (t);
@@ -4022,6 +4040,8 @@
     GNUNET_CRYPTO_hash (&t->local_tid_dest, sizeof (MESH_TunnelNumber), &hash);
     GNUNET_CONTAINER_multihashmap_put (c->tunnels, &hash, t,
                                        
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
+    GNUNET_CONTAINER_multihashmap_put (incoming_tunnels, &hash, t,
+                                       
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
     GNUNET_SERVER_notification_context_unicast (nc, c->handle, &cmsg.header,
                                                 GNUNET_NO);
     




reply via email to

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