/* Maria project {{{ * * Copyright (C) 2007 Spidcom * * <<>> * * }}} */ /** * \file mac/pbproc/src/fsm_tx_sound.c * \brief FSM TX SOUND part. * \ingroup mac_pbproc */ #include "common/std.h" #include "inc/context.h" #include "inc/fc.h" #include "inc/fsm_top.h" #include "inc/fsm_handle_fc.h" #include "inc/prep_mpdu.h" #include "inc/pbproc.h" #include "inc/fsm_tx_sound.h" void pbproc_ftso_init (pbproc_t *ctx) { dbg_assert (ctx); ctx->fsm.states[PBPROC_FSM_STATE_TX_SOUND_WAIT_ACK].rx_fc_cb = pbproc_ftso__tx_sound_wait_ack__rx_fc; ctx->fsm.states[PBPROC_FSM_STATE_TX_SOUND_WAIT_ACK].access_cb = pbproc_ftso__tx_sound_wait_ack__access; } void ARCH_ILRAM pbproc_ftso__handle (pbproc_t *ctx) { dbg_claim (ctx); if (PHY_FC_MODE_IS_HYBRID (ctx->prep_mpdu.fc_mode)) phy_tx_fc10 (ctx->phy, ctx->prep_mpdu.tx_date, ctx->prep_mpdu.fc10); phy_tx_param_sound (ctx->phy, ctx->prep_mpdu.fc_mode, 1, ctx->prep_mpdu.mod, ctx->prep_mpdu.fecrate, ctx->prep_mpdu.pb_size, ctx->prep_mpdu.gil); bool prp = ctx->access.prp && !ctx->prep_mpdu.rts_cts; 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); 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); } void ARCH_ILRAM 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 && fc_av->generic.dt_av == PBPROC_FC_DT_SOUND && fc_av->generic.access == false && fc_av->generic.snid == ctx->alloc.snid && fc_av->sound.saf == true && fc_av->sound.stei == prep->dtei && fc_av->sound.dtei == prep->stei && less_mod2p32 (rx_date, prep->tx_date + prep->flp_tck + MAC_TOLERANCE_TCK)) { phy_rx_prepare_short (ctx->phy); /* Handle acknowledgement. */ pbproc_prep_mpdu_sound_ack (ctx, fc_av->sound.scf); /* Next. */ if (!ctx->access.cfp) { ca_backoff_success (ctx->ca); ca_access_vcs_restart (ctx->ca, rx_date, times->pre_fcs_tck + MAC_CIFS_TCK, PBPROC_ANTICIP_TCK, false); pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_IDLE); } else { //handle_access (); } } else { /* Cancel transmission. */ pbproc_prep_mpdu_sound_ack (ctx, false); /* Update backoff. */ pbproc_backoff_lost (ctx); /* Handle FC. */ pbproc_fhfc_handle_fc (ctx, rx_date, fc_av); } } void ARCH_ILRAM pbproc_ftso__tx_sound_wait_ack__access (pbproc_t *ctx) { dbg_claim (ctx); /* Cancel transmission. */ pbproc_prep_mpdu_sound_ack (ctx, false); /* Update backoff. */ pbproc_backoff_lost (ctx); /* Handle ACCESS. */ pbproc_ftop__idle__access (ctx); }