#include "platform.h"
#include "gnunet_fragmentation_lib.h"
-#define VERBOSE GNUNET_NO
-
#define DETAILS GNUNET_NO
/**
* Number of messages to transmit (note: each uses ~32k memory!)
*/
-#define NUM_MSGS 5000
+#define NUM_MSGS 500
/**
* MTU to force on fragmentation (must be > 1k + 12)
/**
* Simulate dropping of 1 out of how many messages? (must be > 1)
*/
-#define DROPRATE 10
+#define DROPRATE 5
static int ret = 1;
static struct GNUNET_FRAGMENT_Context *frags[NUM_MSGS];
+static GNUNET_SCHEDULER_TaskIdentifier shutdown_task;
+
+static void
+do_shutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ unsigned int i;
+
+ ret = 0;
+ shutdown_task = GNUNET_SCHEDULER_NO_TASK;
+ GNUNET_DEFRAGMENT_context_destroy (defrag);
+ defrag = NULL;
+ for (i = 0; i < NUM_MSGS; i++)
+ {
+ if (frags[i] == NULL)
+ continue;
+ GNUNET_FRAGMENT_context_destroy (frags[i], NULL, NULL);
+ frags[i] = NULL;
+ }
+}
+
+
static void
proc_msgs (void *cls, const struct GNUNET_MessageHeader *hdr)
{
const char *buf;
#if DETAILS
- fprintf (stderr, "!"); /* message complete, good! */
+ FPRINTF (stderr, "%s", "!"); /* message complete, good! */
#endif
buf = (const char *) hdr;
for (i = sizeof (struct GNUNET_MessageHeader); i < ntohs (hdr->size); i++)
total++;
#if ! DETAILS
if (0 == (total % (NUM_MSGS / 100)))
- fprintf (stderr, ".");
+ FPRINTF (stderr, "%s", ".");
#endif
/* tolerate 10% loss, i.e. due to duplicate fragment IDs */
- if (total >= NUM_MSGS - (NUM_MSGS / 10))
+ if ((total >= NUM_MSGS - (NUM_MSGS / 10)) && (ret != 0))
{
- ret = 0;
- GNUNET_DEFRAGMENT_context_destroy (defrag);
- defrag = NULL;
- for (i = 0; i < NUM_MSGS; i++)
- {
- if (frags[i] == NULL)
- continue;
- GNUNET_FRAGMENT_context_destroy (frags[i]);
- frags[i] = NULL;
- }
+ if (GNUNET_SCHEDULER_NO_TASK == shutdown_task)
+ shutdown_task = GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
}
}
if (ret == GNUNET_OK)
{
#if DETAILS
- fprintf (stderr, "@"); /* good ACK */
+ FPRINTF (stderr, "%s", "@"); /* good ACK */
#endif
- GNUNET_FRAGMENT_context_destroy (frags[i]);
+ GNUNET_FRAGMENT_context_destroy (frags[i], NULL, NULL);
frags[i] = NULL;
acks++;
return;
if (ret == GNUNET_NO)
{
#if DETAILS
- fprintf (stderr, "@"); /* good ACK */
+ FPRINTF (stderr, "%s", "@"); /* good ACK */
#endif
acks++;
return;
}
}
#if DETAILS
- fprintf (stderr, "_"); /* BAD: ack that nobody feels responsible for... */
+ FPRINTF (stderr, "%s", "_"); /* BAD: ack that nobody feels responsible for... */
#endif
}
}
if (NULL == defrag)
{
- fprintf (stderr, "E"); /* Error: frag after shutdown!? */
+ FPRINTF (stderr, "%s", "E"); /* Error: frag after shutdown!? */
return;
}
ret = GNUNET_DEFRAGMENT_process_fragment (defrag, hdr);
if (ret == GNUNET_NO)
{
#if DETAILS
- fprintf (stderr, "?"); /* duplicate fragment */
+ FPRINTF (stderr, "%s", "?"); /* duplicate fragment */
#endif
dups++;
}
else if (ret == GNUNET_OK)
{
#if DETAILS
- fprintf (stderr, "."); /* good fragment */
+ FPRINTF (stderr, "%s", "."); /* good fragment */
#endif
fragc++;
}
* Main function run with scheduler.
*/
static void
-run (void *cls,
- char *const *args,
- const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
+run (void *cls, char *const *args, const char *cfgfile,
+ const struct GNUNET_CONFIGURATION_Handle *cfg)
{
unsigned int i;
struct GNUNET_MessageHeader *msg;
msg->size =
htons (sizeof (struct GNUNET_MessageHeader) + (17 * i) % (32 * 1024));
frags[i] = GNUNET_FRAGMENT_context_create (NULL /* no stats */ ,
- MTU,
- &trackers[i],
+ MTU, &trackers[i],
+ GNUNET_TIME_UNIT_MILLISECONDS,
GNUNET_TIME_UNIT_SECONDS,
- msg, &proc_frac, &frags[i]);
+ msg,
+ &proc_frac, &frags[i]);
}
}
"-c",
"test_fragmentation_data.conf",
"-L",
-#if VERBOSE
- "DEBUG",
-#else
"WARNING",
-#endif
NULL
};
unsigned int i;
GNUNET_log_setup ("test-fragmentation",
-#if VERBOSE
- "DEBUG",
-#else
"WARNING",
-#endif
NULL);
for (i = 0; i < NUM_MSGS; i++)
- GNUNET_BANDWIDTH_tracker_init (&trackers[i],
+ GNUNET_BANDWIDTH_tracker_init (&trackers[i], NULL, NULL,
GNUNET_BANDWIDTH_value_init ((i + 1) * 1024),
100);
GNUNET_PROGRAM_run (5, argv_prog, "test-fragmentation", "nohelp", options,
&run, NULL);
- fprintf (stderr,
+ FPRINTF (stderr,
"\nHad %u good fragments, %u duplicate fragments, %u acks and %u simulated drops of acks\n",
fragc, dups, acks, ack_drops);
return ret;