- fix #3114: add feedback from _local to _channel on who is requesting the channel...
authorBart Polot <bart@net.in.tum.de>
Tue, 26 Nov 2013 01:52:30 +0000 (01:52 +0000)
committerBart Polot <bart@net.in.tum.de>
Tue, 26 Nov 2013 01:52:30 +0000 (01:52 +0000)
src/mesh/gnunet-service-mesh_channel.c
src/mesh/gnunet-service-mesh_channel.h
src/mesh/gnunet-service-mesh_local.c

index 92e345cb85c8c4b806c0ad1b3f138d180d3968e6..4b510edc21cdeb91056e6f5eb34b86e609de5ead 100644 (file)
@@ -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))
index 346cfcad56b7b63ba7a9e510da37e95058b4a3c3..d48feb8a6df041682c692d22e6599f1e51f4487d 100644 (file)
@@ -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.
index 560289efc7b0ec6732dc64120a1376819165bdef..2d4db7ad06652a5dc799f9021ce5c0c05a15d035 100644 (file)
@@ -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;