X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fmesh%2Fmesh_api.c;h=6bdc2569508af09c37876b2aabb46e988428d5cf;hb=5d74fb965c6d619c323789da837e05a4b9c5def4;hp=b9ac8f94d17aeff378275408dd623d5f1fe7cc11;hpb=e31ea3478707575739f5f69ffb8ee329597914f4;p=oweals%2Fgnunet.git diff --git a/src/mesh/mesh_api.c b/src/mesh/mesh_api.c index b9ac8f94d..6bdc25695 100644 --- a/src/mesh/mesh_api.c +++ b/src/mesh/mesh_api.c @@ -21,7 +21,6 @@ * @author Bartlomiej Polot * * STRUCTURE: - * - CONSTANTS * - DATA STRUCTURES * - DECLARATIONS * - AUXILIARY FUNCTIONS @@ -43,15 +42,6 @@ #define LOG(kind,...) GNUNET_log_from (kind, "mesh-api",__VA_ARGS__) -/******************************************************************************/ -/************************ CONSTANTS ****************************/ -/******************************************************************************/ - -#define HIGH_PID 0xFFFF0000 -#define LOW_PID 0x0000FFFF - -#define PID_OVERFLOW(pid, max) (pid > HIGH_PID && max < LOW_PID) - /******************************************************************************/ /************************ DATA STRUCTURES ****************************/ /******************************************************************************/ @@ -453,6 +443,7 @@ create_tunnel (struct GNUNET_MESH_Handle *h, MESH_TunnelNumber tid) { t->tid = tid; } + t->max_pid = 1; return t; } @@ -682,6 +673,28 @@ send_packet (struct GNUNET_MESH_Handle *h, struct GNUNET_MESH_Tunnel *tunnel); +/** + * Send an ack on the tunnel to confirm the processing of a message. + * + * @param h Mesh handle. + * @param t Tunnel on which to send the ACK. + */ +static void +send_ack (struct GNUNET_MESH_Handle *h, struct GNUNET_MESH_Tunnel *t) +{ + struct GNUNET_MESH_LocalAck msg; + + 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->pid + 1; + + send_packet (h, &msg.header, t); + return; +} + + + /** * Reconnect callback: tries to reconnect again after a failer previous * reconnecttion @@ -755,8 +768,9 @@ do_reconnect (struct GNUNET_MESH_Handle *h) LOG (GNUNET_ERROR_TYPE_DEBUG, "*****************************\n"); LOG (GNUNET_ERROR_TYPE_DEBUG, "******* RECONNECT *******\n"); LOG (GNUNET_ERROR_TYPE_DEBUG, "*****************************\n"); + LOG (GNUNET_ERROR_TYPE_DEBUG, "******** on %p *******\n", h); + LOG (GNUNET_ERROR_TYPE_DEBUG, "*****************************\n"); - h->in_receive = GNUNET_NO; /* disconnect */ if (NULL != h->th) { @@ -869,6 +883,7 @@ static void reconnect (struct GNUNET_MESH_Handle *h) { LOG (GNUNET_ERROR_TYPE_DEBUG, "Requested RECONNECT\n"); + h->in_receive = GNUNET_NO; if (GNUNET_SCHEDULER_NO_TASK == h->reconnect_task) h->reconnect_task = GNUNET_SCHEDULER_add_delayed (h->reconnect_time, &reconnect_cbk, h); @@ -1103,6 +1118,7 @@ process_incoming_data (struct GNUNET_MESH_Handle *h, { LOG (GNUNET_ERROR_TYPE_DEBUG, "callback completed successfully\n"); + send_ack (h, t); } } } @@ -1171,8 +1187,8 @@ msg_received (void *cls, const struct GNUNET_MessageHeader *msg) reconnect (h); return; } - LOG (GNUNET_ERROR_TYPE_DEBUG, "received a message type %hu from MESH\n", - ntohs (msg->type)); + LOG (GNUNET_ERROR_TYPE_DEBUG, "received a message type %s from MESH\n", + GNUNET_MESH_DEBUG_M2S (ntohs (msg->type))); switch (ntohs (msg->type)) { /* Notify of a new incoming tunnel */ @@ -1201,12 +1217,20 @@ msg_received (void *cls, const struct GNUNET_MessageHeader *msg) default: /* We shouldn't get any other packages, log and ignore */ LOG (GNUNET_ERROR_TYPE_WARNING, - "unsolicited message form service (type %d)\n", + "unsolicited message form service (type %hu)\n", ntohs (msg->type)); } LOG (GNUNET_ERROR_TYPE_DEBUG, "message processed\n"); - GNUNET_CLIENT_receive (h->client, &msg_received, h, - GNUNET_TIME_UNIT_FOREVER_REL); + if (GNUNET_YES == h->in_receive) + { + GNUNET_CLIENT_receive (h->client, &msg_received, h, + GNUNET_TIME_UNIT_FOREVER_REL); + } + else + { + LOG (GNUNET_ERROR_TYPE_DEBUG, + "in receive off, not calling CLIENT_receive\n"); + } } @@ -1251,7 +1275,8 @@ send_callback (void *cls, size_t size, void *buf) if (GNUNET_YES == th_is_payload (th)) { LOG (GNUNET_ERROR_TYPE_DEBUG, " payload\n"); - if (t->max_pid < t->pid && ! PID_OVERFLOW (t->pid, t->max_pid)) { + if (t->max_pid < t->pid && GNUNET_NO == PID_OVERFLOW (t->pid, t->max_pid)) + { /* This tunnel is not ready to transmit yet, try next message */ next = th->next; continue; @@ -1266,8 +1291,8 @@ send_callback (void *cls, size_t size, void *buf) GNUNET_assert (size >= th->size); mh = (struct GNUNET_MessageHeader *) &cbuf[sizeof (to)]; psize = th->notify (th->notify_cls, size - sizeof (to), mh); - LOG (GNUNET_ERROR_TYPE_DEBUG, " to origin, type %u\n", - ntohs (mh->type)); + LOG (GNUNET_ERROR_TYPE_DEBUG, " to origin, type %s\n", + GNUNET_MESH_DEBUG_M2S (ntohs (mh->type))); if (psize > 0) { psize += sizeof (to); @@ -1290,8 +1315,8 @@ send_callback (void *cls, size_t size, void *buf) GNUNET_assert (size >= th->size); mh = (struct GNUNET_MessageHeader *) &cbuf[sizeof (mc)]; psize = th->notify (th->notify_cls, size - sizeof (mc), mh); - LOG (GNUNET_ERROR_TYPE_DEBUG, " multicast, type %u\n", - ntohs (mh->type)); + LOG (GNUNET_ERROR_TYPE_DEBUG, " multicast, type %s\n", + GNUNET_MESH_DEBUG_M2S (ntohs (mh->type))); if (psize > 0) { psize += sizeof (mc); @@ -1314,8 +1339,8 @@ send_callback (void *cls, size_t size, void *buf) GNUNET_assert (size >= th->size); mh = (struct GNUNET_MessageHeader *) &cbuf[sizeof (uc)]; psize = th->notify (th->notify_cls, size - sizeof (uc), mh); - LOG (GNUNET_ERROR_TYPE_DEBUG, " unicast, type %u\n", - ntohs (mh->type)); + LOG (GNUNET_ERROR_TYPE_DEBUG, " unicast, type %s\n", + GNUNET_MESH_DEBUG_M2S (ntohs (mh->type))); if (psize > 0) { psize += sizeof (uc); @@ -1335,8 +1360,8 @@ send_callback (void *cls, size_t size, void *buf) { struct GNUNET_MessageHeader *mh = (struct GNUNET_MessageHeader *) &th[1]; - LOG (GNUNET_ERROR_TYPE_DEBUG, " mesh traffic, type %u\n", - ntohs (mh->type)); + LOG (GNUNET_ERROR_TYPE_DEBUG, " mesh traffic, type %s\n", + GNUNET_MESH_DEBUG_M2S (ntohs (mh->type))); memcpy (cbuf, &th[1], th->size); psize = th->size; } @@ -1973,6 +1998,9 @@ GNUNET_MESH_notify_transmit_ready (struct GNUNET_MESH_Tunnel *tunnel, int cork, add_to_queue (tunnel->mesh, th); if (NULL != tunnel->mesh->th) return th; + if (GNUNET_NO == PID_OVERFLOW(tunnel->pid, tunnel->max_pid) && + tunnel->max_pid <= tunnel->pid) + return th; LOG (GNUNET_ERROR_TYPE_DEBUG, " call notify tmt rdy\n"); tunnel->mesh->th = GNUNET_CLIENT_notify_transmit_ready (tunnel->mesh->client, th->size, @@ -1993,6 +2021,7 @@ GNUNET_MESH_notify_transmit_ready_cancel (struct GNUNET_MESH_TransmitHandle *th) { struct GNUNET_MESH_Handle *mesh; + th->tunnel->packet_size = 0; mesh = th->tunnel->mesh; if (th->timeout_task != GNUNET_SCHEDULER_NO_TASK) GNUNET_SCHEDULER_cancel (th->timeout_task);