Loading...
Searching...
No Matches
submac.h
1/*
2 * SPDX-FileCopyrightText: 2020 HAW Hamburg
3 * SPDX-License-Identifier: LGPL-2.1-only
4 */
5
6#pragma once
7
106
107#ifdef __cplusplus
108extern "C" {
109#endif
110
111#include <stdio.h>
112#include <string.h>
113#include "assert.h"
114
115#include "net/ieee802154.h"
116#include "net/ieee802154/radio.h"
117
122
126typedef struct {
140 void (*rx_done)(ieee802154_submac_t *submac);
153 void (*tx_done)(ieee802154_submac_t *submac, int status,
156
169
184
209
226
237 const network_uint16_t *short_addr)
238{
239 int res = ieee802154_radio_config_addr_filter(&submac->dev,
241 short_addr);
242
243 if (res >= 0) {
244 memcpy(&submac->short_addr, short_addr, IEEE802154_SHORT_ADDRESS_LEN);
245 }
246
247 return res;
248}
249
260 const eui64_t *ext_addr)
261{
262 int res = ieee802154_radio_config_addr_filter(&submac->dev,
264 ext_addr);
265
266 if (res >= 0) {
267 memcpy(&submac->ext_addr, ext_addr, IEEE802154_LONG_ADDRESS_LEN);
268 }
269 return res;
270}
271
282 const uint16_t *panid)
283{
284 int res = ieee802154_radio_config_addr_filter(&submac->dev,
286 panid);
287
288 if (res >= 0) {
289 submac->panid = *panid;
290 }
291
292 return res;
293}
294
303 ieee802154_submac_t *submac)
304{
305 return submac->phy_mode;
306}
307
322
339 uint16_t channel_num)
340{
341 const ieee802154_phy_conf_t conf = {
342 .phy_mode = IEEE802154_PHY_NO_OP,
343 .channel = channel_num,
344 .page = submac->channel_page,
345 .pow = submac->tx_pow,
346 };
347
348 return ieee802154_set_phy_conf(submac, &conf);
349}
350
367 uint16_t channel_page)
368{
369 const ieee802154_phy_conf_t conf = {
370 .phy_mode = IEEE802154_PHY_NO_OP,
371 .channel = submac->channel_num,
372 .page = channel_page,
373 .pow = submac->tx_pow,
374 };
375
376 return ieee802154_set_phy_conf(submac, &conf);
377}
378
395 int8_t tx_pow)
396{
397 const ieee802154_phy_conf_t conf = {
398 .phy_mode = IEEE802154_PHY_NO_OP,
399 .channel = submac->channel_num,
400 .page = submac->channel_page,
401 .pow = tx_pow,
402 };
403
404 return ieee802154_set_phy_conf(submac, &conf);
405}
406
418{
419 return ieee802154_radio_len(&submac->dev);
420}
421
438static inline int ieee802154_read_frame(ieee802154_submac_t *submac, void *buf,
439 size_t len, ieee802154_rx_info_t *info)
440{
441 return ieee802154_radio_read(&submac->dev, buf, len, info);
442}
443
457
470
480{
481 return submac->fsm_state == IEEE802154_FSM_STATE_RX;
482}
483
493{
494 return submac->fsm_state == IEEE802154_FSM_STATE_IDLE;
495}
496
510 const eui64_t *ext_addr);
511
520
529
538
551
567
577
587
597
607
608#ifdef __cplusplus
609}
610#endif
611
POSIX.1-2008 compliant version of the assert macro.
be_uint16_t network_uint16_t
A 16 bit integer in network byte order.
Definition byteorder.h:104
static int ieee802154_radio_read(ieee802154_dev_t *dev, void *buf, size_t size, ieee802154_rx_info_t *info)
Shortcut to ieee802154_radio_ops::read.
Definition radio.h:930
struct ieee802154_dev ieee802154_dev_t
Forward declaration of the IEEE802.15.4 device descriptor.
Definition radio.h:404
static int ieee802154_radio_len(ieee802154_dev_t *dev)
Shortcut to ieee802154_radio_ops::len.
Definition radio.h:914
static int ieee802154_radio_config_addr_filter(ieee802154_dev_t *dev, ieee802154_af_cmd_t cmd, const void *value)
Shortcut to ieee802154_radio_ops::config_addr_filter.
Definition radio.h:1025
@ IEEE802154_AF_EXT_ADDR
Set extended IEEE 802.15.4 address (eui64_t)
Definition radio.h:336
@ IEEE802154_AF_SHORT_ADDR
Set short IEEE 802.15.4 address (network_uint16_t)
Definition radio.h:335
@ IEEE802154_AF_PANID
Set PAN ID (uint16_t)
Definition radio.h:337
#define IEEE802154_SHORT_ADDRESS_LEN
IEEE 802.15.4 address lengths.
Definition ieee802154.h:41
ieee802154_phy_mode_t
802.15.4 PHY modes
Definition ieee802154.h:192
#define IEEE802154_LONG_ADDRESS_LEN
long address (EUI-64)
Definition ieee802154.h:42
@ IEEE802154_PHY_NO_OP
don't change PHY configuration
Definition ieee802154.h:201
ieee802154_fsm_state_t
Internal SubMAC FSM state machine states.
Definition submac.h:160
static int ieee802154_get_frame_length(ieee802154_submac_t *submac)
Get the received frame length.
Definition submac.h:417
void ieee802154_submac_ack_timer_cancel(ieee802154_submac_t *submac)
Cancel the ACK timeout timer.
static int ieee802154_set_channel_page(ieee802154_submac_t *submac, uint16_t channel_page)
Set IEEE 802.15.4 channel page.
Definition submac.h:366
struct ieee802154_submac ieee802154_submac_t
IEEE 802.15.4 SubMAC forward declaration.
Definition submac.h:121
int ieee802154_send(ieee802154_submac_t *submac, const iolist_t *iolist)
Transmit an IEEE 802.15.4 PSDU.
ieee802154_fsm_state_t ieee802154_submac_process_ev(ieee802154_submac_t *submac, ieee802154_fsm_ev_t ev)
Process an FSM event.
static void ieee802154_submac_tx_done_cb(ieee802154_submac_t *submac)
Indicate the SubMAC that the device finished the transmission procedure.
Definition submac.h:603
void ieee802154_submac_ack_timer_set(ieee802154_submac_t *submac)
Set the ACK timeout timer.
static int ieee802154_set_short_addr(ieee802154_submac_t *submac, const network_uint16_t *short_addr)
Set the IEEE 802.15.4 short address.
Definition submac.h:236
static bool ieee802154_submac_state_is_rx(ieee802154_submac_t *submac)
Check whether the SubMAC is in RX state.
Definition submac.h:479
int ieee802154_submac_init(ieee802154_submac_t *submac, const network_uint16_t *short_addr, const eui64_t *ext_addr)
Init the IEEE 802.15.4 SubMAC.
static int ieee802154_set_ext_addr(ieee802154_submac_t *submac, const eui64_t *ext_addr)
Set the IEEE 802.15.4 extended address.
Definition submac.h:259
static int ieee802154_set_channel_number(ieee802154_submac_t *submac, uint16_t channel_num)
Set IEEE 802.15.4 channel number.
Definition submac.h:338
int ieee802154_set_phy_conf(ieee802154_submac_t *submac, const ieee802154_phy_conf_t *conf)
Set IEEE 802.15.4 PHY configuration (channel, TX power)
ieee802154_fsm_ev_t
Internal SubMAC FSM state machine events.
Definition submac.h:173
static void ieee802154_submac_bh_process(ieee802154_submac_t *submac)
Indicate the SubMAC that the BH should process an internal event.
Definition submac.h:573
static bool ieee802154_submac_state_is_idle(ieee802154_submac_t *submac)
Check whether the SubMAC is in IDLE state.
Definition submac.h:492
int ieee802154_set_rx(ieee802154_submac_t *submac)
Set the SubMAC to RX state.
void ieee802154_submac_bh_request(ieee802154_submac_t *submac)
ieee802154_submac_bh_process should be called as soon as possible.
int ieee802154_set_idle(ieee802154_submac_t *submac)
Set the SubMAC to IDLE state.
static ieee802154_phy_mode_t ieee802154_get_phy_mode(ieee802154_submac_t *submac)
Get IEEE 802.15.4 PHY mode.
Definition submac.h:302
static int ieee802154_set_tx_power(ieee802154_submac_t *submac, int8_t tx_pow)
Set IEEE 802.15.4 transmission power.
Definition submac.h:394
static int ieee802154_read_frame(ieee802154_submac_t *submac, void *buf, size_t len, ieee802154_rx_info_t *info)
Read the received frame.
Definition submac.h:438
static void ieee802154_submac_ack_timeout_fired(ieee802154_submac_t *submac)
Indicate the SubMAC that the ACK timeout fired.
Definition submac.h:563
static int ieee802154_set_panid(ieee802154_submac_t *submac, const uint16_t *panid)
Set the IEEE 802.15.4 PAN ID.
Definition submac.h:281
static void ieee802154_submac_rx_done_cb(ieee802154_submac_t *submac)
Indicate the SubMAC that the device received a frame.
Definition submac.h:583
static void ieee802154_submac_crc_error_cb(ieee802154_submac_t *submac)
Indicate the SubMAC that a frame with invalid CRC was received.
Definition submac.h:593
@ IEEE802154_FSM_STATE_IDLE
The transceiver is off.
Definition submac.h:163
@ IEEE802154_FSM_STATE_NUMOF
Number of SubMAC FSM states.
Definition submac.h:167
@ IEEE802154_FSM_STATE_INVALID
Invalid state.
Definition submac.h:161
@ IEEE802154_FSM_STATE_PREPARE
The SubMAC is preparing the next transmission.
Definition submac.h:164
@ IEEE802154_FSM_STATE_TX
The SubMAC is currently transmitting a frame.
Definition submac.h:165
@ IEEE802154_FSM_STATE_RX
SubMAC is ready to receive frames.
Definition submac.h:162
@ IEEE802154_FSM_STATE_WAIT_FOR_ACK
The SubMAC is waiting for an ACK frame.
Definition submac.h:166
@ IEEE802154_FSM_EV_BH
The Bottom Half should process an event.
Definition submac.h:178
@ IEEE802154_FSM_EV_ACK_TIMEOUT
ACK timer fired.
Definition submac.h:177
@ IEEE802154_FSM_EV_CRC_ERROR
Radio reports frame was received but CRC failed.
Definition submac.h:176
@ IEEE802154_FSM_EV_REQUEST_TX
The upper layer requested to transmit a frame.
Definition submac.h:179
@ IEEE802154_FSM_EV_TX_DONE
Radio reports frame was sent.
Definition submac.h:174
@ IEEE802154_FSM_EV_REQUEST_SET_IDLE
The upper layer requested to go to IDLE.
Definition submac.h:181
@ IEEE802154_FSM_EV_NUMOF
Number of SubMAC FSM events.
Definition submac.h:182
@ IEEE802154_FSM_EV_RX_DONE
Radio reports frame was received.
Definition submac.h:175
@ IEEE802154_FSM_EV_REQUEST_SET_RX_ON
The upper layer requested to go to RX.
Definition submac.h:180
struct iolist iolist_t
iolist forward declaration
Definition iolist.h:30
CSMA-CA exponential backoff parameters.
Definition radio.h:374
Holder of the PHY configuration.
Definition radio.h:458
RX information associated to a frame.
Definition radio.h:382
IEEE 802.15.4 SubMAC callbacks.
Definition submac.h:126
void(* tx_done)(ieee802154_submac_t *submac, int status, ieee802154_tx_info_t *info)
TX done event.
Definition submac.h:153
void(* rx_done)(ieee802154_submac_t *submac)
RX done event.
Definition submac.h:140
IEEE 802.15.4 SubMAC descriptor.
Definition submac.h:188
uint8_t backoff_mask
internal value used for random backoff calculation
Definition submac.h:202
uint8_t csma_retries_nb
current number of CSMA-CA retries
Definition submac.h:201
const ieee802154_submac_cb_t * cb
pointer to the SubMAC callbacks
Definition submac.h:192
eui64_t ext_addr
IEEE 802.15.4 extended address.
Definition submac.h:190
const iolist_t * psdu
stores the current PSDU
Definition submac.h:207
uint16_t csma_backoff_us
CSMA sender backoff period in µs.
Definition submac.h:196
int8_t tx_pow
Transmission power (in dBm)
Definition submac.h:204
network_uint16_t short_addr
IEEE 802.15.4 short address.
Definition submac.h:191
uint8_t retrans
current number of retransmissions
Definition submac.h:200
bool wait_for_ack
SubMAC is waiting for an ACK frame.
Definition submac.h:194
uint8_t channel_page
IEEE 802.15.4 channel page.
Definition submac.h:199
uint16_t channel_num
IEEE 802.15.4 channel number.
Definition submac.h:198
uint16_t ack_timeout_us
ACK timeout in µs.
Definition submac.h:195
ieee802154_phy_mode_t phy_mode
IEEE 802.15.4 PHY mode.
Definition submac.h:206
ieee802154_csma_be_t be
CSMA-CA backoff exponent params.
Definition submac.h:193
ieee802154_fsm_state_t fsm_state
State of the SubMAC.
Definition submac.h:205
ieee802154_dev_t dev
802.15.4 HAL descriptor
Definition submac.h:189
uint8_t csma_retries
maximum number of CSMA-CA retries
Definition submac.h:203
uint16_t panid
IEEE 802.15.4 PAN ID.
Definition submac.h:197
TX information of the last transmitted frame.
Definition radio.h:396
iolist structure definition
Definition iolist.h:35
IEEE 802.15.4 header definitions.
Data type to represent an EUI-64.
Definition eui64.h:52