gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r30959 - gnunet/src/mesh
Date: Fri, 29 Nov 2013 03:35:21 +0100

Author: bartpolot
Date: 2013-11-29 03:35:20 +0100 (Fri, 29 Nov 2013)
New Revision: 30959

Modified:
   gnunet/src/mesh/gnunet-service-mesh_channel.c
   gnunet/src/mesh/gnunet-service-mesh_channel.h
   gnunet/src/mesh/gnunet-service-mesh_connection.c
   gnunet/src/mesh/gnunet-service-mesh_connection.h
   gnunet/src/mesh/gnunet-service-mesh_peer.c
   gnunet/src/mesh/gnunet-service-mesh_tunnel.c
   gnunet/src/mesh/gnunet-service-mesh_tunnel.h
Log:
- use force flag to avoid connections dropping channel management data
- multiple bugfixes with channel shutdown



Modified: gnunet/src/mesh/gnunet-service-mesh_channel.c
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_channel.c       2013-11-28 19:43:21 UTC 
(rev 30958)
+++ gnunet/src/mesh/gnunet-service-mesh_channel.c       2013-11-29 02:35:20 UTC 
(rev 30959)
@@ -538,7 +538,7 @@
  * Notify a client that the channel is no longer valid.
  *
  * @param ch Channel that is destroyed.
- * @param local_only Should we try to send it to other peers?
+ * @param local_only Should we avoid sending it to other peers?
  */
 static void
 send_destroy (struct MeshChannel *ch, int local_only)
@@ -557,12 +557,12 @@
   if (NULL != ch->root)
     GML_send_channel_destroy (ch->root, ch->lid_root);
   else if (0 == ch->lid_root && GNUNET_NO == local_only)
-    GMCH_send_prebuilt_message (&msg.header, ch, GNUNET_NO, GNUNET_NO);
+    GMCH_send_prebuilt_message (&msg.header, ch, GNUNET_NO, NULL);
 
   if (NULL != ch->dest)
     GML_send_channel_destroy (ch->dest, ch->lid_dest);
   else if (0 == ch->lid_dest && GNUNET_NO == local_only)
-    GMCH_send_prebuilt_message (&msg.header, ch, GNUNET_YES, GNUNET_NO);
+    GMCH_send_prebuilt_message (&msg.header, ch, GNUNET_YES, NULL);
 }
 
 
@@ -596,6 +596,8 @@
   }
   if (GNUNET_SCHEDULER_NO_TASK != rel->retry_task)
     GNUNET_SCHEDULER_cancel (rel->retry_task);
+  if (NULL != rel->ack_q)
+    GMT_cancel (rel->ack_q->q);
   GNUNET_free (rel);
 }
 
@@ -705,14 +707,8 @@
   /* Message not found in the queue that we are going to use. */
   LOG (GNUNET_ERROR_TYPE_DEBUG, "!!! RETRANSMIT %u\n", copy->mid);
 
-  GMCH_send_prebuilt_message (&payload->header, ch, fwd, GNUNET_YES);
+  GMCH_send_prebuilt_message (&payload->header, ch, fwd, copy);
   GNUNET_STATISTICS_update (stats, "# data retransmitted", 1, GNUNET_NO);
-
-  copy->timestamp = GNUNET_TIME_absolute_get();
-  rel->retry_timer = GNUNET_TIME_STD_BACKOFF (rel->retry_timer);
-  rel->retry_task = GNUNET_SCHEDULER_add_delayed (rel->retry_timer,
-                                                  &channel_retransmit_message,
-                                                  cls);
 }
 
 
@@ -752,6 +748,13 @@
   {
     LOG (GNUNET_ERROR_TYPE_DEBUG, "!!! batch free, ignoring timing\n");
   }
+  rel->ch->pending_messages--;
+  if (GNUNET_NO != rel->ch->destroy && 0 == rel->ch->pending_messages)
+  {
+    struct MeshTunnel3 *t = rel->ch->t;
+    GMCH_destroy (rel->ch);
+    GMT_destroy_if_empty (t);
+  }
   GNUNET_CONTAINER_DLL_remove (rel->head_sent, rel->tail_sent, copy);
   GNUNET_free (copy);
 }
@@ -775,7 +778,7 @@
               GM_f2s (fwd), GMCH_2s (ch));
 
   msg.chid = htonl (ch->gid);
