summaryrefslogtreecommitdiff
path: root/cesar/mac/pbproc/src
diff options
context:
space:
mode:
authorMilenko Jelisavcic2013-01-23 11:58:47 +0100
committerMilenko Jelisavcic2013-05-17 17:06:56 +0200
commitc4af9ed1b61707fab13f3f6900a2b963ecec563e (patch)
tree532bee2e6b467e25a823c20766054c528dd4d796 /cesar/mac/pbproc/src
parentb5a00337ad99cc8451d0c0a7090858c4117599b5 (diff)
cesar/mac/pbproc: modify rts-cts part, refs #3976
* limit rts-cts tolerance. * cancel prepared mpdu. * add support for sound frames. * activate tx rts-cts.
Diffstat (limited to 'cesar/mac/pbproc/src')
-rw-r--r--cesar/mac/pbproc/src/fsm_top.c2
-rw-r--r--cesar/mac/pbproc/src/fsm_tx_rts_cts.c57
-rw-r--r--cesar/mac/pbproc/src/pbproc.c2
-rw-r--r--cesar/mac/pbproc/src/prep_mpdu.c3
4 files changed, 43 insertions, 21 deletions
diff --git a/cesar/mac/pbproc/src/fsm_top.c b/cesar/mac/pbproc/src/fsm_top.c
index 760d2c9e32..23b7cf54d1 100644
--- a/cesar/mac/pbproc/src/fsm_top.c
+++ b/cesar/mac/pbproc/src/fsm_top.c
@@ -177,7 +177,7 @@ pbproc_ftop__idle__access (pbproc_t *ctx)
ctx->prep_mpdu.current->pb_nb_total);
if (ctx->prep_mpdu.rts_cts)
{
- //pbproc_ftrc__handle (ctx);
+ pbproc_ftrc__handle (ctx);
}
else if (ctx->prep_mpdu.sound_reason_code != TONEMAP_SRC_NULL)
{
diff --git a/cesar/mac/pbproc/src/fsm_tx_rts_cts.c b/cesar/mac/pbproc/src/fsm_tx_rts_cts.c
index 792ca3add5..00aa587f08 100644
--- a/cesar/mac/pbproc/src/fsm_tx_rts_cts.c
+++ b/cesar/mac/pbproc/src/fsm_tx_rts_cts.c
@@ -17,6 +17,7 @@
#include "mac/pbproc/inc/fsm_top.h"
#include "mac/pbproc/inc/fsm_tx_data.h"
+#include "mac/pbproc/inc/fsm_tx_sound.h"
#include "mac/pbproc/inc/fsm_handle_fc.h"
#include "mac/pbproc/inc/prep_mpdu.h"
@@ -36,18 +37,33 @@ void ARCH_ILRAM
pbproc_ftrc__handle (pbproc_t *ctx)
{
dbg_claim (ctx);
- phy_tx_frame (ctx->phy, ctx->prep_mpdu.rts_tx_date, false,
- ctx->access.access_date, ctx->prep_mpdu.rts_fc_av.words, 0,
- PHY_PB_SIZE_NONE, PHY_FC_MODE_AV_1);
+ if (PHY_FC_MODE_IS_HYBRID (ctx->prep_mpdu.fc_mode))
+ phy_tx_fc10 (ctx->phy, ctx->prep_mpdu.rts_tx_date,
+ ctx->prep_mpdu.fc10);
+ phy_tx_param_short (ctx->phy, ctx->prep_mpdu.fc_mode);
+ phy_tx_frame (ctx->phy, ctx->prep_mpdu.rts_tx_date, false, true,
+ ctx->prep_mpdu.rts_fc_av.words);
ca_access_vcs_restart_eifs (ctx->ca, ctx->prep_mpdu.rts_tx_date);
phy_rx_activate (ctx->phy, false,
- ctx->prep_mpdu.rts_tx_date + ctx->rts_tck, true);
+ ctx->prep_mpdu.rts_tx_date
+ + ctx->times.rts_rcg_tck, true);
pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_TX_WAIT_CTS);
}
-void ARCH_ILRAM
-pbproc_ftrc__tx_wait_cts__rx_fc (pbproc_t *ctx,
- u32 rx_date,
+static void
+pbproc_ftrc_tx_cancel (pbproc_t *ctx)
+{
+ dbg_claim (ctx);
+ ctx->stats.rts_fail++;
+ pbproc_prep_mpdu_t *prep = &ctx->prep_mpdu;
+ if (prep->sound_reason_code != TONEMAP_SRC_NULL)
+ pbproc_prep_mpdu_sound_ack (ctx, false);
+ else
+ pbproc_prep_mpdu_cancel_burst (ctx);
+}
+
+void ARCH_ILRAM_PRIO (2)
+pbproc_ftrc__tx_wait_cts__rx_fc (pbproc_t *ctx, u32 rx_date,
const pbproc_fc_t *fc_av)
{
dbg_claim (ctx);
@@ -57,32 +73,37 @@ pbproc_ftrc__tx_wait_cts__rx_fc (pbproc_t *ctx,
&& fc_av->rts_cts.rtsf == false
&& fc_av->generic.access == false
&& fc_av->generic.snid == ctx->alloc.snid
- && fc_av->rts_cts.stei == ctx->prep_mpdu.dtei
+ && fc_av->rts_cts.stei == ctx->prep_mpdu.rts_fc_av.rts_cts.dtei
&& fc_av->rts_cts.dtei == ctx->config->tei
&& fc_av->rts_cts.lid == ctx->prep_mpdu.lid
- && fc_av->rts_cts.mcf == ctx->prep_mpdu.mcf
- && less_mod2p32 (ctx->prep_mpdu.rts_tx_date + ctx->times.rts_rcg_tck
- - ctx->times.tolerance_tck, rx_date)
&& less_mod2p32 (ctx->prep_mpdu.rts_tx_date + ctx->times.rts_rcg_tck
- + ctx->times.tolerance_tck, rx_date))
+ - MAC_TOLERANCE_TCK, rx_date)
+ && !less_mod2p32 (ctx->prep_mpdu.rts_tx_date + ctx->times.rts_rcg_tck
+ + MAC_TOLERANCE_TCK, rx_date))
{
+ /* Prepare reception of FC only. Unblock the HW.*/
+ phy_rx_prepare_short (ctx->phy);
/* XXX Could add some checks, for duration for example. */
- /* Ok, now transmit data. */
- pbproc_ftda__handle (ctx);
+ /* Ok, now transmit data/sound. */
+ if (ctx->prep_mpdu.sound_reason_code != TONEMAP_SRC_NULL)
+ pbproc_ftso__handle (ctx);
+ else
+ pbproc_ftda__handle (ctx);
}
else
{
/* Not our CTS. */
- ctx->stats.rts_fail++;
pbproc_fhfc_handle_fc (ctx, rx_date, fc_av);
+ /* Cancel the transmission. */
+ pbproc_ftrc_tx_cancel (ctx);
}
}
-void ARCH_ILRAM
+void ARCH_ILRAM_PRIO (2)
pbproc_ftrc__tx_wait_cts__access (pbproc_t *ctx)
{
dbg_claim (ctx);
- ctx->stats.rts_fail++;
+ /* Cancel the transmission. */
+ pbproc_ftrc_tx_cancel (ctx);
pbproc_ftop__idle__access (ctx);
}
-
diff --git a/cesar/mac/pbproc/src/pbproc.c b/cesar/mac/pbproc/src/pbproc.c
index 167aadc38d..df2b1df00e 100644
--- a/cesar/mac/pbproc/src/pbproc.c
+++ b/cesar/mac/pbproc/src/pbproc.c
@@ -250,7 +250,7 @@ pbproc_init (mac_config_t *config, mac_store_t *store)
pbproc_frda_init (ctx);
pbproc_frbe_init (ctx);
pbproc_frso_init (ctx);
- //pbproc_ftrc_init (ctx);
+ pbproc_ftrc_init (ctx);
pbproc_ftda_init (ctx);
pbproc_ftso_init (ctx);
/* Setup traffic indicator. */
diff --git a/cesar/mac/pbproc/src/prep_mpdu.c b/cesar/mac/pbproc/src/prep_mpdu.c
index a7a9659d88..a6b0055801 100644
--- a/cesar/mac/pbproc/src/prep_mpdu.c
+++ b/cesar/mac/pbproc/src/prep_mpdu.c
@@ -270,7 +270,8 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
? MAC_TEI_UNASSOCIATED : ctx->config->tei;
/* Should we use RTS CTS?
* TODO: real test is more complex. */
- prep->rts_cts = mfs->common.bcast && ctx->config->rts_broadcast;
+ prep->rts_cts = mfs->common.bcast && ctx->config->rts_broadcast
+ && MAC_TEI_IS_STA (ack_dtei);
/* Prepare start dates and raw access duration. */
if (prep->rts_cts)
{