summaryrefslogtreecommitdiff
path: root/cesar
diff options
context:
space:
mode:
authorschodet2010-03-24 10:21:41 +0000
committerschodet2010-03-24 10:21:41 +0000
commitf445e774f8ce2da10deac23f1253d2060bfbe946 (patch)
tree51df4244f4d8832eabecd6416afd69f756641a98 /cesar
parent794331641c9da1e04ec1089d4601ae165cf97ea9 (diff)
cesar/tools/sniffer_phy: add MPDU MME support, refs #1256
git-svn-id: svn+ssh://pessac/svn/cesar/trunk@6847 017c9cb6-072f-447c-8318-d5b54f68fe89
Diffstat (limited to 'cesar')
-rw-r--r--cesar/tools/sniffer_phy/src/mme.c65
1 files changed, 46 insertions, 19 deletions
diff --git a/cesar/tools/sniffer_phy/src/mme.c b/cesar/tools/sniffer_phy/src/mme.c
index 09745d5e32..31b6d0f61c 100644
--- a/cesar/tools/sniffer_phy/src/mme.c
+++ b/cesar/tools/sniffer_phy/src/mme.c
@@ -28,9 +28,11 @@
/** Sniffer mode: frame control RX. */
#define MME_SNIFFER_MODE_RX_FC 0x20
+/** Sniffer mode: MPDU RX. */
+#define MME_SNIFFER_MODE_RX_PB 0x80
/** All supported sniffer mode. */
#define MME_SNIFFER_MODE_SUPPORTED \
- (MME_SNIFFER_MODE_RX_FC)
+ (MME_SNIFFER_MODE_RX_FC | MME_SNIFFER_MODE_RX_PB)
/** Sniffer report type: MPDU. */
#define MME_VS_SNIFFER_IND_TYPE_MPDU 2
@@ -210,6 +212,7 @@ mme_handle_vs_sniffer_req (sniffer_phy_t *ctx, mme_buffer_t *mme)
if (was_activated != is_activated)
lowlevel_activate (ctx, is_activated);
ctx->mme.mac_sniffer = is_activated ? mme->sa : 0;
+ ctx->mme.pb = (command & MME_SNIFFER_MODE_RX_PB) != 0;
} while (0);
/* Send feedback. */
mme_send_vs_sniffer_cnf (ctx, mme, result);
@@ -312,25 +315,49 @@ mme_report_mpdu (sniffer_phy_t *ctx, lowlevel_rx_t *rx)
/* Only if sniffer is activated. */
if (!ctx->mme.mac_sniffer)
return;
- /* Prepare header. */
- mme_buffer_t ind;
- if (mme_send_prepare (ctx, &ind, ctx->mme.mac_sniffer,
- VS_SNIFFER + CP_MME_IND))
+ uint i;
+ uint mme_nb = rx->pb_nb && ctx->mme.pb ? rx->pb_nb : 1;
+ phy_pb_rx_t *pb = rx->pb_nb && ctx->mme.pb
+ ? &rx->pb_head->phy_pb.pb_rx : NULL;
+ for (i = 0; i < mme_nb; i++)
{
- /* Write MME. */
- bitstream_write (&ind.bitstream, MME_VS_SNIFFER_IND_TYPE_MPDU, 8);
- bitstream_write (&ind.bitstream, MME_VS_SNIFFER_IND_DIRECTION_RX, 8);
- bitstream_write (&ind.bitstream, rx->fc10_bad_crc, 1);
- bitstream_write (&ind.bitstream, rx->fc_bad_crc, 1);
- bitstream_write (&ind.bitstream, 0, 30);
- bitstream_write (&ind.bitstream, rx->date, 32);
- bitstream_write (&ind.bitstream, rx->fc10, 32);
- bitstream_write (&ind.bitstream, rx->fc[0], 32);
- bitstream_write (&ind.bitstream, rx->fc[1], 32);
- bitstream_write (&ind.bitstream, rx->fc[2], 32);
- bitstream_write (&ind.bitstream, rx->fc[3], 32);
- /* Send MME. */
- mme_send (ctx, &ind);
+ /* Prepare header. */
+ mme_buffer_t ind;
+ bitstream_t *bs = &ind.bitstream;
+ if (mme_send_prepare (ctx, &ind, ctx->mme.mac_sniffer,
+ VS_SNIFFER + CP_MME_IND))
+ {
+ /* Write MME. */
+ bitstream_write (bs, MME_VS_SNIFFER_IND_TYPE_MPDU, 8);
+ bitstream_write (bs, MME_VS_SNIFFER_IND_DIRECTION_RX, 8);
+ bitstream_write (bs, rx->fc10_bad_crc, 1);
+ bitstream_write (bs, rx->fc_bad_crc, 1);
+ bitstream_write (bs, pb ? pb->pb_measurement.crc_error : 0, 1);
+ bitstream_write (bs, 0, 13);
+ bitstream_write (bs, pb ? rx->pb_nb : 0, 8);
+ bitstream_write (bs, pb ? i : 0, 8);
+ bitstream_write (bs, rx->date, 32);
+ bitstream_write (bs, rx->fc10, 32);
+ bitstream_write (bs, rx->fc[0], 32);
+ bitstream_write (bs, rx->fc[1], 32);
+ bitstream_write (bs, rx->fc[2], 32);
+ bitstream_write (bs, rx->fc[3], 32);
+ if (pb)
+ {
+ if (!pb->pb_measurement.crc_error)
+ {
+ bitstream_write (bs, pb->header, 32);
+ u32 *p, *pend;
+ p = (u32 *) pb->blk.data;
+ pend = p + (rx->pb_size == PHY_PB_SIZE_520 ? 128 : 32);
+ for (; p != pend; p++)
+ bitstream_write (bs, *p, 32);
+ }
+ pb = PARENT_OF (phy_pb_rx_t, blk, pb->blk.next);
+ }
+ /* Send MME. */
+ mme_send (ctx, &ind);
+ }
}
}