-  GMCH_send_prebuilt_message (&msg.header, ch, !fwd, GNUNET_NO);
+  GMCH_send_prebuilt_message (&msg.header, ch, !fwd, NULL);
 }
 
 
@@ -796,7 +799,7 @@
        GMCH_2s (ch));
 
   msg.chid = htonl (ch->gid);
-  GMCH_send_prebuilt_message (&msg.header, ch, GNUNET_NO, GNUNET_NO);
+  GMCH_send_prebuilt_message (&msg.header, ch, GNUNET_NO, NULL);
 }
 
 
@@ -863,14 +866,14 @@
   {
     case GNUNET_MESSAGE_TYPE_MESH_DATA:
       LOG (GNUNET_ERROR_TYPE_DEBUG, "!!! SENT %u %s\n",
-           copy->mid, GM_m2s (type));
+           NULL != copy ? copy->mid : 0, GM_m2s (type));
       copy->timestamp = GNUNET_TIME_absolute_get ();
       rel = copy->rel;
       if (GNUNET_SCHEDULER_NO_TASK == rel->retry_task)
       {
         rel->retry_timer =
             GNUNET_TIME_relative_multiply (rel->expected_delay,
-                                          MESH_RETRANSMIT_MARGIN);
+                                           MESH_RETRANSMIT_MARGIN);
         rel->retry_task =
             GNUNET_SCHEDULER_add_delayed (rel->retry_timer,
                                           &channel_retransmit_message,
@@ -888,6 +891,8 @@
 
     default:
       GNUNET_break (0);
+      GNUNET_free (ch_q);
+      return;
   }
 
   GNUNET_free (ch_q);
@@ -926,6 +931,7 @@
   copy->type = type;
   memcpy (&copy[1], msg, size);
   GNUNET_CONTAINER_DLL_insert_tail (rel->head_sent, rel->tail_sent, copy);
+  ch->pending_messages++;
 
   return copy;
 }
@@ -1163,6 +1169,13 @@
 
   rel = fwd ? ch->root_rel : ch->dest_rel;
 
+  if (NULL == rel)
+  {
+    /* Probably shutting down: root/dest NULL'ed to mark disconnection */
+    GNUNET_break (GNUNET_NO != ch->destroy);
+    return 0;
+  }
+
   return rel->client_allowed;
 }
 
@@ -1285,7 +1298,7 @@
        "!!! ACK for %u, futures %llX\n",
        ack, msg.futures);
 
-  GMCH_send_prebuilt_message (&msg.header, ch, !fwd, GNUNET_NO);
+  GMCH_send_prebuilt_message (&msg.header, ch, !fwd, NULL);
   LOG (GNUNET_ERROR_TYPE_DEBUG, "send_data_ack END\n");
 }
 
@@ -1315,7 +1328,7 @@
     rel = fwd ? ch->root_rel : ch->dest_rel;
     if (NULL == rel)
     {
-      GNUNET_break (0);
+      GNUNET_break (GNUNET_NO != ch->destroy);
       return;
     }
     if (NULL != rel->head_sent && 64 <= rel->mid_send - rel->head_sent->mid)
@@ -1466,7 +1479,7 @@
   payload->header.type = htons (GNUNET_MESSAGE_TYPE_MESH_DATA);
   payload->chid = htonl (ch->gid);
   LOG (GNUNET_ERROR_TYPE_DEBUG, "  sending on channel...\n");
-  GMCH_send_prebuilt_message (&payload->header, ch, fwd, GNUNET_NO);
+  GMCH_send_prebuilt_message (&payload->header, ch, fwd, NULL);
 
   if (is_loopback (ch))
   {
@@ -1501,6 +1514,7 @@
 {
   struct MeshTunnel3 *t;
 
+  ch->destroy = GNUNET_YES;
   /* Cleanup after the tunnel */
   if (GNUNET_NO == is_root && c == ch->dest)
   {
@@ -1517,8 +1531,11 @@
 
   t = ch->t;
   send_destroy (ch, GNUNET_NO);
-  GMCH_destroy (ch);
-  GMT_destroy_if_empty (t);
+  if (0 == ch->pending_messages)
+  {
+    GMCH_destroy (ch);
+    GMT_destroy_if_empty (t);
+  }
 }
 
 
@@ -1592,7 +1609,9 @@
     msgcc.port = msg->port;
     msgcc.opt = msg->opt;
 
-    GMT_send_prebuilt_message (&msgcc.header, t, ch, GNUNET_YES, NULL, NULL);
+    /* FIXME retransmit if lost */
+    GMT_send_prebuilt_message (&msgcc.header, t, ch,
+                               GNUNET_YES, GNUNET_YES, NULL, NULL);
   }
   return GNUNET_OK;
 }
