aboutsummaryrefslogtreecommitdiff
path: root/src/mesh
diff options
context:
space:
mode:
authorBart Polot <bart@net.in.tum.de>2012-01-23 14:21:03 +0000
committerBart Polot <bart@net.in.tum.de>2012-01-23 14:21:03 +0000
commitc82878c08b3d8f45ab62324aab268b9e94f29a5f (patch)
tree0a76afe1a8da02ede60e7f569245e603ea534a21 /src/mesh
parentbacd439e747d5f765927ffe0a114ac95353e40d2 (diff)
downloadgnunet-c82878c08b3d8f45ab62324aab268b9e94f29a5f.tar.gz
gnunet-c82878c08b3d8f45ab62324aab268b9e94f29a5f.zip
- Attempted to fix #2095 (add incoming tunnel to incomings), don't let destination destroy tunnel, disconnect instead
Diffstat (limited to 'src/mesh')
-rw-r--r--src/mesh/gnunet-service-mesh.c42
1 files changed, 31 insertions, 11 deletions
diff --git a/src/mesh/gnunet-service-mesh.c b/src/mesh/gnunet-service-mesh.c
index 2b55f0822..a09c60f93 100644
--- a/src/mesh/gnunet-service-mesh.c
+++ b/src/mesh/gnunet-service-mesh.c
@@ -1312,14 +1312,16 @@ send_create_path (struct MeshPeerInfo *peer, struct MeshPeerPath *p,
1312 path_info->pos = peer_info_transmit_slot (neighbor); 1312 path_info->pos = peer_info_transmit_slot (neighbor);
1313 neighbor->types[path_info->pos] = GNUNET_MESSAGE_TYPE_MESH_PATH_CREATE; 1313 neighbor->types[path_info->pos] = GNUNET_MESSAGE_TYPE_MESH_PATH_CREATE;
1314 neighbor->infos[path_info->pos] = path_info; 1314 neighbor->infos[path_info->pos] = path_info;
1315 neighbor->core_transmit[path_info->pos] = GNUNET_CORE_notify_transmit_ready (core_handle, /* handle */ 1315 neighbor->core_transmit[path_info->pos] =
1316 0, /* cork */ 1316 GNUNET_CORE_notify_transmit_ready (core_handle, /* handle */
1317 0, /* priority */ 1317 0, /* cork */
1318 GNUNET_TIME_UNIT_FOREVER_REL, /* timeout */ 1318 0, /* priority */
1319 &id, /* target */ 1319 GNUNET_TIME_UNIT_FOREVER_REL, /* timeout */
1320 sizeof (struct GNUNET_MESH_ManipulatePath) + (p->length * sizeof (struct GNUNET_PeerIdentity)), /*size */ 1320 &id, /* target */
1321 &send_core_create_path, /* callback */ 1321 sizeof (struct GNUNET_MESH_ManipulatePath) +
1322 path_info); /* cls */ 1322 (p->length * sizeof (struct GNUNET_PeerIdentity)), /*size */
1323 &send_core_create_path, /* callback */
1324 path_info); /* cls */
1323} 1325}
1324 1326
1325 1327
@@ -2234,10 +2236,15 @@ tunnel_destroy (struct MeshTunnel *t)
2234 } 2236 }
2235 c = t->client_dest; 2237 c = t->client_dest;
2236 GNUNET_CRYPTO_hash (&t->local_tid_dest, sizeof (MESH_TunnelNumber), &hash); 2238 GNUNET_CRYPTO_hash (&t->local_tid_dest, sizeof (MESH_TunnelNumber), &hash);
2237 if (NULL != c && 2239 if (NULL != c)
2238 GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (c->tunnels, &hash, t))
2239 { 2240 {
2240 r = GNUNET_SYSERR; 2241 if (GNUNET_YES !=
2242 GNUNET_CONTAINER_multihashmap_remove (c->tunnels, &hash, t) ||
2243 GNUNET_YES !=
2244 GNUNET_CONTAINER_multihashmap_remove (incoming_tunnels, &hash, t))
2245 {
2246 r = GNUNET_SYSERR;
2247 }
2241 } 2248 }
2242 if (t->local_tid >= GNUNET_MESH_LOCAL_TUNNEL_ID_SERV) 2249 if (t->local_tid >= GNUNET_MESH_LOCAL_TUNNEL_ID_SERV)
2243 { 2250 {
@@ -3782,6 +3789,17 @@ handle_local_tunnel_destroy (void *cls, struct GNUNET_SERVER_Client *client,
3782 send_client_tunnel_disconnect(t, c); 3789 send_client_tunnel_disconnect(t, c);
3783 GNUNET_assert (GNUNET_YES == 3790 GNUNET_assert (GNUNET_YES ==
3784 GNUNET_CONTAINER_multihashmap_remove (c->tunnels, &hash, t)); 3791 GNUNET_CONTAINER_multihashmap_remove (c->tunnels, &hash, t));
3792 if (c == t->client_dest)
3793 {
3794 GNUNET_assert (GNUNET_YES ==
3795 GNUNET_CONTAINER_multihashmap_remove (incoming_tunnels, &hash, t));
3796 GNUNET_assert (GNUNET_YES ==
3797 GNUNET_CONTAINER_multihashmap_remove (t->peers, &my_full_id.hashPubKey, t));
3798 t->client_dest = NULL;
3799 t->local_tid_dest = 0;
3800 GNUNET_SERVER_receive_done (client, GNUNET_OK);
3801 return;
3802 }
3785 3803
3786 t->client = NULL; 3804 t->client = NULL;
3787 tunnel_send_destroy (t); 3805 tunnel_send_destroy (t);
@@ -4022,6 +4040,8 @@ handle_local_connect_by_type (void *cls, struct GNUNET_SERVER_Client *client,
4022 GNUNET_CRYPTO_hash (&t->local_tid_dest, sizeof (MESH_TunnelNumber), &hash); 4040 GNUNET_CRYPTO_hash (&t->local_tid_dest, sizeof (MESH_TunnelNumber), &hash);
4023 GNUNET_CONTAINER_multihashmap_put (c->tunnels, &hash, t, 4041 GNUNET_CONTAINER_multihashmap_put (c->tunnels, &hash, t,
4024 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); 4042 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
4043 GNUNET_CONTAINER_multihashmap_put (incoming_tunnels, &hash, t,
4044 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
4025 GNUNET_SERVER_notification_context_unicast (nc, c->handle, &cmsg.header, 4045 GNUNET_SERVER_notification_context_unicast (nc, c->handle, &cmsg.header,
4026 GNUNET_NO); 4046 GNUNET_NO);
4027 4047