const struct GNUNET_HashCode * key,
void *value)
{
- GNUNET_free (value);
+ struct MeshTunnelChildInfo *cinfo = value;
+ struct MeshTunnel *t = cls;
+ unsigned int c;
+ unsigned int i;
+
+ for (c = 0; c < cinfo->send_buffer_n; c++)
+ {
+ i = (cinfo->send_buffer_start + c) % t->fwd_queue_max;
+ if (NULL != cinfo->send_buffer[i])
+ queue_destroy(cinfo->send_buffer[i], GNUNET_YES);
+ else
+ GNUNET_break (0);
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO, "%u %u\n", c, cinfo->send_buffer_n);
+ }
+ GNUNET_free_non_null (cinfo->send_buffer);
+ GNUNET_free (cinfo);
return GNUNET_YES;
}
struct GNUNET_MessageHeader *msg;
struct MeshPeerQueue *queue;
struct MeshTunnel *t;
+ struct MeshTunnelChildInfo *cinfo;
+ struct GNUNET_PeerIdentity dst_id;
size_t data_size;
peer->core_transmit = NULL;
}
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "********* not empty\n");
+ GNUNET_PEER_resolve (peer->id, &dst_id);
/* Check if buffer size is enough for the message */
if (queue->size > size)
{
- struct GNUNET_PeerIdentity id;
+
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"********* not enough room, reissue\n");
- GNUNET_PEER_resolve (peer->id, &id);
peer->core_transmit =
GNUNET_CORE_notify_transmit_ready(core_handle,
0,
0,
GNUNET_TIME_UNIT_FOREVER_REL,
- &id,
+ &dst_id,
queue->size,
&queue_send,
peer);
queue->type);
data_size = 0;
}
+ switch (queue->type)
+ {
+ case GNUNET_MESSAGE_TYPE_MESH_UNICAST:
+ case GNUNET_MESSAGE_TYPE_MESH_TO_ORIGIN:
+ case GNUNET_MESSAGE_TYPE_MESH_MULTICAST:
+ cinfo = tunnel_get_neighbor_fc(t, &dst_id);
+ if (cinfo->send_buffer[cinfo->send_buffer_start] != queue)
+ {
+ GNUNET_break(0);
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "at pos %u (%p) != %p\n",
+ cinfo->send_buffer_start,
+ cinfo->send_buffer[cinfo->send_buffer_start],
+ queue);
+ }
+ GNUNET_break(cinfo->send_buffer_n > 0);
+ cinfo->send_buffer[cinfo->send_buffer_start] = NULL;
+ cinfo->send_buffer_n--;
+ cinfo->send_buffer_start++;
+ cinfo->send_buffer_start %= t->fwd_queue_max;
+ break;
+ default:
+ break;
+ }
/* Free queue, but cls was freed by send_core_* */
queue_destroy (queue, GNUNET_NO);
i = (cinfo->send_buffer_start + cinfo->send_buffer_n) % t->fwd_queue_max;
if (NULL != cinfo->send_buffer[i])
{
- queue_destroy(cinfo->send_buffer[i], GNUNET_YES);
- GNUNET_break (cinfo->send_buffer_n > 0);
+ GNUNET_break (cinfo->send_buffer_n == t->fwd_queue_max); // aka i == start
+ queue_destroy(cinfo->send_buffer[cinfo->send_buffer_start], GNUNET_YES);
+ cinfo->send_buffer_start++;
+ cinfo->send_buffer_start %= t->fwd_queue_max;
cinfo->send_buffer_n--;
}
cinfo->send_buffer[i] = queue;