@@ -1955,12 +1974,12 @@
  * @param message Message to send. Function makes a copy of it.
  * @param ch Channel on which this message is transmitted.
  * @param fwd Is this a fwd message?
- * @param retransmission Is this a retransmission? (Don't save a copy)
+ * @param existing_copy This is a retransmission, don't save a copy.
  */
 void
 GMCH_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
                             struct MeshChannel *ch, int fwd,
-                            int retransmission)
+                            void *existing_copy)
 {
   uint16_t type;
 
@@ -1975,37 +1994,56 @@
     return;
   }
 
-  if (GNUNET_YES == ch->reliable && GNUNET_NO == retransmission
-      && GNUNET_MESSAGE_TYPE_MESH_DATA == type)
+  switch (type)
   {
-    struct MeshChannelQueue *q;
+    case GNUNET_MESSAGE_TYPE_MESH_DATA:
 
-    q = GNUNET_new (struct MeshChannelQueue);
-    q->type = type;
-    q->copy = channel_save_copy (ch, message, fwd);
-    q->q = GMT_send_prebuilt_message (message, ch->t, ch, fwd,
-                                      &ch_message_sent, q);
-    /* Don't store q itself: we never need to cancel messages */
-  }
-  else if (GNUNET_MESSAGE_TYPE_MESH_DATA_ACK == type)
-  {
-    struct MeshChannelReliability *rel;
+      if (GNUNET_YES == ch->reliable)
+      {
+        struct MeshChannelQueue *q;
 
-    rel = fwd ? ch->root_rel : ch->dest_rel;
-    if (NULL != rel->ack_q)
-    {
-      GMT_cancel (rel->ack_q->q);
-      /* ch_message_sent is called, freeing ack_q */
-    }
-    rel->ack_q = GNUNET_new (struct MeshChannelQueue);
-    rel->ack_q->type = type;
-    rel->ack_q->rel = rel;
-    rel->ack_q->q = GMT_send_prebuilt_message (message, ch->t, ch, fwd,
-                                               &ch_message_sent, rel->ack_q);
+        q = GNUNET_new (struct MeshChannelQueue);
+        q->type = type;
+        if (NULL == existing_copy)
+          q->copy = channel_save_copy (ch, message, fwd);
+        else
+          q->copy = (struct MeshReliableMessage *) existing_copy;
+        q->q = GMT_send_prebuilt_message (message, ch->t, ch,
+                                          fwd, NULL != existing_copy,
+                                          &ch_message_sent, q);
+        /* Don't store q itself: we never need to cancel messages */
+      }
+      else
+      {
+        GNUNET_break (NULL == GMT_send_prebuilt_message (message, ch->t, ch,
+                                                         fwd, GNUNET_NO,
+                                                         NULL, NULL));
+      }
+      break;
+
+    case GNUNET_MESSAGE_TYPE_MESH_DATA_ACK:
+      {
+        struct MeshChannelReliability *rel;
+
+        rel = fwd ? ch->root_rel : ch->dest_rel;
+        if (NULL != rel->ack_q)
+        {
+          GMT_cancel (rel->ack_q->q);
+          /* ch_message_sent is called, freeing ack_q */
+        }
+        rel->ack_q = GNUNET_new (struct MeshChannelQueue);
+        rel->ack_q->type = type;
+        rel->ack_q->rel = rel;
+        rel->ack_q->q = GMT_send_prebuilt_message (message, ch->t, ch,
+                                                  fwd, GNUNET_YES,
+                                                  &ch_message_sent, 
rel->ack_q);
+      }
+      break;
+    default:
+      GNUNET_break (NULL == GMT_send_prebuilt_message (message, ch->t, ch,
+                                                       fwd, GNUNET_YES,
+                                                       NULL, NULL));
   }
-  else
-    GNUNET_break (NULL == GMT_send_prebuilt_message (message, ch->t, ch, fwd,
-                                                     NULL, NULL));
 }
 
 

Modified: gnunet/src/mesh/gnunet-service-mesh_channel.h
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_channel.h       2013-11-28 19:43:21 UTC 
(rev 30958)
+++ gnunet/src/mesh/gnunet-service-mesh_channel.h       2013-11-29 02:35:20 UTC 
(rev 30959)
@@ -313,15 +313,17 @@
  * On a normal channel passes the message to the tunnel for encryption and
  * sending on a connection.
  *
