summaryrefslogtreecommitdiff
path: root/cesar
diff options
context:
space:
mode:
authorschodet2010-03-24 10:21:38 +0000
committerschodet2010-03-24 10:21:38 +0000
commit794331641c9da1e04ec1089d4601ae165cf97ea9 (patch)
treee9fedf72565bde554ab45467a407a1ed50c889a1 /cesar
parentd724f4b79e60d42d35b459725d8322ad28856da7 (diff)
cesar/tools/sniffer_phy: add MPDU tests, refs #1256
git-svn-id: svn+ssh://pessac/svn/cesar/trunk@6846 017c9cb6-072f-447c-8318-d5b54f68fe89
Diffstat (limited to 'cesar')
-rw-r--r--cesar/tools/sniffer_phy/inc/lowlevel.h9
-rw-r--r--cesar/tools/sniffer_phy/inc/mme.h2
-rw-r--r--cesar/tools/sniffer_phy/src/test_mme.c203
3 files changed, 173 insertions, 41 deletions
diff --git a/cesar/tools/sniffer_phy/inc/lowlevel.h b/cesar/tools/sniffer_phy/inc/lowlevel.h
index 6584320b54..16e65ef27f 100644
--- a/cesar/tools/sniffer_phy/inc/lowlevel.h
+++ b/cesar/tools/sniffer_phy/inc/lowlevel.h
@@ -14,6 +14,7 @@
*/
#include "hal/phy/forward.h"
#include "mac/common/tonemask.h"
+#include "mac/common/pb.h"
#include "inc/forward.h"
@@ -33,6 +34,14 @@ struct lowlevel_rx_t
bool fc10_bad_crc;
/** FC AV CRC. */
bool fc_bad_crc;
+ /** PB size. */
+ phy_pb_size_t pb_size;
+ /** PB list head. */
+ pb_t *pb_head;
+ /** PB list tail. */
+ pb_t *pb_tail;
+ /** Number of PB. */
+ uint pb_nb;
};
typedef struct lowlevel_rx_t lowlevel_rx_t;
diff --git a/cesar/tools/sniffer_phy/inc/mme.h b/cesar/tools/sniffer_phy/inc/mme.h
index 3fbc6972c0..613e8bd734 100644
--- a/cesar/tools/sniffer_phy/inc/mme.h
+++ b/cesar/tools/sniffer_phy/inc/mme.h
@@ -22,6 +22,8 @@ struct mme_t
mac_t mac;
/** MAC address to send sniffed data to. */
mac_t mac_sniffer;
+ /** Take PB content. */
+ bool pb;
};
typedef struct mme_t mme_t;
diff --git a/cesar/tools/sniffer_phy/src/test_mme.c b/cesar/tools/sniffer_phy/src/test_mme.c
index 2e98d45ee1..914e08b452 100644
--- a/cesar/tools/sniffer_phy/src/test_mme.c
+++ b/cesar/tools/sniffer_phy/src/test_mme.c
@@ -23,15 +23,27 @@
#define TEST_MME_MAC_PEER 0x4523ffd71300ull /* 00:13:d7:ff:23:45 */
#define TEST_MME_MAC_OTHER 0x5634ffd71300ull /* 00:13:d7:ff:34:56 */
-/* Expected buffer to be sent to upper layers, reset on match. */
-static const u32 *send_expect_buffer;
+/* Excepted buffer and buffer length. */
+struct send_expect_t
+{
+ const u32 *buffer;
+ uint length;
+};
+typedef struct send_expect_t send_expect_t;
-/* Expected buffer length to be sent to upper layers. */
-static uint send_expect_length;
+/* Expected buffer to be sent to upper layers, reset on match. */
+static send_expect_t send_expect;
/* Set if an unexpected buffer is sent. */
static bool send_unexpected;
+/* Same as send_expect, but for more than one buffer, to be cleaned by the
+ * test after use. */
+static send_expect_t send_expect_array[32];
+
+/* Used with send_expect_array, incremented on match. */
+static uint send_expect_array_index = COUNT (send_expect_array);
+
u8 *
lhle_buffer_get (sniffer_phy_t *ctx)
{
@@ -45,16 +57,24 @@ lhle_send (sniffer_phy_t *ctx, u8 *buffer, uint length)
{
dbg_assert (ctx);
dbg_assert (!DEFS_BIG_ENDIAN);
- if (!send_expect_buffer
- || length != send_expect_length
- || memcmp (buffer, send_expect_buffer, length) != 0)
+ send_expect_t *sea = &send_expect_array[send_expect_array_index];
+ if (send_expect.buffer
+ && length == send_expect.length
+ && memcmp (buffer, send_expect.buffer, length) == 0)
{
- send_unexpected = true;
+ send_expect.buffer = NULL;
+ send_expect.length = 0;
+ }
+ else if (send_expect_array_index < COUNT (send_expect_array)
+ && sea->buffer
+ && length == sea->length
+ && memcmp (buffer, sea->buffer, length) == 0)
+ {
+ send_expect_array_index++;
}
else
{
- send_expect_buffer = NULL;
- send_expect_length = 0;
+ send_unexpected = true;
}
}
@@ -81,7 +101,7 @@ mme_unhandled_test_case (test_t t, sniffer_phy_t *ctx)
/* Drop non MME frames. */
test_begin (t, "drop frame")
{
- send_expect_buffer = NULL;
+ send_expect.buffer = NULL;
send_unexpected = false;
/* Ethertype 0x0806. */
static const u32 buffer[] = {
@@ -95,7 +115,7 @@ mme_unhandled_test_case (test_t t, sniffer_phy_t *ctx)
/* Drop unknown MME. */
test_begin (t, "drop mme")
{
- send_expect_buffer = NULL;
+ send_expect.buffer = NULL;
send_unexpected = false;
/* MMTYPE = 0x0030. */
static const u32 buffer[] = {
@@ -109,7 +129,7 @@ mme_unhandled_test_case (test_t t, sniffer_phy_t *ctx)
/* Drop unknown version MME. */
test_begin (t, "drop mmv")
{
- send_expect_buffer = NULL;
+ send_expect.buffer = NULL;
send_unexpected = false;
static const u32 buffer[] = {
0xffd71300, 0x13003412, 0x4523ffd7, 0x0002e188,
@@ -122,7 +142,7 @@ mme_unhandled_test_case (test_t t, sniffer_phy_t *ctx)
/* Drop fragmented MME. */
test_begin (t, "drop frag")
{
- send_expect_buffer = NULL;
+ send_expect.buffer = NULL;
send_unexpected = false;
static const u32 buffer[] = {
0xffd71300, 0x13003412, 0x4523ffd7, 0x0001e188,
@@ -135,7 +155,7 @@ mme_unhandled_test_case (test_t t, sniffer_phy_t *ctx)
/* Drop non Spidcom vendor specific MME. */
test_begin (t, "drop non spidcom vs")
{
- send_expect_buffer = NULL;
+ send_expect.buffer = NULL;
send_unexpected = false;
static const u32 buffer[] = {
0xffd71300, 0x13003412, 0x4523ffd7, 0x2c01e188,
@@ -148,7 +168,7 @@ mme_unhandled_test_case (test_t t, sniffer_phy_t *ctx)
/* Drop unknown DRV MME. */
test_begin (t, "drop unknown drv")
{
- send_expect_buffer = NULL;
+ send_expect.buffer = NULL;
send_unexpected = false;
static const u8 drv_mmtype_lsb[] = {
0x3c, 0x44, 0xf0
@@ -188,10 +208,11 @@ mme_unhandled_test_case (test_t t, sniffer_phy_t *ctx)
buffer[3] = (buffer[3] & 0xffffff) | (drv_mmtype_lsb[i] << 24);
buffer_rsp[3] = (buffer_rsp[3] & 0xffffff)
| ((drv_mmtype_lsb[i] + 1) << 24);
- send_expect_buffer = buffer_rsp;
- send_expect_length = length_rsp;
+ send_expect.buffer = buffer_rsp;
+ send_expect.length = length_rsp;
+ send_unexpected = false;
mme_handle (ctx, (u8 *) buffer, length);
- test_fail_unless (!send_expect_buffer);
+ test_fail_unless (!send_expect.buffer);
test_fail_if (send_unexpected);
}
} test_end;
@@ -215,11 +236,12 @@ mme_drv_test_case (test_t t, sniffer_phy_t *ctx)
0x000000b0
};
const uint length_rsp = 20;
- send_expect_buffer = buffer_rsp;
- send_expect_length = length_rsp;
+ send_expect.buffer = buffer_rsp;
+ send_expect.length = length_rsp;
+ send_unexpected = false;
ctx->mme.mac = 0;
mme_handle (ctx, (u8 *) buffer, length);
- test_fail_unless (!send_expect_buffer);
+ test_fail_unless (!send_expect.buffer);
test_fail_if (send_unexpected);
test_fail_unless (ctx->mme.mac == TEST_MME_MAC);
} test_end;
@@ -230,6 +252,7 @@ mme_drv_test_case (test_t t, sniffer_phy_t *ctx)
0xee0000b0, 0xeeeeeeee
};
const uint length = 24;
+ send_unexpected = false;
mme_handle (ctx, (u8 *) buffer, length);
test_fail_if (send_unexpected);
test_fail_unless (ctx->mme.mac == TEST_MME_MAC);
@@ -251,17 +274,21 @@ mme_drv_test_case (test_t t, sniffer_phy_t *ctx)
* \param rx_activate_state new reception state
* \param sniffer_before sniffer peer before the MME
* \param sniffer_after sniffer peer after the MME.
+ * \param pb_before PB sniffer state before the MME
+ * \param pb_after PB sniffer state after the MME.
*/
static void
mme_sniffer_test (test_t t, sniffer_phy_t *ctx, const char *test_name,
mac_t s_sa, u8 s_command,
u8 r_result, u8 r_status, mac_t r_da,
bool rx_activate, bool rx_activate_state,
- mac_t sniffer_before, mac_t sniffer_after)
+ mac_t sniffer_before, mac_t sniffer_after,
+ bool pb_before, bool pb_after)
{
test_begin (t, test_name)
{
ctx->mme.mac_sniffer = sniffer_before;
+ ctx->mme.pb = pb_before;
u32 buffer[] = {
TEST_MME_MAC & 0xffffffff,
TEST_MME_MAC >> 32 | (s_sa & 0xffff) << 16,
@@ -284,21 +311,23 @@ mme_sniffer_test (test_t t, sniffer_phy_t *ctx, const char *test_name,
const uint length_rsp = 30;
if (s_command != 0xff)
{
- send_expect_buffer = buffer_rsp;
- send_expect_length = length_rsp;
+ send_expect.buffer = buffer_rsp;
+ send_expect.length = length_rsp;
}
else
{
- send_expect_buffer = NULL;
- send_expect_length = 0;
+ send_expect.buffer = NULL;
+ send_expect.length = 0;
}
+ send_unexpected = false;
rx_activate_expect = rx_activate;
rx_activate_state_expect = rx_activate_state;
mme_handle (ctx, (u8 *) buffer, length);
- test_fail_unless (!send_expect_buffer);
+ test_fail_unless (!send_expect.buffer);
test_fail_if (send_unexpected);
test_fail_unless (!rx_activate_expect);
test_fail_unless (ctx->mme.mac_sniffer == sniffer_after);
+ test_fail_unless (ctx->mme.pb == pb_after);
} test_end;
}
@@ -312,37 +341,50 @@ mme_sniffer_test_case (test_t t, sniffer_phy_t *ctx)
TEST_MME_MAC_PEER, 0x20,
0x00, 0x20, TEST_MME_MAC_PEER,
true, true,
- 0, TEST_MME_MAC_PEER);
+ 0, TEST_MME_MAC_PEER,
+ false, false);
mme_sniffer_test (t, ctx, "req subscribe again ok",
TEST_MME_MAC_PEER, 0x20,
0x00, 0x20, TEST_MME_MAC_PEER,
false, false,
- TEST_MME_MAC_PEER, TEST_MME_MAC_PEER);
+ TEST_MME_MAC_PEER, TEST_MME_MAC_PEER,
+ false, false);
+ mme_sniffer_test (t, ctx, "req subscribe change ok",
+ TEST_MME_MAC_PEER, 0xa0,
+ 0x00, 0x20, TEST_MME_MAC_PEER,
+ false, false,
+ TEST_MME_MAC_PEER, TEST_MME_MAC_PEER,
+ false, true);
mme_sniffer_test (t, ctx, "req subscribe another nok",
TEST_MME_MAC_OTHER, 0x20,
0x01, 0x20, TEST_MME_MAC_PEER,
false, false,
- TEST_MME_MAC_PEER, TEST_MME_MAC_PEER);
+ TEST_MME_MAC_PEER, TEST_MME_MAC_PEER,
+ true, true);
mme_sniffer_test (t, ctx, "req unsubscribe another nok",
TEST_MME_MAC_OTHER, 0x00,
0x01, 0x20, TEST_MME_MAC_PEER,
false, false,
- TEST_MME_MAC_PEER, TEST_MME_MAC_PEER);
+ TEST_MME_MAC_PEER, TEST_MME_MAC_PEER,
+ true, true);
mme_sniffer_test (t, ctx, "req unsubscribe ok",
TEST_MME_MAC_PEER, 0x00,
0x00, 0x00, 0,
true, false,
- TEST_MME_MAC_PEER, 0);
+ TEST_MME_MAC_PEER, 0,
+ true, false);
mme_sniffer_test (t, ctx, "req bad command",
TEST_MME_MAC_PEER, 0x10,
0x01, 0x00, 0,
false, false,
- 0, 0);
+ 0, 0,
+ false, false);
mme_sniffer_test (t, ctx, "req bad mme",
TEST_MME_MAC_PEER, 0xff,
0x01, 0x00, 0,
false, false,
- 0, 0);
+ 0, 0,
+ false, false);
}
static void
@@ -353,6 +395,7 @@ mme_mpdu_test (test_t t, sniffer_phy_t *ctx, const char *test_name,
test_begin (t, test_name)
{
ctx->mme.mac_sniffer = activated ? TEST_MME_MAC_PEER : 0;
+ ctx->mme.pb = false;
lowlevel_rx_t rx = {
0x12345678, fc10_bad_crc ? 0xffffffff : 0x01234567,
{
@@ -361,7 +404,7 @@ mme_mpdu_test (test_t t, sniffer_phy_t *ctx, const char *test_name,
fc_bad_crc ? 0xffffffff : 0x99aabbcc,
fc_bad_crc ? 0xffffffff : 0xddeeff00
},
- fc10_bad_crc, fc_bad_crc
+ fc10_bad_crc, fc_bad_crc, false, NULL, INVALID_PTR, 0
};
u32 buffer[] = {
0xffd71300, 0x13004523, 0x3412ffd7, 0x2e01e188,
@@ -379,18 +422,85 @@ mme_mpdu_test (test_t t, sniffer_phy_t *ctx, const char *test_name,
const uint length = 52;
if (activated)
{
- send_expect_buffer = buffer;
- send_expect_length = length;
+ send_expect.buffer = buffer;
+ send_expect.length = length;
}
else
{
- send_expect_buffer = NULL;
- send_expect_length = 0;
+ send_expect.buffer = NULL;
+ send_expect.length = 0;
}
+ send_unexpected = false;
+ mme_report_mpdu (ctx, &rx);
+ test_fail_unless (!send_expect.buffer);
+ test_fail_if (send_unexpected);
+ } test_end;
+}
+
+static void
+mme_mpdu_pb_test (test_t t, sniffer_phy_t *ctx, const char *test_name,
+ uint pb_nb, u32 pb_bad_crc, bool pb136)
+{
+ dbg_assert (pb_nb <= COUNT (send_expect_array));
+ dbg_assert (!DEFS_BIG_ENDIAN);
+ blk_t *blk_first = NULL, *blk_last;
+ test_begin (t, test_name)
+ {
+ ctx->mme.mac_sniffer = TEST_MME_MAC_PEER;
+ ctx->mme.pb = true;
+ send_expect_array_index = 0;
+ u32 buffers[pb_nb][14 + 128];
+ uint pb;
+ blk_first = blk_alloc_desc_range (pb_nb, &blk_last);
+ pb_t *p = PB_FROM_BLK (blk_first);
+ lowlevel_rx_t rx = {
+ 0x12345678, 0x01234567, { 0x11223344, 0x55667788, 0x99aabbcc,
+ 0xddeeff00 }, false, false,
+ pb136 ? PHY_PB_SIZE_136 : PHY_PB_SIZE_520,
+ PB_FROM_BLK (blk_first), PB_FROM_BLK (blk_last), pb_nb
+ };
+ for (pb = 0; pb < pb_nb; pb++)
+ {
+ /* Prepare PB. */
+ p->phy_pb.pb_rx.header = 0x01234567 + pb;
+ p->phy_pb.pb_rx.pb_measurement.crc_error =
+ !!(pb_bad_crc & (1 << pb));
+ memset (p->phy_pb.pb_rx.blk.data, 1 + pb, 512);
+ p = p->next;
+ /* Prepare response. */
+ u32 buffer[] = {
+ 0xffd71300, 0x13004523, 0x3412ffd7, 0x2e01e188,
+ 0x000000a0, 0x0102d713,
+ (pb_bad_crc & (1 << pb) ? 0x0004 : 0)
+ | pb_nb << 16 | pb << 24,
+ rx.date, rx.fc10,
+ rx.fc[0], rx.fc[1], rx.fc[2], rx.fc[3]
+ };
+ uint length = 52;
+ dbg_assert (COUNT (buffer) == 13);
+ memcpy (buffers[pb], buffer, length);
+ if (!(pb_bad_crc & (1 << pb)))
+ {
+ buffers[pb][13] = 0x01234567 + pb;
+ memset (&buffers[pb][14], 1 + pb, 512);
+ length += 4 + (pb136 ? 128 : 512);
+ }
+ send_expect_array[send_expect_array_index].buffer = buffers[pb];
+ send_expect_array[send_expect_array_index].length = length;
+ send_expect_array_index++;
+ }
+ /* Test. */
+ send_expect_array_index = 0;
+ send_unexpected = false;
mme_report_mpdu (ctx, &rx);
- test_fail_unless (!send_expect_buffer);
+ test_fail_unless (send_expect_array_index == pb_nb,
+ "MPDU %d not received", send_expect_array_index);
test_fail_if (send_unexpected);
} test_end;
+ if (blk_first)
+ blk_release_desc_range (blk_first, blk_last);
+ memset (send_expect_array, 0, sizeof (send_expect_array));
+ send_expect_array_index = COUNT (send_expect_array);
}
/* Test sending MPDU MME. */
@@ -403,6 +513,16 @@ mme_mpdu_test_case (test_t t, sniffer_phy_t *ctx)
mme_mpdu_test (t, ctx, "fc 10 ko av ok", true, true, false);
mme_mpdu_test (t, ctx, "fc 10 ok av ko", true, false, true);
mme_mpdu_test (t, ctx, "fc 10 ko av ko", true, true, true);
+ mme_mpdu_pb_test (t, ctx, "pb 136", 1, 0, true);
+ mme_mpdu_pb_test (t, ctx, "pb 512", 1, 0, false);
+ mme_mpdu_pb_test (t, ctx, "pb 512 x2", 2, 0, false);
+ mme_mpdu_pb_test (t, ctx, "pb 512 x10", 10, 0, false);
+ mme_mpdu_pb_test (t, ctx, "pb 512 x32", 32, 0, false);
+ mme_mpdu_pb_test (t, ctx, "pb 136 ko", 1, 0x1, true);
+ mme_mpdu_pb_test (t, ctx, "pb 512 ko", 1, 0x1, false);
+ mme_mpdu_pb_test (t, ctx, "pb 512 x2 ko", 2, 0x3, false);
+ mme_mpdu_pb_test (t, ctx, "pb 512 x10 ko mix", 10, 0x2a5, false);
+ mme_mpdu_pb_test (t, ctx, "pb 512 x32 ko mix", 32, 0xa55a137f, false);
}
void
@@ -413,6 +533,7 @@ mme_test_suite (test_t t)
mme_init (&ctx);
ctx.mme.mac = TEST_MME_MAC;
ctx.mme.mac_sniffer = TEST_MME_MAC_PEER;
+ ctx.mme.pb = false;
mme_unhandled_test_case (t, &ctx);
mme_drv_test_case (t, &ctx);
mme_sniffer_test_case (t, &ctx);