summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorschodet2010-07-19 12:22:16 +0000
committerschodet2010-07-19 12:22:16 +0000
commite4e2e2fe87ca1f0f5f0859d09fbf17d6fd8bcce6 (patch)
tree00e807590b435e7c08149d32e91e863ae51b4a94
parentb388e73eab9c6ed0114e7419c0db33347d2addb7 (diff)
cesar/mac/pbproc: handle beacon detection flag, refs #1763
git-svn-id: svn+ssh://pessac/svn/cesar/trunk@7298 017c9cb6-072f-447c-8318-d5b54f68fe89
-rw-r--r--cesar/mac/pbproc/inc/context.h4
-rw-r--r--cesar/mac/pbproc/pbproc.h8
-rw-r--r--cesar/mac/pbproc/src/fsm_rx_data.c2
-rw-r--r--cesar/mac/pbproc/src/fsm_rx_sound.c2
-rw-r--r--cesar/mac/pbproc/src/fsm_top.c4
-rw-r--r--cesar/mac/pbproc/src/pbproc.c9
-rw-r--r--cesar/mac/pbproc/src/prep_mpdu.c6
-rw-r--r--cesar/mac/pbproc/test/pbproc/src/prep_mpdu.c14
8 files changed, 42 insertions, 7 deletions
diff --git a/cesar/mac/pbproc/inc/context.h b/cesar/mac/pbproc/inc/context.h
index 99e8412e77..d0cf6c2c8e 100644
--- a/cesar/mac/pbproc/inc/context.h
+++ b/cesar/mac/pbproc/inc/context.h
@@ -119,6 +119,10 @@ typedef struct pbproc_commit_t pbproc_commit_t;
/** Particular frames detection. */
struct pbproc_detect_t
{
+ /** Date at which beacon detection should be reset. */
+ u32 beacon_detect_expiration_date;
+ /** Whether beacon detection date is valid. */
+ bool beacon_detected;
/** Last HP 1.0 detection date. */
u32 hp10_detect_date;
/** Whether HP 1.0 detection date is valid. */
diff --git a/cesar/mac/pbproc/pbproc.h b/cesar/mac/pbproc/pbproc.h
index 5d21c9b933..e38d1cb76e 100644
--- a/cesar/mac/pbproc/pbproc.h
+++ b/cesar/mac/pbproc/pbproc.h
@@ -220,6 +220,14 @@ void
pbproc_activate (pbproc_t *ctx, bool flag);
/**
+ * Signal the beacon was successfully received.
+ * \param ctx pbproc context
+ * \param detect_expiration_date detection is valid until this date
+ */
+void
+pbproc_beacon_detected (pbproc_t *ctx, u32 detect_expiration_date);
+
+/**
* Give segments back to pbproc for reception.
* \param ctx pbproc context
* \param first first segment
diff --git a/cesar/mac/pbproc/src/fsm_rx_data.c b/cesar/mac/pbproc/src/fsm_rx_data.c
index b9bc368e19..0f5adfc9ff 100644
--- a/cesar/mac/pbproc/src/fsm_rx_data.c
+++ b/cesar/mac/pbproc/src/fsm_rx_data.c
@@ -539,7 +539,7 @@ pbproc_frda_send_sack (pbproc_t *ctx)
(SNID, ctx->alloc.snid),
(DTEI, ctx->recv_mpdu.sackd.tei),
(CFS, ctx->recv_mpdu.sackd.cfp),
- (BDF, false), /* TODO */
+ (BDF, ctx->detect.beacon_detected),
(SVN, 0),
(RRTF, 0),
(MFS_RSP_DATA, MFS_FSM_RSP_ACK),
diff --git a/cesar/mac/pbproc/src/fsm_rx_sound.c b/cesar/mac/pbproc/src/fsm_rx_sound.c
index 543dd1b60c..e1869e85ae 100644
--- a/cesar/mac/pbproc/src/fsm_rx_sound.c
+++ b/cesar/mac/pbproc/src/fsm_rx_sound.c
@@ -186,7 +186,7 @@ pbproc_frso__rx_sound__pbdma (pbproc_t *ctx)
PBPROC_FC_SOUND_W1,
(CFS, ctx->recv_mpdu.rx_params.cfp),
(PBSZ, false),
- (BDF, false), /* TODO */
+ (BDF, ctx->detect.beacon_detected),
(SAF, true),
(SCF, ctx->recv_mpdu.rx_params.sound_complete),
(REQ_TM, 0),
diff --git a/cesar/mac/pbproc/src/fsm_top.c b/cesar/mac/pbproc/src/fsm_top.c
index bbf08dbdac..f7077904ef 100644
--- a/cesar/mac/pbproc/src/fsm_top.c
+++ b/cesar/mac/pbproc/src/fsm_top.c
@@ -83,6 +83,10 @@ pbproc_ftop__idle__access (pbproc_t *ctx)
ctx->stats.aifs++;
/* Update detection. */
u32 now = phy_date ();
+ if (ctx->detect.beacon_detected
+ && lesseq_mod2p32 (ctx->detect.beacon_detect_expiration_date,
+ now))
+ ctx->detect.beacon_detected = false;
if (ctx->detect.hp10_detected
&& lesseq_mod2p32 (ctx->detect.hp10_detect_date
+ PBPROC_HP_DETECT_DELAY_TCK, now))
diff --git a/cesar/mac/pbproc/src/pbproc.c b/cesar/mac/pbproc/src/pbproc.c
index 609a7799fd..0fb4dc3ff5 100644
--- a/cesar/mac/pbproc/src/pbproc.c
+++ b/cesar/mac/pbproc/src/pbproc.c
@@ -211,6 +211,7 @@ pbproc_init (mac_config_t *config, mac_store_t *store)
ctx->access.mfs = NULL;
ctx->activated = false;
pbproc_prep_mpdu_init (ctx);
+ ctx->detect.beacon_detected = false;
/* Initialise precomputed times. */
pbproc_times_init (config, ctx->times_array);
ctx->symbol_tck[PHY_GIL_417] = MAC_DX417_TCK;
@@ -327,6 +328,14 @@ pbproc_activate (pbproc_t *ctx, bool flag)
}
void
+pbproc_beacon_detected (pbproc_t *ctx, u32 detect_expiration_date)
+{
+ dbg_assert_ptr (ctx);
+ ctx->detect.beacon_detected = true;
+ ctx->detect.beacon_detect_expiration_date = detect_expiration_date;
+}
+
+void
pbproc_rx_segment_refill (pbproc_t *ctx, pb_t *first, pb_t *last, uint nb)
{
dbg_assert_ptr (ctx);
diff --git a/cesar/mac/pbproc/src/prep_mpdu.c b/cesar/mac/pbproc/src/prep_mpdu.c
index a667cba3cf..86a84f8ba6 100644
--- a/cesar/mac/pbproc/src/prep_mpdu.c
+++ b/cesar/mac/pbproc/src/prep_mpdu.c
@@ -411,7 +411,7 @@ pbproc_prep_mpdu (pbproc_t *ctx)
prep->rts_fc_av.words[1] = BF_FILL (
PBPROC_FC_RTS_CTS_W1,
(CFS, access->cfp),
- (BDF, true), /* TODO */
+ (BDF, ctx->detect.beacon_detected),
(HP10DF, ctx->detect.hp10_detected),
(HP11DF, ctx->detect.hp11_detected),
(RTSF, true),
@@ -503,7 +503,7 @@ pbproc_prep_mpdu (pbproc_t *ctx)
prep->fc_av.words[1] = BF_FILL (
PBPROC_FC_SOF_W1,
(CFS, access->cfp),
- (BDF, true), /* TODO */
+ (BDF, ctx->detect.beacon_detected),
(HP10DF, ctx->detect.hp10_detected),
(HP11DF, ctx->detect.hp11_detected),
(EKS, eks),
@@ -1007,7 +1007,7 @@ pbproc_prep_mpdu_sound (pbproc_t *ctx, mfs_tx_t *mfs, uint fl_tck)
PBPROC_FC_SOUND_W1,
(CFS, ctx->access.cfp),
(PBSZ, false), /* TODO */
- (BDF, true), /* TODO */
+ (BDF, ctx->detect.beacon_detected),
(SAF, false),
(SCF, false),
(REQ_TM, TONEMAP_MAX),
diff --git a/cesar/mac/pbproc/test/pbproc/src/prep_mpdu.c b/cesar/mac/pbproc/test/pbproc/src/prep_mpdu.c
index 78d33d9165..40b0d0dd54 100644
--- a/cesar/mac/pbproc/test/pbproc/src/prep_mpdu.c
+++ b/cesar/mac/pbproc/test/pbproc/src/prep_mpdu.c
@@ -70,6 +70,8 @@ struct prep_mpdu_test_t
uint remove;
/** Sound completed flag. */
bool scf;
+ /** Beacon detected. */
+ bool beacon_detected;
/** HP 1.0 detected. */
bool hp10_detected;
/** HP 1.1 detected. */
@@ -146,6 +148,7 @@ prep_mpdu_test_f (test_t t, test_pbproc_t *tp, u32 date,
bool cfp = tmi != PHY_MOD_ROBO && params->tm_max_fl_tck;
access->prp = false;
access->cfp = cfp;
+ tp->pbproc->detect.beacon_detected = params->beacon_detected;
tp->pbproc->detect.hp10_detected = params->hp10_detected;
tp->pbproc->detect.hp11_detected = params->hp11_detected;
/* Prepare MPDU. */
@@ -197,7 +200,7 @@ prep_mpdu_test_f (test_t t, test_pbproc_t *tp, u32 date,
test_fail_unless (fc.lid == fclid);
test_fail_unless (fc.cfs == cfp);
test_fail_unless (!fc.pbsz);
- test_fail_unless (fc.bdf);
+ test_fail_unless (!fc.bdf);
test_fail_unless (!fc.saf);
test_fail_unless (!fc.scf);
test_fail_unless (fc.req_tm == TONEMAP_MAX);
@@ -284,7 +287,7 @@ prep_mpdu_test_f (test_t t, test_pbproc_t *tp, u32 date,
test_fail_unless (fc.dtei == dtei);
test_fail_unless (fc.lid == fclid);
test_fail_unless (fc.cfs == cfp);
- test_fail_unless (fc.bdf);
+ test_fail_unless (fc.bdf == params->beacon_detected);
test_fail_unless (fc.hp10df == params->hp10_detected);
test_fail_unless (fc.hp11df == params->hp11_detected);
test_fail_unless (fc.eks == (params->encrypted ? 3 : 0xf));
@@ -420,6 +423,7 @@ prep_mpdu_test_f (test_t t, test_pbproc_t *tp, u32 date,
if (params->tmi != PHY_MOD_ROBO || (params->encrypted && !params->bcast))
dbg_check (mac_store_sta_remove (tp->store, dtei));
pbproc_set_chandata_conf (tp->pbproc, NULL, 0, false);
+ tp->pbproc->detect.beacon_detected = false;
tp->pbproc->detect.hp10_detected = false;
tp->pbproc->detect.hp11_detected = false;
tp->config.authenticated = false;
@@ -599,6 +603,12 @@ prep_mpdu_basic_test_case (test_t t)
.symb_nb = 38, .main_seg_nb_total = 2,
.tmi = TONEMAP_INDEX_INITIAL_SOUND_COMPLETE);
} test_end;
+ test_begin (t, "beacon detection")
+ {
+ prep_mpdu_test (t, &tp, 0, .mfs_seg_nb = 30, .duration_symb_nb = 25,
+ .symb_nb = 19, .main_seg_nb_total = 1,
+ .beacon_detected = true);
+ } test_end;
test_begin (t, "hp detection")
{
prep_mpdu_test (t, &tp, 0, .mfs_seg_nb = 30, .duration_symb_nb = 25,