+ * This function DOES NOT save the message for retransmission.
+ *
  * @param message Message to send. Function makes a copy of it.
  * @param ch Channel on which this message is transmitted.
  * @param fwd Is this a fwd message?
- * @param retransmission Is this a retransmission? (Don't save a copy)
+ * @param existing_copy This is a retransmission, don't save a copy.
  */
 void
 GMCH_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
                             struct MeshChannel *ch, int fwd,
-                            int retransmission);
+                            void *existing_copy);
 
 /**
  * Get the static string for identification of the channel.

Modified: gnunet/src/mesh/gnunet-service-mesh_connection.c
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_connection.c    2013-11-28 19:43:21 UTC 
(rev 30958)
+++ gnunet/src/mesh/gnunet-service-mesh_connection.c    2013-11-29 02:35:20 UTC 
(rev 30959)
@@ -499,7 +499,8 @@
   msg.ack = htonl (ack);
   msg.cid = c->id;
 
-  prev_fc->ack_msg = GMC_send_prebuilt_message (&msg.header, c, !fwd,
+  prev_fc->ack_msg = GMC_send_prebuilt_message (&msg.header, c,
+                                                !fwd, GNUNET_YES,
                                                 &ack_sent, prev_fc);
 }
 
@@ -738,7 +739,7 @@
   msg.cid = c->id;
   msg.peer1 = *id1;
   msg.peer2 = *id2;
-  GMC_send_prebuilt_message (&msg.header, c, fwd, NULL, NULL);
+  GMC_send_prebuilt_message (&msg.header, c, fwd, GNUNET_YES, NULL, NULL);
 }
 
 
@@ -765,7 +766,7 @@
   msg->cid = c->id;
   msg->reserved = htonl (0);
 
-  GMC_send_prebuilt_message (&msg->header, c, fwd, NULL, NULL);
+  GMC_send_prebuilt_message (&msg->header, c, fwd, GNUNET_YES, NULL, NULL);
 }
 
 
@@ -997,7 +998,8 @@
   msg.header.size = htons (sizeof (msg));
   msg.pid = htonl (fc->last_pid_sent);
   LOG (GNUNET_ERROR_TYPE_DEBUG, " *** last pid sent: %u!\n", 
fc->last_pid_sent);
-  fc->poll_msg = GMC_send_prebuilt_message (&msg.header, c, fc == &c->fwd_fc,
+  fc->poll_msg = GMC_send_prebuilt_message (&msg.header, c,
+                                            fc == &c->fwd_fc, GNUNET_YES,
                                             &poll_sent, fc);
 }
 
@@ -1298,7 +1300,7 @@
     LOG (GNUNET_ERROR_TYPE_DEBUG, "  Retransmitting.\n");
     GMP_add_path (dest_peer, path_duplicate (path), GNUNET_NO);
     GMP_add_path_to_origin (orig_peer, path_duplicate (path), GNUNET_NO);
-    GMC_send_prebuilt_message (message, c, GNUNET_YES, NULL, NULL);
+    GMC_send_prebuilt_message (message, c, GNUNET_YES, GNUNET_YES, NULL, NULL);
   }
   path_destroy (path);
   return GNUNET_OK;
@@ -1422,7 +1424,7 @@
   }
 
   LOG (GNUNET_ERROR_TYPE_DEBUG, "  not for us, retransmitting...\n");
-  GMC_send_prebuilt_message (message, c, fwd, NULL, NULL);
+  GMC_send_prebuilt_message (message, c, fwd, GNUNET_YES, NULL, NULL);
   return GNUNET_OK;
 }
 
@@ -1471,7 +1473,7 @@
   }
   else
   {
-    GMC_send_prebuilt_message (message, c, fwd, NULL, NULL);
+    GMC_send_prebuilt_message (message, c, fwd, GNUNET_YES, NULL, NULL);
     c->destroy = GNUNET_YES;
   }
 
@@ -1523,7 +1525,7 @@
     GNUNET_break_op (0);
     return GNUNET_OK;
   }
-  GMC_send_prebuilt_message (message, c, fwd, NULL, NULL);
+  GMC_send_prebuilt_message (message, c, fwd, GNUNET_YES, NULL, NULL);
   c->destroy = GNUNET_YES;
   c->state = MESH_CONNECTION_DESTROYED;
 
@@ -1655,7 +1657,7 @@
   }
 
   GNUNET_STATISTICS_update (stats, "# messages forwarded", 1, GNUNET_NO);
-  GMC_send_prebuilt_message (&msg->header, c, fwd, NULL, NULL);
+  GMC_send_prebuilt_message (&msg->header, c, fwd, GNUNET_NO, NULL, NULL);
 
   return GNUNET_OK;
 }
@@ -1752,7 +1754,7 @@
   /* Message not for us: forward to next hop */
   LOG (GNUNET_ERROR_TYPE_DEBUG, "  not for us, retransmitting...\n");
   GNUNET_STATISTICS_update (stats, "# messages forwarded", 1, GNUNET_NO);
