123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419 |
- #ifndef ZEPHYR_INCLUDE_NET_IEEE802154_RADIO_H_
- #define ZEPHYR_INCLUDE_NET_IEEE802154_RADIO_H_
- #include <device.h>
- #include <net/net_if.h>
- #include <net/net_pkt.h>
- #include <net/ieee802154.h>
- #ifdef __cplusplus
- extern "C" {
- #endif
- enum ieee802154_channel {
- IEEE802154_SUB_GHZ_CHANNEL_MIN = 0,
- IEEE802154_SUB_GHZ_CHANNEL_MAX = 10,
- IEEE802154_2_4_GHZ_CHANNEL_MIN = 11,
- IEEE802154_2_4_GHZ_CHANNEL_MAX = 26,
- };
- enum ieee802154_hw_caps {
- IEEE802154_HW_FCS = BIT(0),
- IEEE802154_HW_PROMISC = BIT(1),
- IEEE802154_HW_FILTER = BIT(2),
- IEEE802154_HW_CSMA = BIT(3),
- IEEE802154_HW_2_4_GHZ = BIT(4),
- IEEE802154_HW_TX_RX_ACK = BIT(5),
- IEEE802154_HW_SUB_GHZ = BIT(6),
- IEEE802154_HW_ENERGY_SCAN = BIT(7),
- IEEE802154_HW_TXTIME = BIT(8),
- IEEE802154_HW_SLEEP_TO_TX = BIT(9),
- IEEE802154_HW_TX_SEC = BIT(10),
- IEEE802154_HW_RXTIME = BIT(11),
- };
- enum ieee802154_filter_type {
- IEEE802154_FILTER_TYPE_IEEE_ADDR,
- IEEE802154_FILTER_TYPE_SHORT_ADDR,
- IEEE802154_FILTER_TYPE_PAN_ID,
- IEEE802154_FILTER_TYPE_SRC_IEEE_ADDR,
- IEEE802154_FILTER_TYPE_SRC_SHORT_ADDR,
- };
- enum ieee802154_event {
- IEEE802154_EVENT_TX_STARTED,
- IEEE802154_EVENT_RX_FAILED,
- IEEE802154_EVENT_SLEEP,
- };
- enum ieee802154_rx_fail_reason {
- IEEE802154_RX_FAIL_NOT_RECEIVED,
- IEEE802154_RX_FAIL_INVALID_FCS,
- IEEE802154_RX_FAIL_ADDR_FILTERED,
- IEEE802154_RX_FAIL_OTHER
- };
- typedef void (*energy_scan_done_cb_t)(const struct device *dev,
- int16_t max_ed);
- typedef void (*ieee802154_event_cb_t)(const struct device *dev,
- enum ieee802154_event evt,
- void *event_params);
- struct ieee802154_filter {
- union {
- uint8_t *ieee_addr;
- uint16_t short_addr;
- uint16_t pan_id;
- };
- };
- struct ieee802154_key {
- uint8_t *key_value;
- uint32_t key_frame_counter;
- bool frame_counter_per_key;
- uint8_t key_id_mode;
- uint8_t key_index;
- };
- enum ieee802154_tx_mode {
-
- IEEE802154_TX_MODE_DIRECT,
-
- IEEE802154_TX_MODE_CCA,
-
- IEEE802154_TX_MODE_CSMA_CA,
-
- IEEE802154_TX_MODE_TXTIME,
-
- IEEE802154_TX_MODE_TXTIME_CCA,
- };
- enum ieee802154_fpb_mode {
-
- IEEE802154_FPB_ADDR_MATCH_THREAD,
-
- IEEE802154_FPB_ADDR_MATCH_ZIGBEE,
- };
- enum ieee802154_config_type {
-
- IEEE802154_CONFIG_AUTO_ACK_FPB,
-
- IEEE802154_CONFIG_ACK_FPB,
-
- IEEE802154_CONFIG_PAN_COORDINATOR,
-
- IEEE802154_CONFIG_PROMISCUOUS,
-
- IEEE802154_CONFIG_EVENT_HANDLER,
-
- IEEE802154_CONFIG_MAC_KEYS,
-
- IEEE802154_CONFIG_FRAME_COUNTER,
-
- IEEE802154_CONFIG_RX_SLOT,
-
- IEEE802154_CONFIG_CSL_PERIOD,
-
- IEEE802154_CONFIG_CSL_RX_TIME,
-
- IEEE802154_CONFIG_ENH_ACK_HEADER_IE,
- };
- struct ieee802154_config {
-
- union {
-
- struct {
- bool enabled;
- enum ieee802154_fpb_mode mode;
- } auto_ack_fpb;
-
- struct {
- uint8_t *addr;
- bool extended;
- bool enabled;
- } ack_fpb;
-
- bool pan_coordinator;
-
- bool promiscuous;
-
- ieee802154_event_cb_t event_handler;
-
- struct ieee802154_key *mac_keys;
-
- uint32_t frame_counter;
-
- struct {
- uint8_t channel;
- uint32_t start;
- uint32_t duration;
- } rx_slot;
-
- uint32_t csl_period;
-
- uint32_t csl_rx_time;
-
- struct {
- const uint8_t *data;
- uint16_t data_len;
- uint16_t short_addr;
-
- const uint8_t *ext_addr;
- } ack_ie;
- };
- };
- struct ieee802154_radio_api {
-
- struct net_if_api iface_api;
-
- enum ieee802154_hw_caps (*get_capabilities)(const struct device *dev);
-
- int (*cca)(const struct device *dev);
-
- int (*set_channel)(const struct device *dev, uint16_t channel);
-
- int (*filter)(const struct device *dev,
- bool set,
- enum ieee802154_filter_type type,
- const struct ieee802154_filter *filter);
-
- int (*set_txpower)(const struct device *dev, int16_t dbm);
-
- int (*tx)(const struct device *dev, enum ieee802154_tx_mode mode,
- struct net_pkt *pkt, struct net_buf *frag);
-
- int (*start)(const struct device *dev);
-
- int (*stop)(const struct device *dev);
-
- int (*configure)(const struct device *dev,
- enum ieee802154_config_type type,
- const struct ieee802154_config *config);
-
- uint16_t (*get_subg_channel_count)(const struct device *dev);
-
- int (*ed_scan)(const struct device *dev,
- uint16_t duration,
- energy_scan_done_cb_t done_cb);
-
- uint64_t (*get_time)(const struct device *dev);
-
- uint8_t (*get_sch_acc)(const struct device *dev);
- };
- BUILD_ASSERT(offsetof(struct ieee802154_radio_api, iface_api) == 0);
- #define IEEE802154_AR_FLAG_SET (0x20)
- static inline bool ieee802154_is_ar_flag_set(struct net_buf *frag)
- {
- return (*frag->data & IEEE802154_AR_FLAG_SET);
- }
- extern enum net_verdict ieee802154_radio_handle_ack(struct net_if *iface,
- struct net_pkt *pkt);
- #ifndef CONFIG_IEEE802154_RAW_MODE
- void ieee802154_init(struct net_if *iface);
- #else
- #define ieee802154_init(_iface_)
- #endif
- #ifdef __cplusplus
- }
- #endif
- #endif
|