summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cesar/mac/pbproc/inc/context.h4
-rw-r--r--cesar/mac/pbproc/src/fsm_handle_fc.c17
-rw-r--r--cesar/mac/pbproc/src/fsm_rx_beacon.c3
-rw-r--r--cesar/mac/pbproc/src/fsm_rx_data.c18
-rw-r--r--cesar/mac/pbproc/src/fsm_rx_sound.c12
-rw-r--r--cesar/mac/pbproc/src/fsm_top.c5
-rw-r--r--cesar/mac/pbproc/src/fsm_tx_data.c15
-rw-r--r--cesar/mac/pbproc/src/fsm_tx_rts_cts.c10
-rw-r--r--cesar/mac/pbproc/src/fsm_tx_sound.c6
-rw-r--r--cesar/mac/pbproc/src/pbproc.c3
-rw-r--r--cesar/mac/pbproc/src/prep_mpdu.c10
-rw-r--r--cesar/mac/pbproc/test/pbproc/inc/test_pbproc.h11
-rw-r--r--cesar/mac/pbproc/test/pbproc/src/prep_mpdu.c2
-rw-r--r--cesar/mac/pbproc/test/pbproc/src/rx_data.c2
-rw-r--r--cesar/mac/pbproc/test/pbproc/src/test_pbproc.c48
-rw-r--r--cesar/mac/pbproc/test/pbproc/src/tx_data.c5
-rw-r--r--cesar/mac/pbproc/test/pbproc/src/tx_sound.c2
17 files changed, 109 insertions, 64 deletions
diff --git a/cesar/mac/pbproc/inc/context.h b/cesar/mac/pbproc/inc/context.h
index 029dc806ba..53e1a4cc05 100644
--- a/cesar/mac/pbproc/inc/context.h
+++ b/cesar/mac/pbproc/inc/context.h
@@ -185,7 +185,9 @@ struct pbproc_t
/** Current allocation characteristics. */
ca_alloc_param_t alloc;
/** Precomputed times, indexed with "is hybrid?". */
- pbproc_times_t times[2];
+ pbproc_times_t times_array[2];
+ /** Precomputed times for this allocation. */
+ pbproc_times_t times;
/** Symbol length in ticks, depends of the guard length. */
uint symbol_tck[PHY_GIL_NB];
/** Statistics. */
diff --git a/cesar/mac/pbproc/src/fsm_handle_fc.c b/cesar/mac/pbproc/src/fsm_handle_fc.c
index 19273a6baa..75b320ac3b 100644
--- a/cesar/mac/pbproc/src/fsm_handle_fc.c
+++ b/cesar/mac/pbproc/src/fsm_handle_fc.c
@@ -68,7 +68,6 @@ void ARCH_ILRAM
pbproc_fhfc_handle_fc (pbproc_t *ctx, u32 rx_date, const pbproc_fc_t *fc_av)
{
dbg_claim (ctx);
- const bool hybrid = ctx->alloc.hybrid;
/* Cancel any pending TX. */
phy_tx_cancel (ctx->phy);
/* Hold any access update. */
@@ -79,7 +78,7 @@ pbproc_fhfc_handle_fc (pbproc_t *ctx, u32 rx_date, const pbproc_fc_t *fc_av)
/* Bad CRC. */
phy_rx_prepare_short (ctx->phy);
ca_access_vcs_restart (ctx->ca, rx_date,
- ctx->times[hybrid].eifs_tck,
+ ctx->times.eifs_tck,
PBPROC_ANTICIP_TCK, true);
phy_rx_activate (ctx->phy, true, 0, true);
pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_IDLE);
@@ -96,8 +95,8 @@ pbproc_fhfc_handle_fc (pbproc_t *ctx, u32 rx_date, const pbproc_fc_t *fc_av)
pbproc_fhfc_sof (ctx, rx_date, &fc_av->sof);
break;
case PBPROC_FC_DT_SACK:
- pbproc_fhfc_ignore (ctx, rx_date, ctx->times[hybrid].pre_fcs_tck +
- MAC_CIFS_TCK);
+ pbproc_fhfc_ignore (ctx, rx_date, ctx->times.pre_fcs_tck
+ + MAC_CIFS_TCK);
break;
case PBPROC_FC_DT_SOUND:
pbproc_fhfc_sound (ctx, rx_date, &fc_av->sound);
@@ -106,7 +105,7 @@ pbproc_fhfc_handle_fc (pbproc_t *ctx, u32 rx_date, const pbproc_fc_t *fc_av)
/* Count as bad CRC. */
phy_rx_prepare_short (ctx->phy);
ca_access_vcs_restart (ctx->ca, rx_date,
- ctx->times[hybrid].eifs_tck,
+ ctx->times.eifs_tck,
PBPROC_ANTICIP_TCK, true);
phy_rx_activate (ctx->phy, true, 0, true);
pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_IDLE);
@@ -124,7 +123,6 @@ pbproc_fhfc_beacon (pbproc_t *ctx, u32 rx_date,
static void ARCH_ILRAM
pbproc_fhfc_sof (pbproc_t *ctx, u32 rx_date, const pbproc_fc_sof_t *sof)
{
- const bool hybrid = ctx->alloc.hybrid;
if (sof->access == false
&& (sof->snid == ctx->alloc.snid || sof->mnbf)
&& (sof->dtei == ctx->config->tei || sof->mcf))
@@ -135,7 +133,7 @@ pbproc_fhfc_sof (pbproc_t *ctx, u32 rx_date, const pbproc_fc_sof_t *sof)
{
/* Not for us, count the expected following SACK. */
pbproc_fhfc_ignore (ctx, rx_date, MAC_FL_TO_TCK (sof->fl_av)
- + 2 * ctx->times[hybrid].pre_fcs_tck
+ + 2 * ctx->times.pre_fcs_tck
+ MAC_CIFS_TCK);
}
}
@@ -143,7 +141,6 @@ pbproc_fhfc_sof (pbproc_t *ctx, u32 rx_date, const pbproc_fc_sof_t *sof)
static void ARCH_ILRAM
pbproc_fhfc_sound (pbproc_t *ctx, u32 rx_date, const pbproc_fc_sound_t *sound)
{
- const bool hybrid = ctx->alloc.hybrid;
if (sound->access == false
&& sound->snid == ctx->alloc.snid
&& sound->dtei == ctx->config->tei
@@ -154,14 +151,14 @@ pbproc_fhfc_sound (pbproc_t *ctx, u32 rx_date, const pbproc_fc_sound_t *sound)
else if (sound->saf)
{
/* Acknowledge, ignore. */
- pbproc_fhfc_ignore (ctx, rx_date, ctx->times[hybrid].pre_fcs_tck
+ pbproc_fhfc_ignore (ctx, rx_date, ctx->times.pre_fcs_tck
+ MAC_CIFS_TCK);
}
else
{
/* Not for us, count the expected following SOUND ACK. */
pbproc_fhfc_ignore (ctx, rx_date, MAC_FL_TO_TCK (sound->fl_av)
- + 2 * ctx->times[hybrid].pre_fcs_tck
+ + 2 * ctx->times.pre_fcs_tck
+ MAC_CIFS_TCK);
}
}
diff --git a/cesar/mac/pbproc/src/fsm_rx_beacon.c b/cesar/mac/pbproc/src/fsm_rx_beacon.c
index de3c604e10..877a33afba 100644
--- a/cesar/mac/pbproc/src/fsm_rx_beacon.c
+++ b/cesar/mac/pbproc/src/fsm_rx_beacon.c
@@ -59,8 +59,7 @@ pbproc_frbe__handle (pbproc_t *ctx, u32 rx_date,
params->snid = beacon->snid;
params->access = beacon->access;
/* Compute beacon end of frame. */
- const bool hybrid = true;
- u32 flp_tck = ctx->times[hybrid].pre_fcs_tck
+ u32 flp_tck = ctx->times.pre_fcs_tck
+ MAC_PAYLOAD_TCK (symb_nb, MAC_DX567_TCK)
+ MAC_B2BIFS_TCK;
ctx->recv_mpdu.ack_date = rx_date + flp_tck;
diff --git a/cesar/mac/pbproc/src/fsm_rx_data.c b/cesar/mac/pbproc/src/fsm_rx_data.c
index b9ecaab3f5..317dcc476e 100644
--- a/cesar/mac/pbproc/src/fsm_rx_data.c
+++ b/cesar/mac/pbproc/src/fsm_rx_data.c
@@ -91,7 +91,6 @@ pbproc_frda_init (pbproc_t *ctx)
void ARCH_ILRAM
pbproc_frda__handle (pbproc_t *ctx, u32 rx_date, const pbproc_fc_sof_t *sof)
{
- const bool hybrid = ctx->alloc.hybrid;
bool wack, unassociated;
dbg_claim (ctx);
dbg_claim (sof);
@@ -108,7 +107,7 @@ pbproc_frda__handle (pbproc_t *ctx, u32 rx_date, const pbproc_fc_sof_t *sof)
/* Ignore frames ending after the allocation. */
uint fl_tck = MAC_FL_TO_TCK (sof->fl_av);
if (less_mod2p32 (ctx->alloc.end_date,
- rx_date + 2 * ctx->times[hybrid].pre_fcs_tck + fl_tck
+ rx_date + 2 * ctx->times.pre_fcs_tck + fl_tck
+ MAC_CIFS_TCK))
{
pbproc_frda_error (ctx, rx_date, sof, false,
@@ -241,8 +240,7 @@ pbproc_frda__handle (pbproc_t *ctx, u32 rx_date, const pbproc_fc_sof_t *sof)
ctx->recv_mpdu.rx_params.mfs_cmd_data = sof->mfs_cmd_data;
ctx->recv_mpdu.rx_params.mfs_cmd_mme = sof->mfs_cmd_mgmt;
ctx->recv_mpdu.pb_nb = pb_nb;
- ctx->recv_mpdu.ack_date = rx_date + ctx->times[hybrid].pre_fcs_tck
- + fl_tck;
+ ctx->recv_mpdu.ack_date = rx_date + ctx->times.pre_fcs_tck + fl_tck;
ctx->recv_mpdu.drop = !nek_ok;
/* Keep a block to store received MPDU parameters. */
dbg_assert (ctx->rx_pool_size >= 1 + ctx->chandata_nb + pb_nb);
@@ -479,8 +477,7 @@ pbproc_frda_error (pbproc_t *ctx, u32 rx_date, const pbproc_fc_sof_t *sof,
/* First thing to do: unblock the hardware. */
phy_rx_prepare_short (ctx->phy);
/* ACK date. */
- const bool hybrid = ctx->alloc.hybrid;
- ctx->recv_mpdu.ack_date = rx_date + ctx->times[hybrid].pre_fcs_tck
+ ctx->recv_mpdu.ack_date = rx_date + ctx->times.pre_fcs_tck
+ MAC_FL_TO_TCK (sof->fl_av);
/* With acknowledge? */
if (wack)
@@ -516,7 +513,6 @@ pbproc_frda_send_sack (pbproc_t *ctx)
{
dbg_claim (ctx);
dbg_claim (ctx->recv_mpdu.sackd.valid);
- const bool hybrid = ctx->alloc.hybrid;
/* SACK FC. */
pbproc_fc_t fc;
fc.words[0] = BF_FILL (
@@ -564,7 +560,8 @@ pbproc_frda_send_sack (pbproc_t *ctx)
}
/* Send it. */
phy_tx_param_short (ctx->phy,
- PHY_FC_MODE (hybrid, ctx->config->fc_symbols_nb));
+ PHY_FC_MODE (ctx->alloc.hybrid,
+ ctx->config->fc_symbols_nb));
phy_tx_frame (ctx->phy, ctx->recv_mpdu.ack_date, false, false, fc.words);
/* Ensure SACKD will be cleared. */
/* TODO: keep it for RSR. */
@@ -575,13 +572,12 @@ static void ARCH_ILRAM
pbproc_frda_next (pbproc_t *ctx)
{
dbg_claim (ctx);
- const bool hybrid = ctx->alloc.hybrid;
/* Burst? */
if (ctx->recv_mpdu.mpdu_cnt == 0)
{
/* Prepare for next MPDU. */
ca_access_vcs_restart (ctx->ca, ctx->recv_mpdu.ack_date,
- ctx->times[hybrid].pre_fcs_tck + MAC_CIFS_TCK,
+ ctx->times.pre_fcs_tck + MAC_CIFS_TCK,
PBPROC_ANTICIP_TCK, false);
pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_IDLE);
}
@@ -589,7 +585,7 @@ pbproc_frda_next (pbproc_t *ctx)
{
/* Wait for next MPDU part of the burst. */
ca_access_vcs_restart (ctx->ca, ctx->recv_mpdu.ack_date,
- ctx->times[hybrid].eifs_tck,
+ ctx->times.eifs_tck,
PBPROC_ANTICIP_TCK, true);
phy_rx_activate (ctx->phy, false, ctx->recv_mpdu.ack_date, true);
pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_RX_BURST);
diff --git a/cesar/mac/pbproc/src/fsm_rx_sound.c b/cesar/mac/pbproc/src/fsm_rx_sound.c
index 46a1e0a561..88beea4032 100644
--- a/cesar/mac/pbproc/src/fsm_rx_sound.c
+++ b/cesar/mac/pbproc/src/fsm_rx_sound.c
@@ -39,7 +39,6 @@ pbproc_frso__handle (pbproc_t *ctx, u32 rx_date,
{
dbg_claim (ctx);
dbg_claim (sound);
- const bool hybrid = ctx->alloc.hybrid;
/* Get tonemap. */
tonemap_t *tm;
phy_mod_t mod = sound->pbsz ? PHY_MOD_MINI_ROBO : PHY_MOD_ROBO;
@@ -52,11 +51,10 @@ pbproc_frso__handle (pbproc_t *ctx, u32 rx_date,
tm->bits_per_symbol;
/* Save early needed received MPDU parameters. */
ctx->recv_mpdu.mpdu_cnt = sound->mpdu_cnt;
- ctx->recv_mpdu.ack_date = rx_date + ctx->times[hybrid].pre_fcs_tck
- + fl_tck;
+ ctx->recv_mpdu.ack_date = rx_date + ctx->times.pre_fcs_tck + fl_tck;
/* Ignore frames ending after the allocation. */
if (less_mod2p32 (ctx->alloc.end_date,
- rx_date + 2 * ctx->times[hybrid].pre_fcs_tck + fl_tck
+ rx_date + 2 * ctx->times.pre_fcs_tck + fl_tck
+ MAC_CIFS_TCK))
{
/* Unblock hardware. */
@@ -220,19 +218,17 @@ static void ARCH_ILRAM
pbproc_frso_next (pbproc_t *ctx)
{
dbg_claim (ctx);
- const bool hybrid = ctx->alloc.hybrid;
/* Restart VCS. */
if (ctx->recv_mpdu.mpdu_cnt == 0)
{
ca_access_vcs_restart (ctx->ca, ctx->recv_mpdu.ack_date,
- ctx->times[hybrid].pre_fcs_tck + MAC_CIFS_TCK,
+ ctx->times.pre_fcs_tck + MAC_CIFS_TCK,
PBPROC_ANTICIP_TCK, false);
}
else
{
ca_access_vcs_restart (ctx->ca, ctx->recv_mpdu.ack_date,
- ctx->times[hybrid].eifs_tck,
- PBPROC_ANTICIP_TCK, true);
+ ctx->times.eifs_tck, PBPROC_ANTICIP_TCK, true);
phy_rx_activate (ctx->phy, false, ctx->recv_mpdu.ack_date, true);
}
/* Return to IDLE. */
diff --git a/cesar/mac/pbproc/src/fsm_top.c b/cesar/mac/pbproc/src/fsm_top.c
index 5eb237eb24..aa9281e68e 100644
--- a/cesar/mac/pbproc/src/fsm_top.c
+++ b/cesar/mac/pbproc/src/fsm_top.c
@@ -65,6 +65,7 @@ pbproc_ftop__idle__access (pbproc_t *ctx)
phy_rx_activate (ctx->phy, true, 0, false);
ca_backoff_cancel (ctx->ca);
ctx->alloc = *ca_access_aifs (ctx->ca);
+ ctx->times = ctx->times_array[ctx->alloc.hybrid];
/* Change RX parameters. */
phy_rx_param (ctx->phy, PHY_FC_MODE (ctx->alloc.hybrid,
ctx->config->fc_symbols_nb));
@@ -87,8 +88,8 @@ pbproc_ftop__idle__access (pbproc_t *ctx)
* use our backoff, the backoff procedure is not entered. */
ca_backoff_cancel (ctx->ca);
ca_access_vcs_restart (ctx->ca, phy_date (ctx->phy),
- ctx->times[ctx->access.hybrid].eifs_tck,
- PBPROC_ANTICIP_TCK, true);
+ ctx->times.eifs_tck, PBPROC_ANTICIP_TCK,
+ true);
ctx->stats.prp_lost++;
dbg_claim (ctx->fsm.current_state == PBPROC_FSM_STATE_IDLE);
}
diff --git a/cesar/mac/pbproc/src/fsm_tx_data.c b/cesar/mac/pbproc/src/fsm_tx_data.c
index 6ea67313d4..bf17161c3e 100644
--- a/cesar/mac/pbproc/src/fsm_tx_data.c
+++ b/cesar/mac/pbproc/src/fsm_tx_data.c
@@ -63,8 +63,7 @@ pbproc_ftda__handle (pbproc_t *ctx)
/* Always program a timer because TX can be canceled due to false alarms,
* see maria:#706. */
ca_access_vcs_restart (ctx->ca, ctx->prep_mpdu.tx_date,
- ctx->times[ctx->access.hybrid].eifs_tck,
- PBPROC_ANTICIP_TCK, true);
+ ctx->times.eifs_tck, PBPROC_ANTICIP_TCK, true);
pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_TX_WAIT_ACCESS_CONF);
}
@@ -116,8 +115,8 @@ pbproc_ftda__tx_wait_access_conf__access_conf (pbproc_t *ctx)
- 2);
ca_access_vcs_restart (ctx->ca, ctx->prep_mpdu.tx_date
+ ctx->prep_mpdu.flp_tck,
- ctx->times[ctx->access.hybrid].eifs_tck,
- PBPROC_ANTICIP_TCK, true);
+ ctx->times.eifs_tck, PBPROC_ANTICIP_TCK,
+ true);
phy_rx_activate (ctx->phy, false, ctx->prep_mpdu.tx_date
+ ctx->prep_mpdu.flp_tck, true);
pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_TX_WAIT_SACKD);
@@ -142,9 +141,7 @@ void ARCH_ILRAM
pbproc_ftda__tx_wait_sackd__rx_fc (pbproc_t *ctx, u32 rx_date,
const pbproc_fc_t *fc_av)
{
- pbproc_times_t *times;
dbg_claim (ctx);
- times = &ctx->times[ctx->access.hybrid];
pbproc_prep_mpdu_t *prep = &ctx->prep_mpdu;
/* Is it our SACK. */
if (fc_av
@@ -190,7 +187,7 @@ pbproc_ftda__tx_wait_sackd__rx_fc (pbproc_t *ctx, u32 rx_date,
{
ca_backoff_success (ctx->ca);
ca_access_vcs_restart (ctx->ca, rx_date,
- times->pre_fcs_tck + MAC_CIFS_TCK,
+ ctx->times.pre_fcs_tck + MAC_CIFS_TCK,
PBPROC_ANTICIP_TCK, false);
pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_IDLE);
}
@@ -230,13 +227,11 @@ pbproc_ftda__tx_wait_sackd__access (pbproc_t *ctx)
void ARCH_ILRAM
pbproc_ftda__tx_wait_tx_end__pbdma (pbproc_t *ctx)
{
- pbproc_times_t *times;
dbg_claim (ctx);
- times = &ctx->times[ctx->access.hybrid];
pbproc_prep_mpdu_ack_all (ctx);
ca_backoff_success (ctx->ca);
uint sack_tck = !ctx->access.mfs->beacon
- ? times->pre_fcs_tck + MAC_CIFS_TCK : 0;
+ ? ctx->times.pre_fcs_tck + MAC_CIFS_TCK : 0;
ca_access_vcs_restart (ctx->ca, ctx->prep_mpdu.tx_date
+ ctx->prep_mpdu.flp_tck,
sack_tck, PBPROC_ANTICIP_TCK, false);
diff --git a/cesar/mac/pbproc/src/fsm_tx_rts_cts.c b/cesar/mac/pbproc/src/fsm_tx_rts_cts.c
index 55705084a4..68af27a903 100644
--- a/cesar/mac/pbproc/src/fsm_tx_rts_cts.c
+++ b/cesar/mac/pbproc/src/fsm_tx_rts_cts.c
@@ -51,9 +51,7 @@ pbproc_ftrc__tx_wait_cts__rx_fc (pbproc_t *ctx,
u32 rx_date,
const pbproc_fc_t *fc_av)
{
- pbproc_times_t *times;
dbg_claim (ctx);
- times = ctx->times[ctx->prep_mpdu.hybrid];
/* Is it our CTS. */
if (fc_av
&& fc_av->generic.dt_av == PBPROC_FC_DT_RTS_CTS
@@ -64,10 +62,10 @@ pbproc_ftrc__tx_wait_cts__rx_fc (pbproc_t *ctx,
&& 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 + times->rts_rcg_tck
- - times->tolerance_tck, rx_date)
- && less_mod2p32 (ctx->prep_mpdu.rts_tx_date + times->rts_rcg_tck
- + times->tolerance_tck, rx_date))
+ && 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))
{
/* XXX Could add some checks, for duration for example. */
/* Ok, now transmit data. */
diff --git a/cesar/mac/pbproc/src/fsm_tx_sound.c b/cesar/mac/pbproc/src/fsm_tx_sound.c
index 6ccf688c2a..32d739ab13 100644
--- a/cesar/mac/pbproc/src/fsm_tx_sound.c
+++ b/cesar/mac/pbproc/src/fsm_tx_sound.c
@@ -44,8 +44,7 @@ pbproc_ftso__handle (pbproc_t *ctx)
phy_tx_frame (ctx->phy, ctx->prep_mpdu.tx_date, false, prp,
ctx->prep_mpdu.fc_av.words);
ca_access_vcs_restart (ctx->ca, ctx->prep_mpdu.tx_date,
- ctx->times[ctx->access.hybrid].eifs_tck,
- PBPROC_ANTICIP_TCK, true);
+ ctx->times.eifs_tck, PBPROC_ANTICIP_TCK, true);
phy_rx_activate (ctx->phy, false, ctx->prep_mpdu.tx_date
+ ctx->prep_mpdu.flp_tck, true);
pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_TX_SOUND_WAIT_ACK);
@@ -56,7 +55,6 @@ pbproc_ftso__tx_sound_wait_ack__rx_fc (pbproc_t *ctx, u32 rx_date,
const pbproc_fc_t *fc_av)
{
dbg_claim (ctx);
- pbproc_times_t *times = &ctx->times[ctx->access.hybrid];
/* Is it our ACK. */
pbproc_prep_mpdu_t *prep = &ctx->prep_mpdu;
if (fc_av
@@ -77,7 +75,7 @@ pbproc_ftso__tx_sound_wait_ack__rx_fc (pbproc_t *ctx, u32 rx_date,
{
ca_backoff_success (ctx->ca);
ca_access_vcs_restart (ctx->ca, rx_date,
- times->pre_fcs_tck + MAC_CIFS_TCK,
+ ctx->times.pre_fcs_tck + MAC_CIFS_TCK,
PBPROC_ANTICIP_TCK, false);
pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_IDLE);
}
diff --git a/cesar/mac/pbproc/src/pbproc.c b/cesar/mac/pbproc/src/pbproc.c
index 14c1821ad2..41df3525c6 100644
--- a/cesar/mac/pbproc/src/pbproc.c
+++ b/cesar/mac/pbproc/src/pbproc.c
@@ -156,7 +156,7 @@ pbproc_init (mac_config_t *config, mac_store_t *store)
ctx->activated = false;
pbproc_prep_mpdu_init (ctx);
/* Initialise precomputed times. */
- pbproc_times_init (config, ctx->times);
+ pbproc_times_init (config, ctx->times_array);
ctx->symbol_tck[PHY_GIL_417] = MAC_DX417_TCK;
ctx->symbol_tck[PHY_GIL_567] = MAC_DX567_TCK;
ctx->symbol_tck[PHY_GIL_3534] = MAC_DX3534_TCK;
@@ -257,6 +257,7 @@ pbproc_activate (pbproc_t *ctx, bool flag)
/* Activate. */
ctx->alloc = *ca_access_activate (ctx->ca, phy_date (ctx->phy),
PBPROC_ANTICIP_TCK);
+ ctx->times = ctx->times_array[ctx->alloc.hybrid];
phy_rx_param (ctx->phy, PHY_FC_MODE (ctx->alloc.hybrid,
ctx->config->fc_symbols_nb));
phy_rx_activate (ctx->phy, true, 0, true);
diff --git a/cesar/mac/pbproc/src/prep_mpdu.c b/cesar/mac/pbproc/src/prep_mpdu.c
index 4b99d358ce..5e5e9d3a9a 100644
--- a/cesar/mac/pbproc/src/prep_mpdu.c
+++ b/cesar/mac/pbproc/src/prep_mpdu.c
@@ -81,7 +81,6 @@ pbproc_prep_beacon (pbproc_t *ctx)
ca_access_param_t *access;
mfs_tx_t *mfs;
pbproc_prep_mpdu_t *prep;
- pbproc_times_t *times;
/* Check inputs. */
access = &ctx->access;
mfs = access->mfs;
@@ -89,7 +88,6 @@ pbproc_prep_beacon (pbproc_t *ctx)
dbg_claim (mfs->common.tx && mfs->beacon);
prep = &ctx->prep_mpdu;
dbg_claim (!prep->valid);
- times = &ctx->times[access->hybrid];
/* Early return if removed MFS. */
if (mfs->ca_state == CA_MFS_STATE_REMOVED)
return;
@@ -120,9 +118,10 @@ pbproc_prep_beacon (pbproc_t *ctx)
u32 symb_nb = (1 * tm->bits_per_pb[PHY_PB_SIZE_136]
+ tm->bits_per_symbol - 1) / tm->bits_per_symbol;
u32 data_tck = MAC_PAYLOAD_TCK (symb_nb, ctx->symbol_tck[tm->gil]);
- prep->flp_tck = times->pre_fcs_tck + data_tck + MAC_B2BIFS_TCK;
+ prep->flp_tck = ctx->times.pre_fcs_tck + data_tck + MAC_B2BIFS_TCK;
/* Does it fit? */
- if (times->pre_fcs_tck + data_tck + MAC_B2BIFS_TCK > access->duration_tck)
+ if (ctx->times.pre_fcs_tck + data_tck + MAC_B2BIFS_TCK
+ > access->duration_tck)
return;
/* Get beacon PB. */
pb_t *seg;
@@ -185,7 +184,7 @@ pbproc_prep_mpdu (pbproc_t *ctx)
ca_access_param_t *access;
mfs_tx_t *mfs;
pbproc_prep_mpdu_t *prep;
- pbproc_times_t *times;
+ pbproc_times_t * const times = &ctx->times;
uint access_duration_tck;
uint access_data_offset_tck;
/* Check inputs. */
@@ -201,7 +200,6 @@ pbproc_prep_mpdu (pbproc_t *ctx)
|| (mfs->common.bcast && mfs->common.tei == MAC_TEI_BCAST)));
prep = &ctx->prep_mpdu;
dbg_claim (!prep->valid);
- times = &ctx->times[access->hybrid];
/* Early return if removed MFS. */
if (mfs->ca_state == CA_MFS_STATE_REMOVED)
return;
diff --git a/cesar/mac/pbproc/test/pbproc/inc/test_pbproc.h b/cesar/mac/pbproc/test/pbproc/inc/test_pbproc.h
index 508d3e6bfe..f2610c0636 100644
--- a/cesar/mac/pbproc/test/pbproc/inc/test_pbproc.h
+++ b/cesar/mac/pbproc/test/pbproc/inc/test_pbproc.h
@@ -41,6 +41,17 @@ BEGIN_DECLS
void
test_pbproc_init (test_pbproc_t *ctx);
+/**
+ * Setup allocation in PBProc.
+ * \param ctx test context
+ * \param hybrid whether to use hybrid mode
+ *
+ * This is to be done by PBProc on activate or AIFS, but this is a shortcut
+ * for tests.
+ */
+void
+test_pbproc_alloc (test_pbproc_t *ctx, bool hybrid);
+
void
test_pbproc_uninit (test_pbproc_t *ctx);
diff --git a/cesar/mac/pbproc/test/pbproc/src/prep_mpdu.c b/cesar/mac/pbproc/test/pbproc/src/prep_mpdu.c
index 5d9ee6e484..a583efccee 100644
--- a/cesar/mac/pbproc/test/pbproc/src/prep_mpdu.c
+++ b/cesar/mac/pbproc/test/pbproc/src/prep_mpdu.c
@@ -132,6 +132,7 @@ prep_mpdu_test_f (test_t t, test_pbproc_t *tp, u32 date,
/* Encrypted? */
utils_prepare_encryption (tp, params->encrypted, !params->bcast, dtei, 0);
/* Setup an access. */
+ test_pbproc_alloc (tp, false);
ca_access_param_t *access = &tp->pbproc->access;
access->mfs = mfs;
access->access_date = date;
@@ -746,6 +747,7 @@ prep_beacon_test (test_t t, test_pbproc_t *tp, u32 date, bool prepared,
pbproc_mfs_beacon_prepare (tp->pbproc, mfs, pb, &params);
}
/* Setup an access. */
+ test_pbproc_alloc (tp, true);
ca_access_param_t *access = &tp->pbproc->access;
access->mfs = mfs;
access->access_date = date;
diff --git a/cesar/mac/pbproc/test/pbproc/src/rx_data.c b/cesar/mac/pbproc/test/pbproc/src/rx_data.c
index 4a3309cdc0..dc481ffb7c 100644
--- a/cesar/mac/pbproc/test/pbproc/src/rx_data.c
+++ b/cesar/mac/pbproc/test/pbproc/src/rx_data.c
@@ -393,6 +393,7 @@ rx_data_burst_test_f (test_t t, test_pbproc_t *tp,
else
ctx.window_size_encoded = MFS_RX_WINDOW_SIZE_DATA_DEFAULT_ENCODED;
/* Receive every MPDU. */
+ test_pbproc_alloc (tp, false);
for (mpdu_i = 0; mpdu_i < burst->mpdu_nb; mpdu_i++)
{
rx_data_burst_mpdu_t *m = &burst->mpdu[mpdu_i];
@@ -441,6 +442,7 @@ rx_beacon_test (test_t t, test_pbproc_t *tp, u32 date, uint symb_nb)
const uint pre_fc_fl_tck = MAC_PREAMBLE_HYBRID_TCK + MAC_FC_10_TCK
+ MAC_FC_AV_TCK + MAC_PAYLOAD_TCK (symb_nb, MAC_DX567_TCK)
+ MAC_B2BIFS_TCK;
+ test_pbproc_alloc (tp, true);
scenario_entry_t entries[] = {
SCENARIO_ACTION (phy_rx_fc, .rx_date = date, .rx_sysdate = date / 2,
.prp_won = false,
diff --git a/cesar/mac/pbproc/test/pbproc/src/test_pbproc.c b/cesar/mac/pbproc/test/pbproc/src/test_pbproc.c
index 567360286b..2892ca47b5 100644
--- a/cesar/mac/pbproc/test/pbproc/src/test_pbproc.c
+++ b/cesar/mac/pbproc/test/pbproc/src/test_pbproc.c
@@ -104,6 +104,15 @@ test_pbproc_init (test_pbproc_t *ctx)
pbproc_get_phy (ctx->pbproc);
ctx->ca = pbproc_get_ca (ctx->pbproc);
ctx->pbproc->activated = true;
+ test_pbproc_alloc (ctx, false);
+}
+
+void
+test_pbproc_alloc (test_pbproc_t *ctx, bool hybrid)
+{
+ dbg_assert (ctx);
+ ctx->pbproc->alloc.hybrid = hybrid;
+ ctx->pbproc->times = ctx->pbproc->times_array[hybrid];
ctx->pbproc->alloc.end_date = 0x80000000;
}
@@ -167,6 +176,35 @@ test_pbproc_init_suite (test_t t)
.tp = &ctx,
};
scenario_run (t, entries, &globals);
+ test_fail_unless (memcmp (&ctx.pbproc->times,
+ &ctx.pbproc->times_array[false],
+ sizeof (pbproc_times_t)) == 0);
+ test_pbproc_uninit (&ctx);
+ } test_end;
+ test_begin (t, "activate hybrid")
+ {
+ test_pbproc_init (&ctx);
+ ctx.pbproc->activated = false;
+ scenario_entry_t entries[] = {
+ SCENARIO_ACTION (pbproc_activate, .flag = true),
+ SCENARIO_EVENT (ca_access_activate, .date = 0,
+ .anticipation_tck = PBPROC_ANTICIP_TCK,
+ .coexistence_mode =
+ MAC_COEXISTENCE_FULL_HYBRID_MODE,
+ .snid = ctx.snid,
+ .hybrid = true, .nek_switch = 0),
+ SCENARIO_EVENT (phy_rx_param, .fc_mode = PHY_FC_MODE (true, 1)),
+ SCENARIO_EVENT (phy_rx_activate, .now = true,
+ .pre_detection = true),
+ SCENARIO_END
+ };
+ scenario_globals_t globals = {
+ .tp = &ctx,
+ };
+ scenario_run (t, entries, &globals);
+ test_fail_unless (memcmp (&ctx.pbproc->times,
+ &ctx.pbproc->times_array[true],
+ sizeof (pbproc_times_t)) == 0);
test_pbproc_uninit (&ctx);
} test_end;
test_begin (t, "aifs")
@@ -183,10 +221,11 @@ test_pbproc_init_suite (test_t t)
.pre_detection = false),
SCENARIO_EVENT (ca_backoff_cancel),
SCENARIO_EVENT (ca_access_aifs,
- .coexistence_mode = MAC_COEXISTENCE_AV_ONLY_MODE,
+ .coexistence_mode =
+ MAC_COEXISTENCE_FULL_HYBRID_MODE,
.snid = ctx.snid,
- .hybrid = false, .nek_switch = 0),
- SCENARIO_EVENT (phy_rx_param, .fc_mode = PHY_FC_MODE (false, 1)),
+ .hybrid = true, .nek_switch = 0),
+ SCENARIO_EVENT (phy_rx_param, .fc_mode = PHY_FC_MODE (true, 1)),
SCENARIO_END
};
scenario_globals_t globals = {
@@ -195,6 +234,9 @@ test_pbproc_init_suite (test_t t)
scenario_run (t, entries, &globals);
test_fail_unless (ctx.pbproc->fsm.current_state
== PBPROC_FSM_STATE_IDLE);
+ test_fail_unless (memcmp (&ctx.pbproc->times,
+ &ctx.pbproc->times_array[true],
+ sizeof (pbproc_times_t)) == 0);
test_pbproc_uninit (&ctx);
} test_end;
test_case_begin (t, "memory");
diff --git a/cesar/mac/pbproc/test/pbproc/src/tx_data.c b/cesar/mac/pbproc/test/pbproc/src/tx_data.c
index c79be98b23..f17f4cc59c 100644
--- a/cesar/mac/pbproc/test/pbproc/src/tx_data.c
+++ b/cesar/mac/pbproc/test/pbproc/src/tx_data.c
@@ -33,6 +33,7 @@ tx_data_test (test_t t, test_pbproc_t *tp, u32 date, uint mfs_seg_nb,
mfs_tx_t *mfs = utils_mfs_tx_prepare (false, false, lid, dtei,
mfs_seg_nb);
mfs->common.unassociated = unassociated;
+ test_pbproc_alloc (tp, false);
ca_access_param_t access = {
.mfs = mfs,
.access_date = date,
@@ -129,6 +130,7 @@ tx_data_woack_test (test_t t, test_pbproc_t *tp, u32 date, uint mfs_seg_nb,
const uint dtei = 0xff;
const uint beacon_tck = MAC_MS_TO_TCK (1000) / 50;
mfs_tx_t *mfs = utils_mfs_tx_prepare (true, false, lid, dtei, mfs_seg_nb);
+ test_pbproc_alloc (tp, false);
ca_access_param_t access = {
.mfs = mfs,
.access_date = date,
@@ -198,6 +200,7 @@ tx_data_noseg_test (test_t t, test_pbproc_t *tp, u32 date, uint duration_tck,
const uint beacon_tck = MAC_MS_TO_TCK (1000) / 50;
mfs_tx_t *mfs = utils_mfs_tx_prepare (false, false, lid, dtei,
0);
+ test_pbproc_alloc (tp, false);
ca_access_param_t access = {
.mfs = mfs,
.access_date = date,
@@ -257,6 +260,7 @@ tx_data_beacon_test (test_t t, test_pbproc_t *tp, u32 date, uint duration_tck,
{ 0x0123, 0x4242, 0xabab, 0x5555 }, pb->data + 123
};
pbproc_mfs_beacon_prepare (tp->pbproc, mfs, pb, &params);
+ test_pbproc_alloc (tp, true);
ca_access_param_t access = {
.mfs = mfs,
.access_date = date,
@@ -371,6 +375,7 @@ tx_data_cancel_test (test_t t, test_pbproc_t *tp, bool prp_won, bool rx_fc)
const uint date = 123456;
const uint beacon_tck = MAC_MS_TO_TCK (1000) / 50;
mfs_tx_t *mfs = utils_mfs_tx_prepare (false, false, lid, dtei, 1);
+ test_pbproc_alloc (tp, false);
ca_access_param_t access = {
.mfs = mfs,
.access_date = date,
diff --git a/cesar/mac/pbproc/test/pbproc/src/tx_sound.c b/cesar/mac/pbproc/test/pbproc/src/tx_sound.c
index 77562513a1..2647f6210f 100644
--- a/cesar/mac/pbproc/test/pbproc/src/tx_sound.c
+++ b/cesar/mac/pbproc/test/pbproc/src/tx_sound.c
@@ -40,6 +40,7 @@ tx_sound_test (test_t t, test_pbproc_t *tp)
utils_sta_prepare_default_tonemap (tp, true, dtei,
TONEMAP_INDEX_INITIAL_START, 0, 0,
NULL);
+ test_pbproc_alloc (tp, false);
ca_access_param_t access = {
.mfs = mfs,
.access_date = date,
@@ -145,6 +146,7 @@ tx_sound_cancel_test (test_t t, test_pbproc_t *tp, bool prp_won, bool rx_fc)
utils_sta_prepare_default_tonemap (tp, true, dtei,
TONEMAP_INDEX_INITIAL_START, 0, 0,
NULL);
+ test_pbproc_alloc (tp, false);
ca_access_param_t access = {
.mfs = mfs,
.access_date = date,