-  GMC_send_prebuilt_message (&msg->header, c, fwd, NULL, NULL);
+  GMC_send_prebuilt_message (&msg->header, c, fwd, GNUNET_NO, NULL, NULL);
 
   return GNUNET_OK;
 }
@@ -2004,7 +2006,7 @@
     return GNUNET_OK;
 
   GNUNET_STATISTICS_update (stats, "# keepalives forwarded", 1, GNUNET_NO);
-  GMC_send_prebuilt_message (message, c, fwd, NULL, NULL);
+  GMC_send_prebuilt_message (message, c, fwd, GNUNET_YES, NULL, NULL);
 
   return GNUNET_OK;
 }
@@ -2491,6 +2493,7 @@
  *                If message is not hop-by-hop, decrements TTL of copy.
  * @param c Connection on which this message is transmitted.
  * @param fwd Is this a fwd message?
+ * @param force Force the connection to accept the message (buffer overfill).
  * @param cont Continuation called once message is sent. Can be NULL.
  * @param cont_cls Closure for @c cont.
  *
@@ -2500,7 +2503,7 @@
  */
 struct MeshConnectionQueue *
 GMC_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
-                           struct MeshConnection *c, int fwd,
+                           struct MeshConnection *c, int fwd, int force,
                            GMC_sent cont, void *cont_cls)
 {
   struct MeshFlowControl *fc;
@@ -2518,7 +2521,7 @@
               GM_m2s (type), size, GMC_2s (c));
 
   fc = fwd ? &c->fwd_fc : &c->bck_fc;
-  droppable = GNUNET_YES;
+  droppable = GNUNET_NO == force;
   switch (type)
   {
     struct GNUNET_MESH_Encrypted *emsg;
@@ -2710,9 +2713,11 @@
               GMC_2s (c));
 
   if (GNUNET_NO == GMC_is_terminal (c, GNUNET_YES))
-    GMC_send_prebuilt_message (&msg.header, c, GNUNET_YES, NULL, NULL);
+    GMC_send_prebuilt_message (&msg.header, c,
+                               GNUNET_YES, GNUNET_YES, NULL, NULL);
   if (GNUNET_NO == GMC_is_terminal (c, GNUNET_NO))
-    GMC_send_prebuilt_message (&msg.header, c, GNUNET_NO, NULL, NULL);
+    GMC_send_prebuilt_message (&msg.header, c,
+                               GNUNET_NO, GNUNET_YES, NULL, NULL);
   c->destroy = GNUNET_YES;
   c->state = MESH_CONNECTION_DESTROYED;
 }

Modified: gnunet/src/mesh/gnunet-service-mesh_connection.h
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_connection.h    2013-11-28 19:43:21 UTC 
(rev 30958)
+++ gnunet/src/mesh/gnunet-service-mesh_connection.h    2013-11-29 02:35:20 UTC 
(rev 30959)
@@ -452,6 +452,7 @@
  *                If message is not hop-by-hop, decrements TTL of copy.
  * @param c Connection on which this message is transmitted.
  * @param fwd Is this a fwd message?
+ * @param force Force the connection to accept the message (buffer overfill).
  * @param cont Continuation called once message is sent. Can be NULL.
  * @param cont_cls Closure for @c cont.
  *
@@ -461,7 +462,7 @@
  */
 struct MeshConnectionQueue *
 GMC_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
