1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-12-28 16:01:18 +01:00

ieee802154/submac: wait SIFS period for soft ACK

This commit is contained in:
Fabian Hüßler 2025-10-22 20:10:05 +02:00
parent 99cceeff91
commit 2a32d82045

View File

@ -29,6 +29,17 @@
#define CSMA_SENDER_BACKOFF_PERIOD_UNIT_US (320U)
#define ACK_TIMEOUT_US (864U)
/* 2.4 GHz, 250 kb/s, O-QPSK 62.5 ksymbols/s, 1 / 62 500 s = 16 µs */
/* 12 symbols -> 12 * 16us = 192us */
#define SIFS_PERIOD_US (192U)
/* internal type for IEEE 802.15.4 frame control field */
enum ieee802154_fcf {
_FCF_BEACON = IEEE802154_FCF_TYPE_BEACON,
_FCF_DATA = IEEE802154_FCF_TYPE_DATA,
_FCF_ACK = IEEE802154_FCF_TYPE_ACK,
_FCF_MACCMD = IEEE802154_FCF_TYPE_MACCMD
};
static char *str_states[IEEE802154_FSM_STATE_NUMOF] = {
"INVALID",
@ -131,7 +142,8 @@ static int _handle_fsm_ev_request_tx(ieee802154_submac_t *submac)
}
static ieee802154_fsm_state_t _fsm_state_prepare(ieee802154_submac_t *submac,
ieee802154_fsm_ev_t ev);
ieee802154_fsm_ev_t ev,
enum ieee802154_fcf ftype);
static ieee802154_fsm_state_t _fsm_state_tx(ieee802154_submac_t *submac,
ieee802154_fsm_ev_t ev);
@ -149,7 +161,7 @@ static int _handle_fsm_ev_tx_ack(ieee802154_submac_t *submac)
return res;
}
/* skip async Tx request */
_fsm_state_prepare(submac, IEEE802154_FSM_EV_BH);
_fsm_state_prepare(submac, IEEE802154_FSM_EV_BH, IEEE802154_FCF_TYPE_ACK);
/* wait for Tx done */
while (_fsm_state_tx(submac, IEEE802154_FSM_EV_TX_DONE) == IEEE802154_FSM_STATE_INVALID) {
DEBUG("IEEE802154 submac: wait until ACK sent\n");
@ -254,13 +266,15 @@ static ieee802154_fsm_state_t _fsm_state_idle(ieee802154_submac_t *submac, ieee8
}
static ieee802154_fsm_state_t _fsm_state_prepare(ieee802154_submac_t *submac,
ieee802154_fsm_ev_t ev)
ieee802154_fsm_ev_t ev,
enum ieee802154_fcf ftype)
{
ieee802154_dev_t *dev = &submac->dev;
switch (ev) {
case IEEE802154_FSM_EV_BH:
if (!_does_handle_csma(dev)) {
if (ftype == IEEE802154_FCF_TYPE_DATA
&& !_does_handle_csma(dev)) {
/* delay for an adequate random backoff period */
uint32_t bp = (random_uint32() & submac->backoff_mask) *
submac->csma_backoff_us;
@ -272,6 +286,10 @@ static ieee802154_fsm_state_t _fsm_state_prepare(ieee802154_submac_t *submac,
submac->backoff_mask = (submac->backoff_mask << 1) | 1;
}
}
else if (ftype == IEEE802154_FCF_TYPE_ACK) {
/* no backoff for ACK frames but wait for SIFSPeriod */
ztimer_sleep(ZTIMER_USEC, SIFS_PERIOD_US);
}
while (ieee802154_radio_request_transmit(dev) == -EBUSY) {}
return IEEE802154_FSM_STATE_TX;
@ -423,7 +441,7 @@ ieee802154_fsm_state_t ieee802154_submac_process_ev(ieee802154_submac_t *submac,
break;
case IEEE802154_FSM_STATE_PREPARE:
DEBUG("IEEE802154 submac: ieee802154_submac_process_ev(): IEEE802154_FSM_STATE_PREPARE + %s\n", str_ev[ev]);
new_state = _fsm_state_prepare(submac, ev);
new_state = _fsm_state_prepare(submac, ev, IEEE802154_FCF_TYPE_DATA);
break;
case IEEE802154_FSM_STATE_TX:
DEBUG("IEEE802154 submac: ieee802154_submac_process_ev(): IEEE802154_FSM_STATE_TX + %s\n", str_ev[ev]);