diff options
author | Bart Polot <bart@net.in.tum.de> | 2012-01-23 14:21:03 +0000 |
---|---|---|
committer | Bart Polot <bart@net.in.tum.de> | 2012-01-23 14:21:03 +0000 |
commit | c82878c08b3d8f45ab62324aab268b9e94f29a5f (patch) | |
tree | 0a76afe1a8da02ede60e7f569245e603ea534a21 /src/mesh | |
parent | bacd439e747d5f765927ffe0a114ac95353e40d2 (diff) | |
download | gnunet-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.c | 42 |
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 | ||