-                           struct MeshConnection *c, int fwd,
+                           struct MeshConnection *c, int fwd, int force,
                            GMC_sent cont, void *cont_cls);
 
 /**

Modified: gnunet/src/mesh/gnunet-service-mesh_peer.c
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_peer.c  2013-11-28 19:43:21 UTC (rev 
30958)
+++ gnunet/src/mesh/gnunet-service-mesh_peer.c  2013-11-29 02:35:20 UTC (rev 
30959)
@@ -969,6 +969,7 @@
  * @param size Size of the message.
  * @param c Connection this message belongs to (cannot be NULL).
  * @param fwd Is this a message going root->dest? (FWD ACK are NOT FWD!)
+ * @param force Force the tunnel to take the message (buffer overfill).
  * @param cont Continuation to be called once CORE has taken the message.
  * @param cont_cls Closure for @c cont.
  *

Modified: gnunet/src/mesh/gnunet-service-mesh_tunnel.c
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_tunnel.c        2013-11-28 19:43:21 UTC 
(rev 30958)
+++ gnunet/src/mesh/gnunet-service-mesh_tunnel.c        2013-11-29 02:35:20 UTC 
(rev 30959)
@@ -637,7 +637,7 @@
     GNUNET_CONTAINER_DLL_remove (t->tq_head, t->tq_tail, tq);
     GMCH_send_prebuilt_message ((struct GNUNET_MessageHeader *) &tq[1],
                                 tq->ch, GMCH_is_origin (tq->ch, GNUNET_YES),
-                                GNUNET_NO);
+                                NULL);
 
     GNUNET_free (tq);
   }
@@ -742,7 +742,7 @@
 
   fwd = GMC_is_origin (t->connection_head->c, GNUNET_YES);
   /* TODO save handle and cancel in case of a unneeded retransmission */
-  GMC_send_prebuilt_message (&msg->header, c, fwd, NULL, NULL);
+  GMC_send_prebuilt_message (&msg->header, c, fwd, GNUNET_YES, NULL, NULL);
 }
 
 
@@ -2151,6 +2151,7 @@
  * @param t Tunnel on which this message is transmitted.
  * @param ch Channel on which this message is transmitted.
  * @param fwd Is this a fwd message on @c ch?
+ * @param force Force the tunnel to take the message (buffer overfill).
  * @param cont Continuation to call once message is really sent.
  * @param cont_cls Closure for @c cont.
  *
@@ -2159,7 +2160,7 @@
 struct MeshTunnel3Queue *
 GMT_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
                            struct MeshTunnel3 *t,
-                           struct MeshChannel *ch, int fwd,
+                           struct MeshChannel *ch, int fwd, int force,
                            GMT_sent cont, void *cont_cls)
 {
   struct MeshTunnel3Queue *q;
@@ -2221,11 +2222,12 @@
 
   if (NULL == cont)
   {
-    (void) GMC_send_prebuilt_message (&msg->header, c, fwd, NULL, NULL);
+    (void) GMC_send_prebuilt_message (&msg->header, c, fwd, force, NULL, NULL);
     return NULL;
   }
   q = GNUNET_new (struct MeshTunnel3Queue); /* FIXME valgrind: leak*/
-  q->q = GMC_send_prebuilt_message (&msg->header, c, fwd, &message_sent, q);
+  q->q = GMC_send_prebuilt_message (&msg->header, c, fwd, force,
+                                    &message_sent, q);
   q->cont = cont;
   q->cont_cls = cont_cls;
 

Modified: gnunet/src/mesh/gnunet-service-mesh_tunnel.h
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_tunnel.h        2013-11-28 19:43:21 UTC 
(rev 30958)
+++ gnunet/src/mesh/gnunet-service-mesh_tunnel.h        2013-11-29 02:35:20 UTC 
(rev 30959)
@@ -394,16 +394,17 @@
  * @param t Tunnel on which this message is transmitted.
  * @param ch Channel on which this message is transmitted.
  * @param fwd Is this a fwd message on @c ch?
+ * @param force Force the tunnel to take the message (buffer overfill).
  * @param cont Continuation to call once message is really sent.
- * @param cls Closure for @c cont.
+ * @param cont_cls Closure for @c cont.
  *
  * @return Handle to cancel message. NULL if @c cont is NULL.
  */
 struct MeshTunnel3Queue *
 GMT_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
                            struct MeshTunnel3 *t,
-                           struct MeshChannel *ch, int fwd,
-                           GMT_sent cont, void *cls);
+                           struct MeshChannel *ch, int fwd, int force,
+                           GMT_sent cont, void *cont_cls);
 
 /**
  * Is the tunnel directed towards the local peer?




reply via email to

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