summaryrefslogtreecommitdiff
path: root/cesar/mac
diff options
context:
space:
mode:
authorMilenko Jelisavcic2013-03-01 13:26:17 +0100
committerMilenko Jelisavcic2013-05-17 17:06:56 +0200
commita35641989f45cdeff2d15fddca2a04ec67916fd8 (patch)
tree60b97cc9dcc5377be79db5484379c0dd4b2ee2bc /cesar/mac
parent3597342c26d2e1ff1b55bec9e968dfd37bc31128 (diff)
cesar/mac/pbproc: factorize rts-cts frame prepare, refs #3976
Diffstat (limited to 'cesar/mac')
-rw-r--r--cesar/mac/pbproc/src/prep_mpdu.c74
1 files changed, 45 insertions, 29 deletions
diff --git a/cesar/mac/pbproc/src/prep_mpdu.c b/cesar/mac/pbproc/src/prep_mpdu.c
index 062c42584e..a7a9659d88 100644
--- a/cesar/mac/pbproc/src/prep_mpdu.c
+++ b/cesar/mac/pbproc/src/prep_mpdu.c
@@ -85,6 +85,48 @@ pbproc_prep_mpdu_init (pbproc_t *ctx)
slist_init (prep->main_commit_return_);
}
+/**
+ * Prepare a RTS_CTS frame.
+ * \param ctx pbproc context
+ * \param mfs mfs selected (data/mme, beacon)
+ * \param ack_dtei coresponding ack station
+ * \param prep prep_mpdu
+ * \param cfp access contention bit
+ * \param duration_tck complete duration (rts/cts + frame)
+ */
+static void ARCH_ILRAM
+pbproc_prep_rts_cts_fc (pbproc_t *ctx, mfs_tx_t *mfs, uint ack_dtei,
+ pbproc_prep_mpdu_t *prep, bool cfp, uint duration_tck)
+{
+ /* RTS FC. */
+ prep->rts_fc_av.words[0] = BF_FILL (
+ PBPROC_FC_RTS_CTS_W0,
+ (DT_AV, PBPROC_FC_DT_RTS_CTS),
+ (ACCESS, false),
+ (SNID, ctx->alloc.snid),
+ (STEI, prep->stei),
+ (DTEI, ack_dtei),
+ (LID, prep->lid));
+ prep->rts_fc_av.words[1] = BF_FILL (
+ PBPROC_FC_RTS_CTS_W1,
+ (CFS, cfp),
+ (BDF, ctx->detect.beacon_detected),
+ (HP10DF, ctx->detect.hp10_detected),
+ (HP11DF, ctx->detect.hp11_detected),
+ (RTSF, true),
+ (IGF, false),
+ (MNBF, mfs->common.bcast && prep->unassociated),
+ (MCF, mfs->common.bcast),
+ (DUR, MAC_TCK_TO_FL (duration_tck)),
+ (RESERVED0, 0));
+ prep->rts_fc_av.words[2] = BF_FILL (
+ PBPROC_FC_RTS_CTS_W2,
+ (RESERVED1, 0));
+ prep->rts_fc_av.words[3] = BF_FILL (
+ PBPROC_FC_RTS_CTS_W3,
+ (RESERVED2, 0));
+}
+
void ARCH_ILRAM_PRIO (1)
pbproc_prep_beacon (pbproc_t *ctx, mfs_tx_t *mfs)
{
@@ -552,35 +594,9 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
/* Prepare RTS FC. */
if (prep->rts_cts)
{
- /* RTS FC. */
- prep->rts_fc_av.words[0] = BF_FILL (
- PBPROC_FC_RTS_CTS_W0,
- (DT_AV, PBPROC_FC_DT_RTS_CTS),
- (ACCESS, false),
- (SNID, ctx->alloc.snid),
- (STEI, prep->stei),
- (DTEI, ack_dtei),
- (LID, prep->lid));
- prep->rts_fc_av.words[1] = BF_FILL (
- PBPROC_FC_RTS_CTS_W1,
- (CFS, access->cfp),
- (BDF, ctx->detect.beacon_detected),
- (HP10DF, ctx->detect.hp10_detected),
- (HP11DF, ctx->detect.hp11_detected),
- (RTSF, true),
- (IGF, false),
- (MNBF, mfs->common.bcast && prep->unassociated),
- (MCF, mfs->common.bcast),
- (DUR, (MAC_RCG_TCK + times->pre_fcs_tck + MAC_CMG_TCK
- + times->pre_fcs_tck + data_tck + rifs_tck
- + times->pre_fcs_tck) / MAC_TCK_PER_FL),
- (RESERVED0, 0));
- prep->rts_fc_av.words[2] = BF_FILL (
- PBPROC_FC_RTS_CTS_W2,
- (RESERVED1, 0));
- prep->rts_fc_av.words[3] = BF_FILL (
- PBPROC_FC_RTS_CTS_W3,
- (RESERVED2, 0));
+ uint duration_tck = prep->flp_tck + times->rts_rcg_cts_cmg_tck;
+ pbproc_prep_rts_cts_fc (ctx, mfs, ack_dtei, prep, access->cfp,
+ duration_tck);
/* Invalid FC 1.0, HP 1.0 stations will defer (20 symbols and ROBO). */
prep->rts_fc10 = 0x200000;
}