summaryrefslogtreecommitdiff
path: root/mac/ca/test/backoff/src/test_backoff.c
diff options
context:
space:
mode:
Diffstat (limited to 'mac/ca/test/backoff/src/test_backoff.c')
-rw-r--r--mac/ca/test/backoff/src/test_backoff.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/mac/ca/test/backoff/src/test_backoff.c b/mac/ca/test/backoff/src/test_backoff.c
new file mode 100644
index 0000000000..f95851c649
--- /dev/null
+++ b/mac/ca/test/backoff/src/test_backoff.c
@@ -0,0 +1,89 @@
+/* Maria project {{{
+ *
+ * Copyright (C) 2007 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file test_backoff.c
+ * \brief Test backoff code.
+ * \ingroup test
+ */
+#include "common/std.h"
+
+#include "mac/ca/inc/context.h"
+
+#include <stdio.h>
+
+int
+main (void)
+{
+ uint i;
+ uint cap = 0, slot_count = 0, bpcm;
+ lib_rnd_t rnd;
+ ca_t ca;
+ uint iter = 1000;
+ u32 success_ratio = LIB_RND_RATIO (0.5),
+ same_cap_ratio = LIB_RND_RATIO (0.6);
+ bool last_success = true;
+ uint last_cap = 0,
+ last_bpc = 0,
+ last_cw = 0,
+ last_bc = 0,
+ last_dc = 0;
+ const uint dc_table[4] = { 0, 1, 3, 15 };
+ const uint cw_table[4][4] = {
+ { 7, 15, 31, 63 },
+ { 7, 15, 31, 63 },
+ { 7, 15, 15, 31 },
+ { 7, 15, 15, 31 },
+ };
+ /* Initialise. */
+ ca_backoff_init (&ca);
+ lib_rnd_init (&rnd, 1234);
+ /* Use backoff. */
+ for (i = 0; i < iter; i++)
+ {
+ /* New frame. */
+ if (lib_rnd32 (&rnd) >= same_cap_ratio)
+ {
+ cap = lib_rnd32 (&rnd) % 4;
+ }
+ ca_backoff_new (&ca, cap);
+ /* Check backoff. Throw some general rules... */
+ printf ("cap = %d, bpc = %d, cw = %d, bc = %d, dc = %d\n",
+ cap, ca.backoff.bpc, ca.backoff.cw, ca.backoff.bc,
+ ca.backoff.dc);
+ bpcm = MIN (3u, ca.backoff.bpc);
+ dbg_assert (ca.backoff.cw == cw_table[cap][bpcm]);
+ dbg_assert (ca.backoff.bc <= ca.backoff.cw);
+ dbg_assert ((last_success && ca.backoff.bpc == 0) || !last_success);
+ dbg_assert (last_success
+ || (ca.backoff.bpc > last_bpc
+ && (last_bpc == 0 || last_bc - slot_count == 0
+ || last_dc == 0))
+ || (ca.backoff.bpc == last_bpc
+ && (last_bpc != 0 && last_bc - slot_count != 0
+ && last_dc != 0)));
+ dbg_assert (((last_success || ca.backoff.bpc > last_bpc)
+ && ca.backoff.dc == dc_table[bpcm])
+ || ca.backoff.dc < last_dc);
+
+ /* Defer or success? */
+ slot_count = lib_rnd_uniform (&rnd, ca.backoff.bc + 1);
+ ca_backoff_deferred (&ca, slot_count);
+ last_success = lib_rnd32 (&rnd) < success_ratio;
+ if (last_success)
+ {
+ ca_backoff_success (&ca);
+ }
+ /* Save last state. */
+ last_cap = cap;
+ last_bpc = ca.backoff.bpc;
+ last_cw = ca.backoff.cw;
+ last_bc = ca.backoff.bc;
+ last_dc = ca.backoff.dc;
+ }
+ return 0;
+}