/****************** GENERAL HELPER FUNCTIONS ************************/
/******************************************************************************/
-/**
- * Check if one pid is bigger than other, accounting for overflow.
- *
- * @param bigger Argument that should be bigger.
- * @param smaller Argument that should be smaller.
- *
- * @return True if bigger (arg1) has a higher value than smaller (arg 2).
- */
-static int
-is_pid_bigger (uint32_t bigger, uint32_t smaller)
-{
- return (GNUNET_YES == PID_OVERFLOW(smaller, bigger) ||
- (bigger > smaller && GNUNET_NO == PID_OVERFLOW(bigger, smaller)));
-}
-
-/**
- * Get the higher ACK value out of two values, taking in account overflow.
- *
- * @param a First ACK value.
- * @param b Second ACK value.
- *
- * @return Highest ACK value from the two.
- */
-static uint32_t
-max_pid (uint32_t a, uint32_t b)
-{
- if (is_pid_bigger(a, b))
- return a;
- return b;
-}
-
-
-/**
- * Get the lower ACK value out of two values, taking in account overflow.
- *
- * @param a First ACK value.
- * @param b Second ACK value.
- *
- * @return Lowest ACK value from the two.
- */
-static uint32_t
-min_pid (uint32_t a, uint32_t b)
-{
- if (is_pid_bigger(a, b))
- return b;
- return a;
-}
-
-
/**
* Decrements the reference counter and frees all resources if needed
*
type = ntohs (payload->type);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending to clients...\n");
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "message of type %u\n", type);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "message of type %s\n",
+ GNUNET_MESH_DEBUG_M2S (type));
memcpy (cbuf, msg, sizeof (cbuf));
switch (htons (msg->type))
/**
- * Notify a the client of a tunnel about how many more
+ * Notify a client of a tunnel about how many more
* payload packages will we accept on a given tunnel,
* distinguishing between root and leaf clients.
*
clinfo.fwd_ack = t->fwd_pid + 1;
clinfo.bck_ack = t->nobuffer ? 1 : INITIAL_WINDOW_SIZE;
clinfo.fwd_pid = t->fwd_pid;
+ clinfo.bck_pid = (uint32_t) -1; // Expected next: 0
t->nclients--;
GNUNET_array_append (t->clients_fc, t->nclients, clinfo);
}
if (0 == ctx.nchildren)
return -1LL;
- if (GNUNET_YES == t->nobuffer && is_pid_bigger(ctx.max_child_ack, t->fwd_pid))
+ if (GNUNET_YES == t->nobuffer && GMC_is_pid_bigger(ctx.max_child_ack, t->fwd_pid))
ctx.max_child_ack = t->fwd_pid + 1; // Might overflow, it's ok.
return (int64_t) ctx.max_child_ack;
{
if (-1 == ack ||
(GNUNET_YES == t->speed_min &&
- GNUNET_YES == is_pid_bigger (ack, t->clients_fc[i].fwd_ack)) ||
+ GNUNET_YES == GMC_is_pid_bigger (ack, t->clients_fc[i].fwd_ack)) ||
(GNUNET_NO == t->speed_min &&
- GNUNET_YES == is_pid_bigger (t->clients_fc[i].fwd_ack, ack)))
+ GNUNET_YES == GMC_is_pid_bigger (t->clients_fc[i].fwd_ack, ack)))
{
ack = t->clients_fc[i].fwd_ack;
}
}
- if (GNUNET_YES == t->nobuffer && is_pid_bigger(ack, t->fwd_pid))
+ if (GNUNET_YES == t->nobuffer && GMC_is_pid_bigger(ack, t->fwd_pid))
ack = (uint32_t) t->fwd_pid + 1; // Might overflow, it's ok.
return (uint32_t) ack;
if (-1 == child_ack)
{
// Node has no children, child_ack AND core buffer are irrelevant.
- GNUNET_break (-1 != client_ack); // No children AND no clients? Not good!
+ GNUNET_break (-1 != client_ack); // No children AND no clients? Not good! // FIXME fc
return (uint32_t) client_ack;
}
if (GNUNET_YES == t->speed_min)
{
- ack = min_pid ((uint32_t) child_ack, ack);
- ack = min_pid ((uint32_t) client_ack, ack);
+ ack = GMC_min_pid ((uint32_t) child_ack, ack);
+ ack = GMC_min_pid ((uint32_t) client_ack, ack);
}
else
{
- ack = max_pid ((uint32_t) child_ack, ack);
- ack = max_pid ((uint32_t) client_ack, ack);
+ ack = GMC_max_pid ((uint32_t) child_ack, ack);
+ ack = GMC_max_pid ((uint32_t) client_ack, ack);
}
- if (GNUNET_YES == t->nobuffer && is_pid_bigger(ack, t->fwd_pid))
+ if (GNUNET_YES == t->nobuffer && GMC_is_pid_bigger(ack, t->fwd_pid))
ack = t->fwd_pid + 1; // Might overflow 32 bits, it's ok!
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "c %u, bf %u, ch %u, cl %u, ACK: %u\n",
count, buffer_free, child_ack, client_ack, ack);
cinfo = tunnel_get_neighbor_fc (t, &peer);
if (cinfo->bck_ack != cinfo->pid &&
- GNUNET_NO == is_pid_bigger (cinfo->bck_ack, cinfo->pid))
+ GNUNET_NO == GMC_is_pid_bigger (cinfo->bck_ack, cinfo->pid))
return;
cinfo->bck_ack++;
ack = clinfo->bck_pid;
ack += t->nobuffer ? 1 : INITIAL_WINDOW_SIZE;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ " sending ack to client %u: %u\n",
+ t->clients[i]->id, ack);
send_local_ack(t->clients[i], t, ack);
clinfo->bck_ack = ack;
}
static void
tunnel_send_bck_ack (struct MeshTunnel *t, uint16_t type)
{
- if (NULL != t->owner)
- {
- send_client_tunnel_ack (t->owner, t);
- return;
- }
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Sending BCK ACK on tunnel %u [%u]\n",
+ t->id.oid, t->id.tid);
/* Is it after data to_origin retransmission? */
switch (type)
{
}
if (t->bck_queue_max > t->bck_queue_n * 2)
{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Not sending ACK, buffer free\n");
- return;
+// GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Not sending ACK, buffer free\n");
+// return;
}
break;
case GNUNET_MESSAGE_TYPE_MESH_ACK:
case GNUNET_MESSAGE_TYPE_MESH_LOCAL_ACK:
+ // FIXME fc
break;
default:
GNUNET_break (0);
mc = (struct GNUNET_MESH_Multicast *) mh;
mh = (struct GNUNET_MessageHeader *) &mc[1];
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- " multicast, payload type %u\n", ntohs (mh->type));
+ " multicast, payload type %s\n",
+ GNUNET_MESH_DEBUG_M2S (ntohs (mh->type)));
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
" multicast, payload size %u\n", ntohs (mh->size));
}
else
{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, " type %u\n",
- ntohs (mh->type));
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, " type %s\n",
+ GNUNET_MESH_DEBUG_M2S (ntohs (mh->type)));
}
}
#endif
return GNUNET_OK;
}
msg = (struct GNUNET_MESH_Unicast *) message;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, " of type %u\n",
- ntohs (msg[1].header.type));
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, " of type %s\n",
+ GNUNET_MESH_DEBUG_M2S (ntohs (msg[1].header.type)));
/* Check tunnel */
t = tunnel_get (&msg->oid, ntohl (msg->tid));
if (NULL == t)
}
t->skip += (pid - t->fwd_pid) - 1;
t->fwd_pid = pid;
- if (is_pid_bigger (pid, t->last_fwd_ack))
+ if (GMC_is_pid_bigger (pid, t->last_fwd_ack))
{
GNUNET_STATISTICS_update (stats, "# unsolicited unicast", 1, GNUNET_NO);
GNUNET_break_op (0);
GNUNET_CONTAINER_multihashmap_iterate (t->children_fc,
&tunnel_add_skip,
&neighbor);
- if (is_pid_bigger (pid, cinfo->fwd_ack))
+ if (GMC_is_pid_bigger (pid, cinfo->fwd_ack))
{
GNUNET_STATISTICS_update (stats, "# unsolicited unicast", 1, GNUNET_NO);
GNUNET_break_op (0);
return GNUNET_OK;
}
msg = (struct GNUNET_MESH_ToOrigin *) message;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, " of type %u\n",
- ntohs (msg[1].header.type));
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, " of type %s\n",
+ GNUNET_MESH_DEBUG_M2S (ntohs (msg[1].header.type)));
t = tunnel_get (&msg->oid, ntohl (msg->tid));
if (NULL == t)
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Got an ACK packet from %s!\n",
GNUNET_i2s (peer));
msg = (struct GNUNET_MESH_ACK *) message;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, " of type %u\n",
- ntohs (msg[1].header.type));
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, " of type %s\n",
+ GNUNET_MESH_DEBUG_M2S (ntohs (msg[1].header.type)));
t = tunnel_get (&msg->oid, ntohl (msg->tid));
if (NULL == t)
t = tunnel_get_by_local_id (c, tid);
if (NULL == t)
{
- GNUNET_break (0);
+ GNUNET_break (0); // FIXME fc
GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
return;
}
core_init (void *cls, struct GNUNET_CORE_Handle *server,
const struct GNUNET_PeerIdentity *identity)
{
+ static int i = 0;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Core init\n");
core_handle = server;
if (0 != memcmp (identity, &my_full_id, sizeof (my_full_id)) ||
NULL == server)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Wrong CORE service\n"));
- GNUNET_SCHEDULER_shutdown ();
+ GNUNET_SCHEDULER_shutdown (); // Try gracefully
+ if (10 < i++)
+ GNUNET_abort(); // Try harder
}
return;
}