[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 (©[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?
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r30959 - gnunet/src/mesh,
gnunet <=