From ea0ea6d056895b43692dce5c967ec21d298833bf Mon Sep 17 00:00:00 2001 From: schodet Date: Mon, 12 Apr 2010 14:54:56 +0000 Subject: cesar/mac/pbproc: prepare timings on allocation entry, closes #1436 git-svn-id: svn+ssh://pessac/svn/cesar/trunk@6913 017c9cb6-072f-447c-8318-d5b54f68fe89 --- cesar/mac/pbproc/inc/context.h | 4 ++- cesar/mac/pbproc/src/fsm_handle_fc.c | 17 ++++----- cesar/mac/pbproc/src/fsm_rx_beacon.c | 3 +- cesar/mac/pbproc/src/fsm_rx_data.c | 18 ++++------ cesar/mac/pbproc/src/fsm_rx_sound.c | 12 +++---- cesar/mac/pbproc/src/fsm_top.c | 5 +-- cesar/mac/pbproc/src/fsm_tx_data.c | 15 +++----- cesar/mac/pbproc/src/fsm_tx_rts_cts.c | 10 +++--- cesar/mac/pbproc/src/fsm_tx_sound.c | 6 ++-- cesar/mac/pbproc/src/pbproc.c | 3 +- cesar/mac/pbproc/src/prep_mpdu.c | 10 +++--- cesar/mac/pbproc/test/pbproc/inc/test_pbproc.h | 11 ++++++ cesar/mac/pbproc/test/pbproc/src/prep_mpdu.c | 2 ++ cesar/mac/pbproc/test/pbproc/src/rx_data.c | 2 ++ cesar/mac/pbproc/test/pbproc/src/test_pbproc.c | 48 ++++++++++++++++++++++++-- cesar/mac/pbproc/test/pbproc/src/tx_data.c | 5 +++ cesar/mac/pbproc/test/pbproc/src/tx_sound.c | 2 ++ 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, ¶ms); } /* 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, ¶ms); + 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, -- cgit v1.2.3