/** * \brief Starts software-controlled CSMA. */ static void csma_start(void) { /* Initialize CSMA variables */ NB = 0; BE = tal_pib.MinBE; /* Start backoff timer to trigger CCA */ start_backoff(); }
/** * @brief Continues CSMA; handles next CSMA retry. * * @param trx_id Transceiver identifier */ void csma_continue(trx_id_t trx_id) { NB[trx_id]++; if (NB[trx_id] > tal_pib[trx_id].MaxCSMABackoffs) { tx_done_handling(trx_id, MAC_CHANNEL_ACCESS_FAILURE); } else { BE[trx_id]++; if (BE[trx_id] > tal_pib[trx_id].MaxBE) { BE[trx_id] = tal_pib[trx_id].MaxBE; } /* Start backoff timer to trigger CCA */ start_backoff(trx_id); } }
/* * \brief Continues CSMA; handles next CSMA retry. */ void csma_continue(void) { NB++; if (NB > tal_pib.MaxCSMABackoffs) { trx_trac_status = TRAC_CHANNEL_ACCESS_FAILURE; tal_state = TAL_TX_DONE; set_trx_state(CMD_RX_AACK_ON); } else { BE++; if (BE > tal_pib.MaxBE) { BE = tal_pib.MaxBE; } /* Start backoff timer to trigger CCA */ start_backoff(); } }
/** * @brief Starts software-controlled CSMA. * * @param trx_id Transceiver identifier */ void csma_start(trx_id_t trx_id) { /* Initialize CSMA variables */ NB[trx_id] = 0; BE[trx_id] = tal_pib[trx_id].MinBE; if (BE[trx_id] == 0) { /* Collision avoidance is disabled during first iteration */ #ifdef SUPPORT_MODE_SWITCH if (tal_pib[trx_id].ModeSwitchEnabled) { tx_ms_ppdu(trx_id); } else #endif { transmit_frame(trx_id, NO_CCA); } } else { /* Start backoff timer to trigger CCA */ start_backoff(trx_id); } }