for (th = h->th_head; NULL != th; th = th->next)
{
t = th->tunnel;
- if (GNUNET_NO == th_is_payload (th) ||
- GNUNET_NO == GMC_is_pid_bigger(t->next_send_pid, t->max_send_pid))
+ if (GNUNET_NO == th_is_payload (th))
+ {
+ LOG (GNUNET_ERROR_TYPE_DEBUG, " message internal\n");
return th->size;
+ }
+ if (GNUNET_NO == GMC_is_pid_bigger(t->next_send_pid, t->max_send_pid))
+ {
+ LOG (GNUNET_ERROR_TYPE_DEBUG, " message payload ok (%u <= %u)\n",
+ t->next_send_pid, t->max_send_pid);
+ return th->size;
+ }
}
return 0;
}
{
t->tid = tid;
}
- t->max_send_pid = 1;
+ t->max_send_pid = INITIAL_WINDOW_SIZE - 1;
+ t->last_recv_pid = (uint32_t) -1;
return t;
}
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Sending ACK on tunnel %X: %u\n",
- t->tid, t->last_recv_pid + 1);
+ t->tid, t->last_recv_pid + INITIAL_WINDOW_SIZE);
msg.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_LOCAL_ACK);
msg.header.size = htons (sizeof (msg));
msg.tunnel_id = htonl (t->tid);
- msg.max_pid = t->last_recv_pid + 1;
+ msg.max_pid = htonl (t->last_recv_pid + INITIAL_WINDOW_SIZE);
send_packet (h, &msg.header, t);
return;
for (napps = 0; napps < h->n_applications; napps++)
{
apps[napps] = htonl (h->applications[napps]);
- LOG (GNUNET_ERROR_TYPE_DEBUG, " app %u\n", h->applications[napps]);
+ LOG (GNUNET_ERROR_TYPE_DEBUG, " app %u\n",
+ h->applications[napps]);
}
types = (uint16_t *) & apps[napps];
for (ntypes = 0; ntypes < h->n_handlers; ntypes++)
+ {
types[ntypes] = htons (h->message_handlers[ntypes].type);
+ LOG (GNUNET_ERROR_TYPE_DEBUG, " type %u\n",
+ h->message_handlers[ntypes].type);
+ }
msg->applications = htons (napps);
msg->types = htons (ntypes);
LOG (GNUNET_ERROR_TYPE_DEBUG,
*/
continue;
}
+ t->next_send_pid = 0;
+ t->max_send_pid = INITIAL_WINDOW_SIZE - 1;
+ t->last_recv_pid = (uint32_t) -1;
tmsg.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_LOCAL_TUNNEL_CREATE);
tmsg.header.size = htons (sizeof (struct GNUNET_MESH_TunnelMessage));
tmsg.tunnel_id = htonl (t->tid);
LOG (GNUNET_ERROR_TYPE_DEBUG, " ignored!\n");
return GNUNET_YES;
}
- if (GMC_is_pid_bigger(pid, t->last_recv_pid + 1))
+ if (GNUNET_YES ==
+ GMC_is_pid_bigger(pid, t->last_recv_pid + INITIAL_WINDOW_SIZE))
{
GNUNET_break (0);
LOG (GNUNET_ERROR_TYPE_WARNING, " unauthorized message!\n");
}
ack = ntohl (msg->max_pid);
LOG (GNUNET_ERROR_TYPE_DEBUG, " on tunnel %X, ack %u!\n", t->tid, ack);
- if (ack > t->max_send_pid || PID_OVERFLOW (t->max_send_pid, ack))
+ if (GNUNET_YES == GMC_is_pid_bigger(ack, t->max_send_pid))
t->max_send_pid = ack;
else
return;
char *cbuf = buf;
size_t tsize;
size_t psize;
+ size_t nsize;
LOG (GNUNET_ERROR_TYPE_DEBUG, "\n");
LOG (GNUNET_ERROR_TYPE_DEBUG, "Send packet() Buffer %u\n", size);
}
tsize = 0;
next = h->th_head;
- while ((NULL != (th = next)) && (size >= th->size))
+ nsize = message_ready_size (h);
+ while ((NULL != (th = next)) && (0 < nsize) && (size >= nsize))
{
t = th->tunnel;
if (GNUNET_YES == th_is_payload (th))
{
LOG (GNUNET_ERROR_TYPE_DEBUG, " payload\n");
- if (t->max_send_pid < t->next_send_pid && GNUNET_NO == PID_OVERFLOW (t->next_send_pid, t->max_send_pid))
+ if (GNUNET_YES == GMC_is_pid_bigger(t->next_send_pid, t->max_send_pid))
{
/* This tunnel is not ready to transmit yet, try next message */
next = th->next;
struct GNUNET_MessageHeader *mh = (struct GNUNET_MessageHeader *) &th[1];
LOG (GNUNET_ERROR_TYPE_DEBUG, " mesh traffic, type %s\n",
- GNUNET_MESH_DEBUG_M2S (ntohs (mh->type)));
+ GNUNET_MESH_DEBUG_M2S (ntohs (mh->type)));
memcpy (cbuf, &th[1], th->size);
psize = th->size;
}
GNUNET_CONTAINER_DLL_remove (h->th_head, h->th_tail, th);
GNUNET_free (th);
next = h->th_head;
+ nsize = message_ready_size (h);
cbuf += psize;
size -= psize;
tsize += psize;
}
else
{
- LOG (GNUNET_ERROR_TYPE_DEBUG, " nothing left to transmit\n");
+ if (NULL != h->th_head)
+ LOG (GNUNET_ERROR_TYPE_DEBUG, " can't transmit any more\n");
+ else
+ LOG (GNUNET_ERROR_TYPE_DEBUG, " nothing left to transmit\n");
}
if (GNUNET_NO == h->in_receive)
{
struct GNUNET_MESH_TransmitHandle *th;
size_t msize;
+ LOG (GNUNET_ERROR_TYPE_DEBUG, " Sending message to service: %s\n",
+ GNUNET_MESH_DEBUG_M2S(ntohs(msg->type)));
msize = ntohs (msg->size);
th = GNUNET_malloc (sizeof (struct GNUNET_MESH_TransmitHandle) + msize);
th->timeout = GNUNET_TIME_UNIT_FOREVER_ABS;
th->tunnel = tunnel;
memcpy (&th[1], msg, msize);
add_to_queue (h, th);
+ LOG (GNUNET_ERROR_TYPE_DEBUG, " queued\n");
if (NULL != h->th)
return;
+ LOG (GNUNET_ERROR_TYPE_DEBUG, " calling ntfy tmt rdy for %u bytes\n", msize);
h->th =
GNUNET_CLIENT_notify_transmit_ready (h->client, msize,
GNUNET_TIME_UNIT_FOREVER_REL,
add_to_queue (tunnel->mesh, th);
if (NULL != tunnel->mesh->th)
return th;
- if (GNUNET_NO == PID_OVERFLOW(tunnel->next_send_pid, tunnel->max_send_pid) &&
- tunnel->max_send_pid <= tunnel->next_send_pid)
+ if (GMC_is_pid_bigger(tunnel->next_send_pid, tunnel->max_send_pid))
return th;
LOG (GNUNET_ERROR_TYPE_DEBUG, " call notify tmt rdy\n");
tunnel->mesh->th =