From c4bf6c6e248b3e9f97bac1e9faa04bd7d7c126a1 Mon Sep 17 00:00:00 2001 From: Bart Polot Date: Tue, 26 Nov 2013 01:52:30 +0000 Subject: [PATCH] - fix #3114: add feedback from _local to _channel on who is requesting the channel destruction, notify the other part --- src/mesh/gnunet-service-mesh_channel.c | 12 +++++++----- src/mesh/gnunet-service-mesh_channel.h | 4 +++- src/mesh/gnunet-service-mesh_local.c | 4 ++-- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/mesh/gnunet-service-mesh_channel.c b/src/mesh/gnunet-service-mesh_channel.c index 92e345cb8..4b510edc2 100644 --- a/src/mesh/gnunet-service-mesh_channel.c +++ b/src/mesh/gnunet-service-mesh_channel.c @@ -1155,7 +1155,7 @@ GMCH_send_destroy (struct MeshChannel *ch) msg.chid = htonl (ch->gid); /* If root is not NULL, notify. - * If it's NULL, check lid_root. When a local destroy comes in, root + * If it's NULL, check lid_root. When a local destroy comes in, root * is set to NULL but lid_root is left untouched. In this case, do nothing, * the client is the one who reuqested the channel to be destroyed. */ @@ -1438,21 +1438,23 @@ GMCH_handle_local_data (struct MeshChannel *ch, * * @param ch Channel. * @param c Client that requested the destruction (to avoid notifying him). + * @param is_root Is the request coming from root? */ void GMCH_handle_local_destroy (struct MeshChannel *ch, - struct MeshClient *c) + struct MeshClient *c, + int is_root) { struct MeshTunnel3 *t; /* Cleanup after the tunnel */ - if (c == ch->dest) + if (GNUNET_NO == is_root && c == ch->dest) { LOG (GNUNET_ERROR_TYPE_DEBUG, " Client %s is destination.\n", GML_2s (c)); GML_client_delete_channel (c, ch, ch->lid_dest); ch->dest = NULL; } - if (c == ch->root) + if (GNUNET_YES == is_root && c == ch->root) { LOG (GNUNET_ERROR_TYPE_DEBUG, " Client %s is owner.\n", GML_2s (c)); GML_client_delete_channel (c, ch, ch->lid_root); @@ -1908,7 +1910,7 @@ GMCH_send_prebuilt_message (const struct GNUNET_MessageHeader *message, int retransmission) { LOG (GNUNET_ERROR_TYPE_DEBUG, "GMCH Send %s %s on channel %s\n", - fwd ? "FWD" : "BCK", GNUNET_MESH_DEBUG_M2S (ntohs (message->type)), + fwd ? "FWD" : "BCK", GNUNET_MESH_DEBUG_M2S (ntohs (message->type)), GMCH_2s (ch)); if (GMT_is_loopback (ch->t)) diff --git a/src/mesh/gnunet-service-mesh_channel.h b/src/mesh/gnunet-service-mesh_channel.h index 346cfcad5..d48feb8a6 100644 --- a/src/mesh/gnunet-service-mesh_channel.h +++ b/src/mesh/gnunet-service-mesh_channel.h @@ -209,10 +209,12 @@ GMCH_handle_local_data (struct MeshChannel *ch, * * @param ch Channel. * @param c Client that requested the destruction (to avoid notifying him). + * @param is_root Is the request coming from root? */ void GMCH_handle_local_destroy (struct MeshChannel *ch, - struct MeshClient *c); + struct MeshClient *c, + int is_root); /** * Handle a channel create requested by a client. diff --git a/src/mesh/gnunet-service-mesh_local.c b/src/mesh/gnunet-service-mesh_local.c index 560289efc..2d4db7ad0 100644 --- a/src/mesh/gnunet-service-mesh_local.c +++ b/src/mesh/gnunet-service-mesh_local.c @@ -214,7 +214,7 @@ channel_destroy_iterator (void *cls, " Channel %s destroy, due to client %s shutdown.\n", GMCH_2s (ch), GML_2s (c)); - GMCH_handle_local_destroy (ch, c); + GMCH_handle_local_destroy (ch, c, key < GNUNET_MESH_LOCAL_CHANNEL_ID_SERV); return GNUNET_OK; } @@ -439,7 +439,7 @@ handle_channel_destroy (void *cls, struct GNUNET_SERVER_Client *client, return; } - GMCH_handle_local_destroy (ch, c); + GMCH_handle_local_destroy (ch, c, chid < GNUNET_MESH_LOCAL_CHANNEL_ID_SERV); GNUNET_SERVER_receive_done (client, GNUNET_OK); return; -- 2.25.1