LCOV - code coverage report
Current view: top level - zephyr/net - ieee802154_radio.h Coverage Total Hit
Test: new.info Lines: 97.1 % 104 101
Test Date: 2025-09-05 22:20:39

            Line data    Source code
       1            1 : /*
       2              :  * Copyright (c) 2016 Intel Corporation.
       3              :  * Copyright (c) 2023 F. Grandel, Zephyr Project
       4              :  *
       5              :  * SPDX-License-Identifier: Apache-2.0
       6              :  */
       7              : 
       8              : /**
       9              :  * @file
      10              :  * @brief Public IEEE 802.15.4 Driver API
      11              :  *
      12              :  * @note All references to the standard in this file cite IEEE 802.15.4-2020.
      13              :  */
      14              : 
      15              : #ifndef ZEPHYR_INCLUDE_NET_IEEE802154_RADIO_H_
      16              : #define ZEPHYR_INCLUDE_NET_IEEE802154_RADIO_H_
      17              : 
      18              : #include <zephyr/device.h>
      19              : #include <zephyr/net/net_if.h>
      20              : #include <zephyr/net/net_pkt.h>
      21              : #include <zephyr/net/net_time.h>
      22              : #include <zephyr/net/ieee802154.h>
      23              : #include <zephyr/net/ieee802154_ie.h>
      24              : #include <zephyr/sys/util.h>
      25              : 
      26              : #ifdef __cplusplus
      27              : extern "C" {
      28              : #endif
      29              : 
      30              : /**
      31              :  * @defgroup ieee802154_driver IEEE 802.15.4 Drivers
      32              :  * @since 1.0
      33              :  * @version 0.8.0
      34              :  * @ingroup ieee802154
      35              :  *
      36              :  * @brief IEEE 802.15.4 driver API
      37              :  *
      38              :  * @details This API provides a common representation of vendor-specific
      39              :  * hardware and firmware to the native IEEE 802.15.4 L2 and OpenThread stacks.
      40              :  * **Application developers should never interface directly with this API.** It
      41              :  * is of interest to driver maintainers only.
      42              :  *
      43              :  * The IEEE 802.15.4 driver API consists of two separate parts:
      44              :  *    - a basic, mostly PHY-level driver API to be implemented by all drivers,
      45              :  *    - several optional MAC-level extension points to offload performance
      46              :  *      critical or timing sensitive aspects at MAC level to the driver hardware
      47              :  *      or firmware ("hard" MAC).
      48              :  *
      49              :  * Implementing the basic driver API will ensure integration with the native L2
      50              :  * stack as well as basic support for OpenThread. Depending on the hardware,
      51              :  * offloading to vendor-specific hardware or firmware features may be required
      52              :  * to achieve full compliance with the Thread protocol or IEEE 802.15.4
      53              :  * subprotocols (e.g. fast enough ACK packages, precise timing of timed TX/RX in
      54              :  * the TSCH or CSL subprotocols).
      55              :  *
      56              :  * Whether or not MAC-level offloading extension points need to be implemented
      57              :  * is to be decided by individual driver maintainers. Upper layers SHOULD
      58              :  * provide a "soft" MAC fallback whenever possible.
      59              :  *
      60              :  * @note All section, table and figure references are to the IEEE 802.15.4-2020
      61              :  * standard.
      62              :  *
      63              :  * @{
      64              :  */
      65              : 
      66              : /**
      67              :  * @name IEEE 802.15.4-2020, Section 6: MAC functional description
      68              :  * @{
      69              :  */
      70              : 
      71              : /**
      72              :  * The symbol period (and therefore symbol rate) is defined in section 6.1: "Some
      73              :  * of the timing parameters in definition of the MAC are in units of PHY symbols.
      74              :  * For PHYs that have multiple symbol periods, the duration to be used for the
      75              :  * MAC parameters is defined in that PHY clause."
      76              :  *
      77              :  * This is not necessarily the true physical symbol period, so take care to use
      78              :  * this macro only when either the symbol period used for MAC timing is the same
      79              :  * as the physical symbol period or if you actually mean the MAC timing symbol
      80              :  * period.
      81              :  *
      82              :  * PHY specific symbol periods are defined in PHY specific sections below.
      83              :  */
      84            1 : #define IEEE802154_PHY_SYMBOLS_PER_SECOND(symbol_period_ns) (NSEC_PER_SEC / symbol_period_ns)
      85              : 
      86              : /** @} */
      87              : 
      88              : 
      89              : /**
      90              :  * @name IEEE 802.15.4-2020, Section 8: MAC services
      91              :  * @{
      92              :  */
      93              : 
      94              : /**
      95              :  * The number of PHY symbols forming a superframe slot when the superframe order
      96              :  * is equal to zero, see sections 8.4.2, table 8-93, aBaseSlotDuration and
      97              :  * section 6.2.1.
      98              :  */
      99            1 : #define IEEE802154_MAC_A_BASE_SLOT_DURATION 60U
     100              : 
     101              : /**
     102              :  * The number of slots contained in any superframe, see section 8.4.2,
     103              :  * table 8-93, aNumSuperframeSlots.
     104              :  */
     105            1 : #define IEEE802154_MAC_A_NUM_SUPERFRAME_SLOTS 16U
     106              : 
     107              : /**
     108              :  * The number of PHY symbols forming a superframe when the superframe order is
     109              :  * equal to zero, see section 8.4.2, table 8-93, aBaseSuperframeDuration.
     110              :  */
     111            1 : #define IEEE802154_MAC_A_BASE_SUPERFRAME_DURATION                                                  \
     112              :         (IEEE802154_MAC_A_BASE_SLOT_DURATION * IEEE802154_MAC_A_NUM_SUPERFRAME_SLOTS)
     113              : 
     114              : /**
     115              :  * MAC PIB attribute aUnitBackoffPeriod, see section 8.4.2, table 8-93, in symbol
     116              :  * periods, valid for all PHYs except SUN PHY in the 920 MHz band.
     117              :  */
     118            1 : #define IEEE802154_MAC_A_UNIT_BACKOFF_PERIOD(turnaround_time)                                      \
     119              :         (turnaround_time + IEEE802154_PHY_A_CCA_TIME)
     120              : 
     121              : /**
     122              :  * Default macResponseWaitTime in multiples of aBaseSuperframeDuration as
     123              :  * defined in section 8.4.3.1, table 8-94.
     124              :  */
     125            1 : #define IEEE802154_MAC_RESPONSE_WAIT_TIME_DEFAULT 32U
     126              : 
     127              : /** @} */
     128              : 
     129              : 
     130              : /**
     131              :  * @name IEEE 802.15.4-2020, Section 10: General PHY requirements
     132              :  * @{
     133              :  */
     134              : 
     135              : /**
     136              :  * @brief PHY channel pages, see section 10.1.3
     137              :  *
     138              :  * @details A device driver must support the mandatory channel pages, frequency
     139              :  * bands and channels of at least one IEEE 802.15.4 PHY.
     140              :  *
     141              :  * Channel page and number assignments have developed over several versions of
     142              :  * the standard and are not particularly well documented. Therefore some notes
     143              :  * about peculiarities of channel pages and channel numbering:
     144              :  * - The 2006 version of the standard had a read-only phyChannelsSupported PHY
     145              :  *   PIB attribute that represented channel page/number combinations as a
     146              :  *   bitmap. This attribute was removed in later versions of the standard as the
     147              :  *   number of channels increased beyond what could be represented by a bit map.
     148              :  *   That's the reason why it was decided to represent supported channels as a
     149              :  *   combination of channel pages and ranges instead.
     150              :  * - In the 2020 version of the standard, 13 channel pages are explicitly
     151              :  *   defined, but up to 32 pages could in principle be supported. This was a
     152              :  *   hard requirement in the 2006 standard. In later standards it is implicit
     153              :  *   from field specifications, e.g. the MAC PIB attribute macChannelPage
     154              :  *   (section 8.4.3.4, table 8-100) or channel page fields used in the SRM
     155              :  *   protocol (see section 8.2.26.5).
     156              :  * - ASK PHY (channel page one) was deprecated in the 2015 version of the
     157              :  *   standard. The 2020 version of the standard is a bit ambivalent whether
     158              :  *   channel page one disappeared as well or should be interpreted as O-QPSK now
     159              :  *   (see section 10.1.3.3). In Zephyr this ambivalence is resolved by
     160              :  *   deprecating channel page one.
     161              :  * - For some PHYs the standard doesn't clearly specify a channel page, namely
     162              :  *   the GFSK, RS-GFSK, CMB and TASK PHYs. These are all rather new and left out
     163              :  *   in our list as long as no driver wants to implement them.
     164              :  *
     165              :  * @warning The bit numbers are not arbitrary but represent the channel
     166              :  * page numbers as defined by the standard. Therefore do not change the
     167              :  * bit numbering.
     168              :  */
     169            1 : enum ieee802154_phy_channel_page {
     170              :         /**
     171              :          * Channel page zero supports the 2.4G channels of the O-QPSK PHY and
     172              :          * all channels from the BPSK PHYs initially defined in the 2003
     173              :          * editions of the standard. For channel page zero, 16 channels are
     174              :          * available in the 2450 MHz band (channels 11-26, O-QPSK), 10 in the
     175              :          * 915 MHz band (channels 1-10, BPSK), and 1 in the 868 MHz band
     176              :          * (channel 0, BPSK).
     177              :          *
     178              :          * You can retrieve the channels supported by a specific driver on this
     179              :          * page via @ref IEEE802154_ATTR_PHY_SUPPORTED_CHANNEL_RANGES attribute.
     180              :          *
     181              :          * see section 10.1.3.3
     182              :          */
     183              :         IEEE802154_ATTR_PHY_CHANNEL_PAGE_ZERO_OQPSK_2450_BPSK_868_915 = BIT(0),
     184              : 
     185              :         /** Formerly ASK PHY - deprecated in IEEE 802.15.4-2015 */
     186              :         IEEE802154_ATTR_PHY_CHANNEL_PAGE_ONE_DEPRECATED = BIT(1),
     187              : 
     188              :         /** O-QPSK PHY - 868 MHz and 915 MHz bands, see section 10.1.3.3 */
     189              :         IEEE802154_ATTR_PHY_CHANNEL_PAGE_TWO_OQPSK_868_915 = BIT(2),
     190              : 
     191              :         /** CSS PHY - 2450 MHz band, see section 10.1.3.4 */
     192              :         IEEE802154_ATTR_PHY_CHANNEL_PAGE_THREE_CSS = BIT(3),
     193              : 
     194              :         /** UWB PHY - SubG, low and high bands, see section 10.1.3.5 */
     195              :         IEEE802154_ATTR_PHY_CHANNEL_PAGE_FOUR_HRP_UWB = BIT(4),
     196              : 
     197              :         /** O-QPSK PHY - 780 MHz band, see section 10.1.3.2 */
     198              :         IEEE802154_ATTR_PHY_CHANNEL_PAGE_FIVE_OQPSK_780 = BIT(5),
     199              : 
     200              :         /** reserved - not currently assigned */
     201              :         IEEE802154_ATTR_PHY_CHANNEL_PAGE_SIX_RESERVED = BIT(6),
     202              : 
     203              :         /** MSK PHY - 780 MHz and 2450 MHz bands, see sections 10.1.3.6, 10.1.3.7 */
     204              :         IEEE802154_ATTR_PHY_CHANNEL_PAGE_SEVEN_MSK = BIT(7),
     205              : 
     206              :         /** LRP UWB PHY, see sections 10.1.3.8 */
     207              :         IEEE802154_ATTR_PHY_CHANNEL_PAGE_EIGHT_LRP_UWB = BIT(8),
     208              : 
     209              :         /**
     210              :          * SUN FSK/OFDM/O-QPSK PHYs - predefined bands, operating modes and
     211              :          * channels, see sections 10.1.3.9
     212              :          */
     213              :         IEEE802154_ATTR_PHY_CHANNEL_PAGE_NINE_SUN_PREDEFINED = BIT(9),
     214              : 
     215              :         /**
     216              :          * SUN FSK/OFDM/O-QPSK PHYs - generic modulation and channel
     217              :          * description, see sections 10.1.3.9, 7.4.4.11
     218              :          */
     219              :         IEEE802154_ATTR_PHY_CHANNEL_PAGE_TEN_SUN_FSK_GENERIC = BIT(10),
     220              : 
     221              :         /** O-QPSK PHY - 2380 MHz band, see section 10.1.3.10 */
     222              :         IEEE802154_ATTR_PHY_CHANNEL_PAGE_ELEVEN_OQPSK_2380 = BIT(11),
     223              : 
     224              :         /** LECIM DSSS/FSK PHYs, see section 10.1.3.11 */
     225              :         IEEE802154_ATTR_PHY_CHANNEL_PAGE_TWELVE_LECIM = BIT(12),
     226              : 
     227              :         /** RCC PHY, see section 10.1.3.12 */
     228              :         IEEE802154_ATTR_PHY_CHANNEL_PAGE_THIRTEEN_RCC = BIT(13),
     229              : };
     230              : 
     231              : /**
     232              :  * Represents a supported channel range, see @ref
     233              :  * ieee802154_phy_supported_channels.
     234              :  */
     235            1 : struct ieee802154_phy_channel_range {
     236            1 :         uint16_t from_channel; /**< From channel range */
     237            1 :         uint16_t to_channel;   /**< To channel range */
     238              : };
     239              : 
     240              : /**
     241              :  * Represents a list channels supported by a driver for a given interface, see
     242              :  * @ref IEEE802154_ATTR_PHY_SUPPORTED_CHANNEL_RANGES.
     243              :  */
     244            1 : struct ieee802154_phy_supported_channels {
     245              :         /**
     246              :          * @brief Pointer to an array of channel range structures.
     247              :          *
     248              :          * @warning The pointer must be valid and constant throughout the life
     249              :          * of the interface.
     250              :          */
     251            1 :         const struct ieee802154_phy_channel_range *const ranges;
     252              : 
     253              :         /** @brief The number of currently available channel ranges. */
     254            1 :         const uint8_t num_ranges;
     255              : };
     256              : 
     257              : /**
     258              :  * @brief Allocate memory for the supported channels driver attribute with a
     259              :  * single channel range constant across all driver instances. This is what most
     260              :  * IEEE 802.15.4 drivers need.
     261              :  *
     262              :  * @details Example usage:
     263              :  *
     264              :  * @code{.c}
     265              :  *   IEEE802154_DEFINE_PHY_SUPPORTED_CHANNELS(drv_attr, 11, 26);
     266              :  * @endcode
     267              :  *
     268              :  * The attribute may then be referenced like this:
     269              :  *
     270              :  * @code{.c}
     271              :  *   ... &drv_attr.phy_supported_channels ...
     272              :  * @endcode
     273              :  *
     274              :  * See @ref ieee802154_attr_get_channel_page_and_range() for a further shortcut
     275              :  * that can be combined with this macro.
     276              :  *
     277              :  * @param drv_attr name of the local static variable to be declared for the
     278              :  * local attributes structure
     279              :  * @param from the first channel to be supported
     280              :  * @param to the last channel to be supported
     281              :  */
     282            1 : #define IEEE802154_DEFINE_PHY_SUPPORTED_CHANNELS(drv_attr, from, to)                               \
     283              :         static const struct {                                                                      \
     284              :                 const struct ieee802154_phy_channel_range phy_channel_range;                       \
     285              :                 const struct ieee802154_phy_supported_channels phy_supported_channels;             \
     286              :         } drv_attr = {                                                                             \
     287              :                 .phy_channel_range = {.from_channel = (from), .to_channel = (to)},                 \
     288              :                 .phy_supported_channels =                                                          \
     289              :                         {                                                                          \
     290              :                                 .ranges = &drv_attr.phy_channel_range,                             \
     291              :                                 .num_ranges = 1U,                                                  \
     292              :                         },                                                                         \
     293              :         }
     294              : 
     295              : /** @} */
     296              : 
     297              : 
     298              : /**
     299              :  * @name IEEE 802.15.4-2020, Section 11: PHY services
     300              :  * @{
     301              :  */
     302              : 
     303              : /**
     304              :  * Default PHY PIB attribute aTurnaroundTime, in PHY symbols, see section 11.3,
     305              :  * table 11-1.
     306              :  */
     307            1 : #define IEEE802154_PHY_A_TURNAROUND_TIME_DEFAULT 12U
     308              : 
     309              : /**
     310              :  * PHY PIB attribute aTurnaroundTime for SUN, RS-GFSK, TVWS, and LECIM FSK PHY,
     311              :  * in PHY symbols, see section 11.3, table 11-1.
     312              :  */
     313            1 : #define IEEE802154_PHY_A_TURNAROUND_TIME_1MS(symbol_period_ns)                                     \
     314              :         DIV_ROUND_UP(NSEC_PER_MSEC, symbol_period_ns)
     315              : 
     316              : /**
     317              :  * PHY PIB attribute aCcaTime, in PHY symbols, all PHYs except for SUN O-QPSK,
     318              :  * see section 11.3, table 11-1.
     319              :  */
     320            1 : #define IEEE802154_PHY_A_CCA_TIME 8U
     321              : 
     322              : /** @} */
     323              : 
     324              : 
     325              : 
     326              : /**
     327              :  * @name IEEE 802.15.4-2020, Section 12: O-QPSK PHY
     328              :  * @{
     329              :  */
     330              : 
     331              : /** O-QPSK 868Mhz band symbol period, see section 12.3.3 */
     332            1 : #define IEEE802154_PHY_OQPSK_868MHZ_SYMBOL_PERIOD_NS         40000LL
     333              : 
     334              : /**
     335              :  * O-QPSK 780MHz, 915MHz, 2380MHz and 2450MHz bands symbol period,
     336              :  * see section 12.3.3
     337              :  */
     338            1 : #define IEEE802154_PHY_OQPSK_780_TO_2450MHZ_SYMBOL_PERIOD_NS 16000LL
     339              : 
     340              : /** @} */
     341              : 
     342              : 
     343              : /**
     344              :  * @name IEEE 802.15.4-2020, Section 13: BPSK PHY
     345              :  * @{
     346              :  */
     347              : 
     348              : /** BPSK 868MHz band symbol period, see section 13.3.3 */
     349            1 : #define IEEE802154_PHY_BPSK_868MHZ_SYMBOL_PERIOD_NS 50000LL
     350              : 
     351              : /** BPSK 915MHz band symbol period, see section 13.3.3 */
     352            1 : #define IEEE802154_PHY_BPSK_915MHZ_SYMBOL_PERIOD_NS 25000LL
     353              : 
     354              : /** @} */
     355              : 
     356              : 
     357              : /**
     358              :  * @name IEEE 802.15.4-2020, Section 15: HRP UWB PHY
     359              :  *
     360              :  * @details For HRP UWB the symbol period is derived from the preamble symbol period
     361              :  * (T_psym), see section 11.3, table 11-1 and section 15.2.5, table 15-4
     362              :  * (confirmed in IEEE 802.15.4z, section 15.1). Choosing among those periods
     363              :  * cannot be done based on channel page and channel alone. The mean pulse
     364              :  * repetition frequency must also be known, see the 'UwbPrf' parameter of the
     365              :  * MCPS-DATA.request primitive (section 8.3.2, table 8-88) and the preamble
     366              :  * parameters for HRP-ERDEV length 91 codes (IEEE 802.15.4z, section 15.2.6.2,
     367              :  * table 15-7b).
     368              :  * @{
     369              :  */
     370              : 
     371              : /** Nominal PRF 4MHz symbol period */
     372            1 : #define IEEE802154_PHY_HRP_UWB_PRF4_TPSYM_SYMBOL_PERIOD_NS  3974.36F
     373              : /** Nominal PRF 16MHz symbol period */
     374            1 : #define IEEE802154_PHY_HRP_UWB_PRF16_TPSYM_SYMBOL_PERIOD_NS 993.59F
     375              : /** Nominal PRF 64MHz symbol period */
     376            1 : #define IEEE802154_PHY_HRP_UWB_PRF64_TPSYM_SYMBOL_PERIOD_NS 1017.63F
     377              : /** ERDEV symbol period */
     378            1 : #define IEEE802154_PHY_HRP_UWB_ERDEV_TPSYM_SYMBOL_PERIOD_NS 729.17F
     379              : 
     380              : /** @brief represents the nominal pulse rate frequency of an HRP UWB PHY */
     381            0 : enum ieee802154_phy_hrp_uwb_nominal_prf {
     382              :         /** standard modes, see section 8.3.2, table 8-88. */
     383              :         IEEE802154_PHY_HRP_UWB_PRF_OFF = 0,
     384              :         IEEE802154_PHY_HRP_UWB_NOMINAL_4_M = BIT(0),
     385              :         IEEE802154_PHY_HRP_UWB_NOMINAL_16_M = BIT(1),
     386              :         IEEE802154_PHY_HRP_UWB_NOMINAL_64_M = BIT(2),
     387              : 
     388              :         /**
     389              :          * enhanced ranging device (ERDEV) modes not specified in table 8-88,
     390              :          * see IEEE 802.15.4z, section 15.1, section 15.2.6.2, table 15-7b,
     391              :          * section 15.3.4.2 and section 15.3.4.3.
     392              :          */
     393              :         IEEE802154_PHY_HRP_UWB_NOMINAL_64_M_BPRF = BIT(3),
     394              :         IEEE802154_PHY_HRP_UWB_NOMINAL_128_M_HPRF = BIT(4),
     395              :         IEEE802154_PHY_HRP_UWB_NOMINAL_256_M_HPRF = BIT(5),
     396              : };
     397              : 
     398              : /** RDEV device mask */
     399            1 : #define IEEE802154_PHY_HRP_UWB_RDEV                                                                \
     400              :         (IEEE802154_PHY_HRP_UWB_NOMINAL_4_M | IEEE802154_PHY_HRP_UWB_NOMINAL_16_M |                \
     401              :          IEEE802154_PHY_HRP_UWB_NOMINAL_64_M)
     402              : 
     403              : /** ERDEV device mask */
     404            1 : #define IEEE802154_PHY_HRP_UWB_ERDEV                                                               \
     405              :         (IEEE802154_PHY_HRP_UWB_NOMINAL_64_M_BPRF | IEEE802154_PHY_HRP_UWB_NOMINAL_128_M_HPRF |    \
     406              :          IEEE802154_PHY_HRP_UWB_NOMINAL_256_M_HPRF)
     407              : 
     408              : /** @} */
     409              : 
     410              : 
     411              : /**
     412              :  * @name IEEE 802.15.4-2020, Section 19: SUN FSK PHY
     413              :  * @{
     414              :  */
     415              : 
     416              : /** SUN FSK 863Mhz and 915MHz band symbol periods, see section 19.1, table 19-1 */
     417            1 : #define IEEE802154_PHY_SUN_FSK_863MHZ_915MHZ_SYMBOL_PERIOD_NS 20000LL
     418              : 
     419              : /** SUN FSK PHY header length, in bytes, see section 19.2.4 */
     420            1 : #define IEEE802154_PHY_SUN_FSK_PHR_LEN 2
     421              : 
     422              : /** @} */
     423              : 
     424              : /**
     425              :  * @name IEEE 802.15.4 Driver API
     426              :  * @{
     427              :  */
     428              : 
     429              : /**
     430              :  * IEEE 802.15.4 driver capabilities
     431              :  *
     432              :  * Any driver properties that can be represented in binary form should be
     433              :  * modeled as capabilities. These are called "hardware" capabilities for
     434              :  * historical reasons but may also represent driver firmware capabilities (e.g.
     435              :  * MAC offloading features).
     436              :  */
     437            1 : enum ieee802154_hw_caps {
     438              : 
     439              :         /*
     440              :          * PHY capabilities
     441              :          *
     442              :          * The following capabilities describe features of the underlying radio
     443              :          * hardware (PHY/L1).
     444              :          */
     445              : 
     446              :         /** Energy detection (ED) supported (optional) */
     447              :         IEEE802154_HW_ENERGY_SCAN = BIT(0),
     448              : 
     449              :         /*
     450              :          * MAC offloading capabilities (optional)
     451              :          *
     452              :          * The following MAC/L2 features may optionally be offloaded to
     453              :          * specialized hardware or proprietary driver firmware ("hard MAC").
     454              :          *
     455              :          * L2 implementations will have to provide a "soft MAC" fallback for
     456              :          * these features in case the driver does not support them natively.
     457              :          *
     458              :          * Note: Some of these offloading capabilities may be mandatory in
     459              :          * practice to stay within timing requirements of certain IEEE 802.15.4
     460              :          * protocols, e.g. CPUs may not be fast enough to send ACKs within the
     461              :          * required delays in the 2.4 GHz band without hard MAC support.
     462              :          */
     463              : 
     464              :         /** Frame checksum verification supported */
     465              :         IEEE802154_HW_FCS = BIT(1),
     466              : 
     467              :         /** Filtering of PAN ID, extended and short address supported */
     468              :         IEEE802154_HW_FILTER = BIT(2),
     469              : 
     470              :         /** Promiscuous mode supported */
     471              :         IEEE802154_HW_PROMISC = BIT(3),
     472              : 
     473              :         /** CSMA-CA procedure supported on TX */
     474              :         IEEE802154_HW_CSMA = BIT(4),
     475              : 
     476              :         /** Waits for ACK on TX if AR bit is set in TX pkt */
     477              :         IEEE802154_HW_TX_RX_ACK = BIT(5),
     478              : 
     479              :         /** Supports retransmission on TX ACK timeout */
     480              :         IEEE802154_HW_RETRANSMISSION = BIT(6),
     481              : 
     482              :         /** Sends ACK on RX if AR bit is set in RX pkt */
     483              :         IEEE802154_HW_RX_TX_ACK = BIT(7),
     484              : 
     485              :         /** TX at specified time supported */
     486              :         IEEE802154_HW_TXTIME = BIT(8),
     487              : 
     488              :         /** TX directly from sleep supported
     489              :          *
     490              :          *  @note This HW capability does not conform to the requirements
     491              :          *  specified in #61227 as it closely couples the driver to OpenThread's
     492              :          *  capability and device model which is different from Zephyr's:
     493              :          *   - "Sleeping" is a well defined term in Zephyr related to internal
     494              :          *     power and thread management and different from "RX off" as
     495              :          *     defined in OT.
     496              :          *   - Currently all OT-capable drivers have the "sleep to TX"
     497              :          *     capability anyway plus we expect future drivers to implement it
     498              :          *     ootb as well, so no information is actually conveyed by this
     499              :          *     capability.
     500              :          *   - The `start()`/`stop()` API of a net device controls the
     501              :          *     interface's operational state. Drivers MUST respond with
     502              :          *     -ENETDOWN when calling `tx()` while their operational state is
     503              :          *     "DOWN", only devices in the "UP" state MAY transmit packets (RFC
     504              :          *     2863).
     505              :          *   - A migration path has been defined in #63670 for actual removal of
     506              :          *     this capability in favor of a standard compliant
     507              :          *     `configure(rx_on/rx_off)` call, see there for details.
     508              :          *
     509              :          * @deprecated Drivers and L2 SHALL not introduce additional references
     510              :          * to this capability and remove existing ones as outlined in #63670.
     511              :          */
     512              :         IEEE802154_HW_SLEEP_TO_TX = BIT(9),
     513              : 
     514              :         /** Timed RX window scheduling supported */
     515              :         IEEE802154_HW_RXTIME = BIT(10),
     516              : 
     517              :         /** TX security supported (key management, encryption and authentication) */
     518              :         IEEE802154_HW_TX_SEC = BIT(11),
     519              : 
     520              :         /** RxOnWhenIdle handling supported */
     521              :         IEEE802154_RX_ON_WHEN_IDLE = BIT(12),
     522              : 
     523              :         /** Support for timed transmissions on selective channel.
     524              :          *
     525              :          *  This capability informs that transmissions with modes
     526              :          *  @ref IEEE802154_TX_MODE_TXTIME and @ref IEEE802154_TX_MODE_TXTIME_CCA support
     527              :          *  scheduling of timed transmissions on selective tx channel.
     528              :          *  The driver MAY have this capability only if the Kconfig option
     529              :          *  `CONFIG_IEEE802154_SELECTIVE_TXCHANNEL` is set, otherwise the driver MUST
     530              :          *  NOT have this capability.
     531              :          *
     532              :          *  Please refer to the `ieee802154_radio_api::tx` documentation for details.
     533              :          */
     534              :         IEEE802154_HW_SELECTIVE_TXCHANNEL = BIT(13),
     535              : 
     536              :         /* Note: Update also IEEE802154_HW_CAPS_BITS_COMMON_COUNT when changing
     537              :          * the ieee802154_hw_caps type.
     538              :          */
     539              : };
     540              : 
     541              : /** @brief Number of bits used by ieee802154_hw_caps type. */
     542            1 : #define IEEE802154_HW_CAPS_BITS_COMMON_COUNT (14)
     543              : 
     544              : /** @brief This and higher values are specific to the protocol- or driver-specific extensions. */
     545            1 : #define IEEE802154_HW_CAPS_BITS_PRIV_START IEEE802154_HW_CAPS_BITS_COMMON_COUNT
     546              : 
     547              : /** Filter type, see @ref ieee802154_radio_api::filter */
     548            1 : enum ieee802154_filter_type {
     549              :         IEEE802154_FILTER_TYPE_IEEE_ADDR,      /**< Address type filter */
     550              :         IEEE802154_FILTER_TYPE_SHORT_ADDR,     /**< Short address type filter */
     551              :         IEEE802154_FILTER_TYPE_PAN_ID,         /**< PAN id type filter */
     552              :         IEEE802154_FILTER_TYPE_SRC_IEEE_ADDR,  /**< Source address type filter */
     553              :         IEEE802154_FILTER_TYPE_SRC_SHORT_ADDR, /**< Source short address type filter */
     554              : };
     555              : 
     556              : /** Driver events, see @ref IEEE802154_CONFIG_EVENT_HANDLER */
     557            1 : enum ieee802154_event {
     558              :         /** Data transmission started */
     559              :         IEEE802154_EVENT_TX_STARTED,
     560              :         /** Data reception failed */
     561              :         IEEE802154_EVENT_RX_FAILED,
     562              :         /**
     563              :          * An RX slot ended, requires @ref IEEE802154_HW_RXTIME.
     564              :          *
     565              :          * @note This event SHALL not be triggered by drivers when RX is
     566              :          * synchronously switched of due to a call to `stop()` or an RX slot
     567              :          * being configured.
     568              :          */
     569              :         IEEE802154_EVENT_RX_OFF,
     570              : };
     571              : 
     572              : /** RX failed event reasons, see @ref IEEE802154_EVENT_RX_FAILED */
     573            1 : enum ieee802154_rx_fail_reason {
     574              :         /** Nothing received */
     575              :         IEEE802154_RX_FAIL_NOT_RECEIVED,
     576              :         /** Frame had invalid checksum */
     577              :         IEEE802154_RX_FAIL_INVALID_FCS,
     578              :         /** Address did not match */
     579              :         IEEE802154_RX_FAIL_ADDR_FILTERED,
     580              :         /** General reason */
     581              :         IEEE802154_RX_FAIL_OTHER
     582              : };
     583              : 
     584              : /** Energy scan callback */
     585            1 : typedef void (*energy_scan_done_cb_t)(const struct device *dev,
     586              :                                       int16_t max_ed);
     587              : 
     588              : /** Driver event callback */
     589            1 : typedef void (*ieee802154_event_cb_t)(const struct device *dev,
     590              :                                       enum ieee802154_event evt,
     591              :                                       void *event_params);
     592              : 
     593              : /** Filter value, see @ref ieee802154_radio_api::filter */
     594            1 : struct ieee802154_filter {
     595              :         union {
     596              :                 /** Extended address, in little endian */
     597            1 :                 uint8_t *ieee_addr;
     598              :                 /** Short address, in CPU byte order */
     599            1 :                 uint16_t short_addr;
     600              :                 /** PAN ID, in CPU byte order */
     601            1 :                 uint16_t pan_id;
     602            0 :         };
     603              : };
     604              : 
     605              : /**
     606              :  * Key configuration for transmit security offloading, see @ref
     607              :  * IEEE802154_CONFIG_MAC_KEYS.
     608              :  */
     609            1 : struct ieee802154_key {
     610              :         /** Key material */
     611            1 :         uint8_t *key_value;
     612              :         /** Initial value of frame counter associated with the key, see section 9.4.3 */
     613            1 :         uint32_t key_frame_counter;
     614              :         /** Indicates if per-key frame counter should be used, see section 9.4.3 */
     615            1 :         bool frame_counter_per_key;
     616              :         /** Key Identifier Mode, see section 9.4.2.3, Table 9-7 */
     617            1 :         uint8_t key_id_mode;
     618              :         /** Key Identifier, see section 9.4.4 */
     619            1 :         uint8_t *key_id;
     620              : };
     621              : 
     622              : /** IEEE 802.15.4 Transmission mode. */
     623            1 : enum ieee802154_tx_mode {
     624              :         /** Transmit packet immediately, no CCA. */
     625              :         IEEE802154_TX_MODE_DIRECT,
     626              : 
     627              :         /** Perform CCA before packet transmission. */
     628              :         IEEE802154_TX_MODE_CCA,
     629              : 
     630              :         /**
     631              :          * Perform full CSMA/CA procedure before packet transmission.
     632              :          *
     633              :          * @note requires IEEE802154_HW_CSMA capability.
     634              :          */
     635              :         IEEE802154_TX_MODE_CSMA_CA,
     636              : 
     637              :         /**
     638              :          * Transmit packet in the future, at the specified time, no CCA.
     639              :          *
     640              :          * @note requires IEEE802154_HW_TXTIME capability.
     641              :          *
     642              :          * @note capability IEEE802154_HW_SELECTIVE_TXCHANNEL may apply.
     643              :          */
     644              :         IEEE802154_TX_MODE_TXTIME,
     645              : 
     646              :         /**
     647              :          * Transmit packet in the future, perform CCA before transmission.
     648              :          *
     649              :          * @note requires IEEE802154_HW_TXTIME capability.
     650              :          *
     651              :          * @note Required for Thread 1.2 Coordinated Sampled Listening feature
     652              :          * (see Thread specification 1.2.0, ch. 3.2.6.3).
     653              :          *
     654              :          * @note capability IEEE802154_HW_SELECTIVE_TXCHANNEL may apply.
     655              :          */
     656              :         IEEE802154_TX_MODE_TXTIME_CCA,
     657              : 
     658              :         /** Number of modes defined in ieee802154_tx_mode. */
     659              :         IEEE802154_TX_MODE_COMMON_COUNT,
     660              : 
     661              :         /** This and higher values are specific to the protocol- or driver-specific extensions. */
     662              :         IEEE802154_TX_MODE_PRIV_START = IEEE802154_TX_MODE_COMMON_COUNT,
     663              : };
     664              : 
     665              : /** IEEE 802.15.4 Frame Pending Bit table address matching mode. */
     666            1 : enum ieee802154_fpb_mode {
     667              :         /** The pending bit shall be set only for addresses found in the list. */
     668              :         IEEE802154_FPB_ADDR_MATCH_THREAD,
     669              : 
     670              :         /** The pending bit shall be cleared for short addresses found in the
     671              :          *  list.
     672              :          */
     673              :         IEEE802154_FPB_ADDR_MATCH_ZIGBEE,
     674              : };
     675              : 
     676              : /** IEEE 802.15.4 driver configuration types. */
     677            1 : enum ieee802154_config_type {
     678              :         /**
     679              :          * Indicates how the driver should set the Frame Pending bit in ACK
     680              :          * responses for Data Requests. If enabled, the driver should determine
     681              :          * whether to set the bit or not based on the information provided with
     682              :          * @ref IEEE802154_CONFIG_ACK_FPB config and FPB address matching mode
     683              :          * specified. Otherwise, Frame Pending bit should be set to ``1`` (see
     684              :          * section 6.7.3).
     685              :          *
     686              :          * @note requires @ref IEEE802154_HW_TX_RX_ACK capability and is
     687              :          * available in any interface operational state.
     688              :          */
     689              :         IEEE802154_CONFIG_AUTO_ACK_FPB,
     690              : 
     691              :         /**
     692              :          * Indicates whether to set ACK Frame Pending bit for specific address
     693              :          * or not. Disabling the Frame Pending bit with no address provided
     694              :          * (NULL pointer) should disable it for all enabled addresses.
     695              :          *
     696              :          * @note requires @ref IEEE802154_HW_TX_RX_ACK capability and is
     697              :          * available in any interface operational state.
     698              :          */
     699              :         IEEE802154_CONFIG_ACK_FPB,
     700              : 
     701              :         /**
     702              :          * Indicates whether the device is a PAN coordinator. This influences
     703              :          * packet filtering.
     704              :          *
     705              :          * @note Available in any interface operational state.
     706              :          */
     707              :         IEEE802154_CONFIG_PAN_COORDINATOR,
     708              : 
     709              :         /**
     710              :          * Enable/disable promiscuous mode.
     711              :          *
     712              :          * @note Available in any interface operational state.
     713              :          */
     714              :         IEEE802154_CONFIG_PROMISCUOUS,
     715              : 
     716              :         /**
     717              :          * Specifies new IEEE 802.15.4 driver event handler. Specifying NULL as
     718              :          * a handler will disable events notification.
     719              :          *
     720              :          * @note Available in any interface operational state.
     721              :          */
     722              :         IEEE802154_CONFIG_EVENT_HANDLER,
     723              : 
     724              :         /**
     725              :          * Updates MAC keys, key index and the per-key frame counter for drivers
     726              :          * supporting transmit security offloading, see section 9.5, tables 9-9
     727              :          * and 9-10. The key configuration SHALL NOT be accepted if the frame
     728              :          * counter (in case frame counter per key is true) is not strictly
     729              :          * larger than the current frame counter associated with the same key,
     730              :          * see sections 8.2.2, 9.2.4 g/h) and 9.4.3.
     731              :          *
     732              :          * @note Requires @ref IEEE802154_HW_TX_SEC capability and is available
     733              :          * in any interface operational state.
     734              :          */
     735              :         IEEE802154_CONFIG_MAC_KEYS,
     736              : 
     737              :         /**
     738              :          * Sets the current MAC frame counter value associated with the
     739              :          * interface for drivers supporting transmit security offloading, see
     740              :          * section 9.5, table 9-8, secFrameCounter.
     741              :          *
     742              :          * @warning The frame counter MUST NOT be accepted if it is not
     743              :          * strictly greater than the current frame counter associated with the
     744              :          * interface, see sections 8.2.2, 9.2.4 g/h) and 9.4.3. Otherwise the
     745              :          * replay protection provided by the frame counter may be compromised.
     746              :          * Drivers SHALL return -EINVAL in case the configured frame counter
     747              :          * does not conform to this requirement.
     748              :          *
     749              :          * @note Requires @ref IEEE802154_HW_TX_SEC capability and is available
     750              :          * in any interface operational state.
     751              :          */
     752              :         IEEE802154_CONFIG_FRAME_COUNTER,
     753              : 
     754              :         /**
     755              :          * Sets the current MAC frame counter value if the provided value is greater than
     756              :          * the current one.
     757              :          *
     758              :          * @note Requires @ref IEEE802154_HW_TX_SEC capability and is available
     759              :          * in any interface operational state.
     760              :          *
     761              :          * @warning This configuration option does not conform to the
     762              :          * requirements specified in #61227 as it is redundant with @ref
     763              :          * IEEE802154_CONFIG_FRAME_COUNTER, and will therefore be deprecated in
     764              :          * the future.
     765              :          */
     766              :         IEEE802154_CONFIG_FRAME_COUNTER_IF_LARGER,
     767              : 
     768              :         /**
     769              :          * Set or unset a radio reception window (RX slot). This can be used for
     770              :          * any scheduled reception, e.g.: Zigbee GP device, CSL, TSCH, etc.
     771              :          *
     772              :          * @details The start and duration parameters of the RX slot are
     773              :          * relative to the network subsystem's local clock. If the start
     774              :          * parameter of the RX slot is -1 then any previously configured RX
     775              :          * slot SHALL be canceled immediately. If the start parameter is any
     776              :          * value in the past (including 0) or the duration parameter is zero
     777              :          * then the receiver SHALL remain off forever until the RX slot has
     778              :          * either been removed or re-configured to point to a future start
     779              :          * time. If an RX slot is configured while the previous RX slot is
     780              :          * still scheduled, then the previous slot SHALL be cancelled and the
     781              :          * new slot scheduled instead.
     782              :          *
     783              :          * RX slots MAY be programmed while the driver is "DOWN". If any past
     784              :          * or future RX slot is configured when calling `start()` then the
     785              :          * interface SHALL be placed in "UP" state but the receiver SHALL not
     786              :          * be started.
     787              :          *
     788              :          * The driver SHALL take care to start/stop the receiver autonomously,
     789              :          * asynchronously and automatically around the RX slot. The driver
     790              :          * SHALL resume power just before the RX slot and suspend it again
     791              :          * after the slot unless another programmed event forces the driver not
     792              :          * to suspend. The driver SHALL switch to the programmed channel
     793              :          * before the RX slot and back to the channel set with set_channel()
     794              :          * after the RX slot. If the driver interface is "DOWN" when the start
     795              :          * time of an RX slot arrives, then the RX slot SHALL not be observed
     796              :          * and the receiver SHALL remain off.
     797              :          *
     798              :          * If the driver is "UP" while configuring an RX slot, the driver SHALL
     799              :          * turn off the receiver immediately and (possibly asynchronously) put
     800              :          * the driver into the lowest possible power saving mode until the
     801              :          * start of the RX slot. If the driver is "UP" while the RX slot is
     802              :          * deleted, then the driver SHALL enable the receiver immediately. The
     803              :          * receiver MUST be ready to receive packets before returning from the
     804              :          * `configure()` operation in this case.
     805              :          *
     806              :          * This behavior means that setting an RX slot implicitly sets the MAC
     807              :          * PIB attribute macRxOnWhenIdle (see section 8.4.3.1, table 8-94) to
     808              :          * "false" while deleting the RX slot implicitly sets macRxOnWhenIdle to
     809              :          * "true".
     810              :          *
     811              :          * @note requires @ref IEEE802154_HW_RXTIME capability and is available
     812              :          * in any interface operational state.
     813              :          *
     814              :          * @note Required for Thread 1.2 Coordinated Sampled Listening feature
     815              :          * (see Thread specification 1.2.0, ch. 3.2.6.3).
     816              :          */
     817              :         IEEE802154_CONFIG_RX_SLOT,
     818              : 
     819              :         /**
     820              :          * Enables or disables a device as a CSL receiver and configures its CSL
     821              :          * period.
     822              :          *
     823              :          * @details Configures the CSL period in units of 10 symbol periods.
     824              :          * Values greater than zero enable CSL if the driver supports it and the
     825              :          * device starts to operate as a CSL receiver. Setting this to zero
     826              :          * disables CSL on the device. If the driver does not support CSL, the
     827              :          * configuration call SHALL return -ENOTSUP.
     828              :          *
     829              :          * See section 7.4.2.3 and section 8.4.3.6, table 8-104, macCslPeriod.
     830              :          *
     831              :          * @note Confusingly the standard calls the CSL receiver "CSL
     832              :          * coordinator" (i.e. "coordinating the CSL protocol timing", see
     833              :          * section 6.12.2.2), although, typically, a CSL coordinator is NOT also
     834              :          * an IEEE 802.15.4 FFD coordinator or PAN coordintor but a simple RFD
     835              :          * end device (compare the device roles outlined in sections 5.1, 5.3,
     836              :          * 5.5 and 6.1). To avoid confusion we therefore prefer calling CSL
     837              :          * coordinators (typically an RFD end device) "CSL receivers" and CSL
     838              :          * peer devices (typically FFD coordinators or PAN coordinators) "CSL
     839              :          * transmitters". Also note that at this time, we do NOT support
     840              :          * unsynchronized transmission with CSL wake up frames as specified in
     841              :          * section 6.12.2.4.4.
     842              :          *
     843              :          * To offload CSL receiver timing to the driver the upper layer SHALL
     844              :          * combine several configuration options in the following way:
     845              :          *
     846              :          * 1. Use @ref IEEE802154_CONFIG_ENH_ACK_HEADER_IE once with an
     847              :          *    appropriate pre-filled CSL IE and the CSL phase set to an
     848              :          *    arbitrary value or left uninitialized. The CSL phase SHALL be
     849              :          *    injected on-the-fly by the driver at runtime as outlined in 2.
     850              :          *    below. Adding a short and extended address will inform the driver
     851              :          *    of the specific CSL receiver to which it SHALL inject CSL IEs. If
     852              :          *    no addresses are given then the CSL IE will be injected into all
     853              :          *    enhanced ACK frames as soon as CSL is enabled.  This configuration
     854              :          *    SHALL be done before enabling CSL by setting a CSL period greater
     855              :          *    than zero.
     856              :          *
     857              :          * 2. Configure @ref IEEE802154_CONFIG_EXPECTED_RX_TIME immediately
     858              :          *    followed by @ref IEEE802154_CONFIG_CSL_PERIOD. To prevent race
     859              :          *    conditions, the upper layer SHALL ensure that the receiver is not
     860              :          *    enabled during or between the two calls (e.g. by a previously
     861              :          *    configured RX slot) nor SHALL a frame be transmitted concurrently.
     862              :          *
     863              :          *    The expected RX time SHALL point to the end of SFD of an ideally
     864              :          *    timed RX frame in an arbitrary past or future CSL channel sample,
     865              :          *    i.e.  whose "end of SFD" arrives exactly at the locally predicted
     866              :          *    time inside the CSL channel sample.
     867              :          *
     868              :          *    The driver SHALL derive CSL anchor points and the CSL phase from
     869              :          *    the given expected RX time as follows:
     870              :          *
     871              :          *        cslAnchorPointNs = last expected RX time
     872              :          *                           + PHY-specific PHR duration in ns
     873              :          *
     874              :          *        startOfMhrNs = start of MHR of the frame containing the
     875              :          *                       CSL IE relative to the local network clock
     876              :          *
     877              :          *        cslPhase = (startOfMhrNs - cslAnchorPointNs)
     878              :          *                   / (10 * PHY specific symbol period in ns)
     879              :          *                   % cslPeriod
     880              :          *
     881              :          *    The driver SHALL set the CSL phase in the IE configured in 1.  and
     882              :          *    inject that IE on-the-fly into outgoing enhanced ACK frames if the
     883              :          *    destination address conforms to the IE's address filter.
     884              :          *
     885              :          * 3. Use @ref IEEE802154_CONFIG_RX_SLOT periodically to schedule
     886              :          *    each CSL channel sample early enough before its start time. The
     887              :          *    size of the CSL channel sample SHALL take relative clock drift and
     888              :          *    scheduling uncertainties with respect to CSL transmitters into
     889              :          *    account as specified by the standard such that at least the full
     890              :          *    SHR of a legitimate RX frame is guaranteed to land inside the
     891              :          *    channel sample.
     892              :          *
     893              :          *    To this avail, the last configured expected RX time plus an
     894              :          *    integer number of CSL periods SHALL point to a fixed offset of the
     895              :          *    RX slot (not necessarily its center):
     896              :          *
     897              :          *        expectedRxTimeNs_N = last expected RX time
     898              :          *            + N * (cslPeriod * 10 * PHY-specific symbol period in ns)
     899              :          *
     900              :          *        expectedRxTimeNs_N - rxSlot_N.start == const for all N
     901              :          *
     902              :          *    While the configured CSL period is greater than zero, drivers
     903              :          *    SHOULD validate the offset of the expected RX time inside each RX
     904              :          *    slot accordingly. If the driver finds that the offset varies from
     905              :          *    slot to slot, drivers SHOULD log the difference but SHALL
     906              :          *    nevertheless accept and schedule the RX slot with a zero success
     907              :          *    value to work around minor implementation or rounding errors in
     908              :          *    upper layers.
     909              :          *
     910              :          * Configure and start a CSL receiver:
     911              :          *
     912              :          *     ENH_ACK_HEADER_IE
     913              :          *        |
     914              :          *        | EXPECTED_RX_TIME (end of SFD of a perfectly timed RX frame
     915              :          *        |    |              in any past or future channel sample)
     916              :          *        |    |
     917              :          *        |    | CSL_PERIOD (>0)            RX_SLOT
     918              :          *        |    |    |                          |
     919              :          *        v    v    v                          v
     920              :          *     -----------------------------------------------[-CSL channel sample ]----+
     921              :          *                                         ^                                    |
     922              :          *                                         |                                    |
     923              :          *                                         +--------------------- loop ---------+
     924              :          *
     925              :          * Disable CSL on the receiver:
     926              :          *
     927              :          *     CSL_PERIOD (=0)
     928              :          *        |
     929              :          *        v
     930              :          *     ---------------------
     931              :          *
     932              :          * Update the CSL period to a new value:
     933              :          *
     934              :          *     EXPECTED_RX_TIME (based on updated period)
     935              :          *        |
     936              :          *        |  CSL_PERIOD (>0, updated)       RX_SLOT
     937              :          *        |     |                              |
     938              :          *        v     v                              v
     939              :          *     -----------------------------------------------[-CSL channel sample ]----+
     940              :          *                                         ^                                    |
     941              :          *                                         |                                    |
     942              :          *                                         +--------------------- loop ---------+
     943              :          *
     944              :          * @note Available in any interface operational state.
     945              :          *
     946              :          * @note Required for Thread 1.2 Coordinated Sampled Listening feature
     947              :          * (see Thread specification 1.2.0, ch. 3.2.6.3).
     948              :          */
     949              :         IEEE802154_CONFIG_CSL_PERIOD,
     950              : 
     951              :         /**
     952              :          * Configure a timepoint at which an RX frame is expected to arrive.
     953              :          *
     954              :          * @details Configure the nanosecond resolution timepoint relative to
     955              :          * the network subsystem's local clock at which an RX frame's end of SFD
     956              :          * (i.e. equivalently its end of SHR, start of PHR, or in the case of
     957              :          * PHYs with RDEV or ERDEV capability the RMARKER) is expected to arrive
     958              :          * at the local antenna assuming perfectly synchronized local and remote
     959              :          * network clocks and zero distance between antennas.
     960              :          *
     961              :          * This parameter MAY be used to offload parts of timing sensitive TDMA
     962              :          * (e.g.  TSCH, beacon-enabled PAN including DSME), low-energy (e.g.
     963              :          * CSL, RIT) or ranging (TDoA) protocols to the driver. In these
     964              :          * protocols, medium access is tightly controlled such that the expected
     965              :          * arrival time of a frame can be predicted within a well-defined time
     966              :          * window. This feature will typically be combined with @ref
     967              :          * IEEE802154_CONFIG_RX_SLOT although this is not a hard requirement.
     968              :          *
     969              :          * The "expected RX time" MAY be interpreted slightly differently
     970              :          * depending on the protocol context:
     971              :          * - CSL phase (i.e. time to the next expected CSL transmission) or anchor
     972              :          *   time (i.e. any arbitrary timepoint with "zero CSL phase") SHALL be
     973              :          *   derived by adding the PHY header duration to the expected RX time
     974              :          *   to calculate the "start of MHR" ("first symbol of MAC", see section
     975              :          *   6.12.2.1) required by the CSL protocol, compare @ref
     976              :          *   IEEE802154_CONFIG_CSL_PERIOD.
     977              :          * - In TSCH the expected RX time MAY be set to macTsRxOffset +
     978              :          *   macTsRxWait / 2. Then the time correction SHALL be calculated as
     979              :          *   the expected RX time minus actual arrival timestamp, see section
     980              :          *   6.5.4.3.
     981              :          * - In ranging applications, time difference of arrival (TDOA) MAY be
     982              :          *   calculated inside the driver comparing actual RMARKER timestamps
     983              :          *   against the assumed synchronized time at which the ranging frame
     984              :          *   was sent, see IEEE 802.15.4z.
     985              :          *
     986              :          * In case of periodic protocols (e.g. CSL channel samples, periodic
     987              :          * beacons of a single PAN, periodic ranging "blinks"), a single
     988              :          * timestamp at any time in the past or in the future may be given from
     989              :          * which other expected timestamps can be derived by adding or
     990              :          * subtracting multiples of the RX period. See e.g. the CSL
     991              :          * documentation in this API.
     992              :          *
     993              :          * Additionally this parameter MAY be used by drivers to discipline
     994              :          * their local representation of a distributed network clock by deriving
     995              :          * synchronization instants related to a remote representation of the
     996              :          * same clock (as in PTP).
     997              :          *
     998              :          * @note Available in any interface operational state.
     999              :          *
    1000              :          * @note Required for Thread 1.2 Coordinated Sampled Listening feature
    1001              :          * (see Thread specification 1.2.0, ch. 3.2.6.3).
    1002              :          */
    1003              :         IEEE802154_CONFIG_EXPECTED_RX_TIME,
    1004              : 
    1005              :         /**
    1006              :          * Adds a header information element (IE) to be injected into enhanced
    1007              :          * ACK frames generated by the driver if the given destination address
    1008              :          * filter matches.
    1009              :          *
    1010              :          * @details Drivers implementing the @ref IEEE802154_HW_RX_TX_ACK
    1011              :          * capability generate ACK frames autonomously. Setting this
    1012              :          * configuration will ask the driver to inject the given preconfigured
    1013              :          * header IE when generating enhanced ACK frames where appropriate by
    1014              :          * the standard. IEs for all other frame types SHALL be provided by L2.
    1015              :          *
    1016              :          * The driver shall return -ENOTSUP in the following cases:
    1017              :          * - It does not support the @ref IEEE802154_HW_RX_TX_ACK,
    1018              :          * - It does not support header IE injection,
    1019              :          * - It cannot inject the runtime fields on-the-fly required for the
    1020              :          *   given IE element ID (see list below).
    1021              :          *
    1022              :          * Enhanced ACK header IEs (element IDs in parentheses) that either
    1023              :          * need to be rejected or explicitly supported and parsed by the driver
    1024              :          * because they require on-the-fly timing information injection are:
    1025              :          * - CSL IE (0x1a)
    1026              :          * - Rendezvous Time IE (0x1d)
    1027              :          * - Time Correction IE (0x1e)
    1028              :          *
    1029              :          * Drivers accepting this configuration option SHALL check the list of
    1030              :          * configured IEs for each outgoing enhanced ACK frame, select the ones
    1031              :          * appropriate for the received frame based on their element ID, inject
    1032              :          * any required runtime information on-the-fly and include the selected
    1033              :          * IEs into the enhanced ACK frame's MAC header.
    1034              :          *
    1035              :          * Drivers supporting enhanced ACK header IE injection SHALL
    1036              :          * autonomously inject header termination IEs as required by the
    1037              :          * standard.
    1038              :          *
    1039              :          * A destination short address and extended address MAY be given by L2
    1040              :          * to filter the devices to which the given IE is included. Setting the
    1041              :          * short address to the broadcast address and the extended address to
    1042              :          * NULL will inject the given IE into all ACK frames unless a more
    1043              :          * specific filter is also present for any given destination device
    1044              :          * (fallback configuration). L2 SHALL take care to either set both
    1045              :          * address fields to valid device addresses or none.
    1046              :          *
    1047              :          * This configuration type may be called several times with distinct
    1048              :          * element IDs and/or addresses. The driver SHALL either store all
    1049              :          * configured IE/address combinations or return -ENOMEM if no
    1050              :          * additional configuration can be stored.
    1051              :          *
    1052              :          * Configuring a header IE with a previously configured element ID and
    1053              :          * address filter SHALL override the previous configuration. This
    1054              :          * implies that repetition of the same header IE/address combination is
    1055              :          * NOT supported.
    1056              :          *
    1057              :          * Configuring an existing element ID/address filter combination with
    1058              :          * the header IE's length field set to zero SHALL remove that
    1059              :          * configuration. SHALL remove the fallback configuration if no address
    1060              :          * is given.
    1061              :          *
    1062              :          * Configuring a header IE for an address filter with the header IE
    1063              :          * pointer set to NULL SHALL remove all header IE's for that address
    1064              :          * filter. SHALL remove ALL header IE configuration (including but not
    1065              :          * limited to fallbacks) if no address is given.
    1066              :          *
    1067              :          * If any of the deleted configurations didn't previously exist, then
    1068              :          * the call SHALL be ignored. Whenever the length field is set to zero,
    1069              :          * the content fields MUST NOT be accessed by the driver.
    1070              :          *
    1071              :          * L2 SHALL minimize the space required to keep IE configuration inside
    1072              :          * the driver by consolidating address filters and by removing
    1073              :          * configuration that is no longer required.
    1074              :          *
    1075              :          * @note requires @ref IEEE802154_HW_RX_TX_ACK capability and is
    1076              :          * available in any interface operational state. Currently we only
    1077              :          * support header IEs but that may change in the future.
    1078              :          *
    1079              :          * @note Required for Thread 1.2 Coordinated Sampled Listening feature
    1080              :          * (see Thread specification 1.2.0, ch. 3.2.6.3).
    1081              :          *
    1082              :          * @note Required for Thread 1.2 Link Metrics feature (see Thread
    1083              :          * specification 1.2.0, ch. 4.11.3.3).
    1084              :          */
    1085              :         IEEE802154_CONFIG_ENH_ACK_HEADER_IE,
    1086              : 
    1087              :         /**
    1088              :          * Enable/disable RxOnWhenIdle MAC PIB attribute (Table 8-94).
    1089              :          *
    1090              :          * Since there is no clear guidance in IEEE 802.15.4 specification about the definition of
    1091              :          * an "idle period", this implementation expects that drivers use the RxOnWhenIdle attribute
    1092              :          * to determine next radio state (false --> off, true --> receive) in the following
    1093              :          * scenarios:
    1094              :          * - Finalization of a regular frame reception task, provided that:
    1095              :          *   - The frame is received without errors and passes the filtering and it's not an
    1096              :          *     spurious ACK.
    1097              :          *   - ACK is not requested or transmission of ACK is not possible due to internal
    1098              :          *     conditions.
    1099              :          * - Finalization of a frame transmission or transmission of an ACK frame, when ACK is not
    1100              :          *     requested in the transmitted frame.
    1101              :          * - Finalization of the reception operation of a requested ACK due to:
    1102              :          *   - ACK timeout expiration.
    1103              :          *   - Reception of an invalid ACK or not an ACK frame.
    1104              :          *   - Reception of the proper ACK, unless the transmitted frame was a Data Request Command
    1105              :          *     and the frame pending bit on the received ACK is set to true. In this case the radio
    1106              :          *     platform implementation SHOULD keep the receiver on until a determined timeout which
    1107              :          *     triggers an idle period start.
    1108              :          * - Finalization of a stand alone CCA task.
    1109              :          * - Finalization of a CCA operation with busy result during CSMA/CA procedure.
    1110              :          * - Finalization of an Energy Detection task.
    1111              :          * - Finalization of a scheduled radio reception window
    1112              :          *     (see @ref IEEE802154_CONFIG_RX_SLOT).
    1113              :          */
    1114              :         IEEE802154_CONFIG_RX_ON_WHEN_IDLE,
    1115              : 
    1116              :         /** Number of types defined in ieee802154_config_type. */
    1117              :         IEEE802154_CONFIG_COMMON_COUNT,
    1118              : 
    1119              :         /** This and higher values are specific to the protocol- or driver-specific extensions. */
    1120              :         IEEE802154_CONFIG_PRIV_START = IEEE802154_CONFIG_COMMON_COUNT,
    1121              : };
    1122              : 
    1123              : /**
    1124              :  * Configuring an RX slot with the start parameter set to this value will cancel
    1125              :  * and delete any previously configured RX slot.
    1126              :  */
    1127            1 : #define IEEE802154_CONFIG_RX_SLOT_NONE -1LL
    1128              : 
    1129              : /**
    1130              :  * Configuring an RX slot with this start parameter while the driver is "down",
    1131              :  * will keep RX off when the driver is being started. Configuring an RX slot
    1132              :  * with this start value while the driver is "up" will immediately switch RX off
    1133              :  * until either the slot is deleted, see @ref IEEE802154_CONFIG_RX_SLOT_NONE or
    1134              :  * a slot with a future start parameter is configured and that start time
    1135              :  * arrives.
    1136              :  */
    1137            1 : #define IEEE802154_CONFIG_RX_SLOT_OFF  0LL
    1138              : 
    1139              : /** IEEE 802.15.4 driver configuration data. */
    1140            1 : struct ieee802154_config {
    1141              :         /** Configuration data. */
    1142              :         union {
    1143              :                 /** see @ref IEEE802154_CONFIG_AUTO_ACK_FPB */
    1144              :                 struct {
    1145            1 :                         bool enabled;                  /**< Is auto ACK FPB enabled */
    1146            1 :                         enum ieee802154_fpb_mode mode; /**< Auto ACK FPB mode */
    1147            1 :                 } auto_ack_fpb;
    1148              : 
    1149              :                 /** see @ref IEEE802154_CONFIG_ACK_FPB */
    1150              :                 struct {
    1151            1 :                         uint8_t *addr; /**< little endian for both short and extended address */
    1152            1 :                         bool extended; /**< Is extended address */
    1153              :                         bool enabled;  /**< Is enabled */
    1154            1 :                 } ack_fpb;
    1155              : 
    1156              :                 /** see @ref IEEE802154_CONFIG_PAN_COORDINATOR */
    1157            1 :                 bool pan_coordinator;
    1158              : 
    1159              :                 /** see @ref IEEE802154_CONFIG_PROMISCUOUS */
    1160            1 :                 bool promiscuous;
    1161              : 
    1162              :                 /** see @ref IEEE802154_CONFIG_RX_ON_WHEN_IDLE */
    1163            1 :                 bool rx_on_when_idle;
    1164              : 
    1165              :                 /** see @ref IEEE802154_CONFIG_EVENT_HANDLER */
    1166            1 :                 ieee802154_event_cb_t event_handler;
    1167              : 
    1168              :                 /**
    1169              :                  * @brief see @ref IEEE802154_CONFIG_MAC_KEYS
    1170              :                  *
    1171              :                  * @details Pointer to an array containing a list of keys used
    1172              :                  * for MAC encryption. Refer to secKeyIdLookupDescriptor and
    1173              :                  * secKeyDescriptor in IEEE 802.15.4
    1174              :                  *
    1175              :                  * The key_value field points to a buffer containing the 16 byte
    1176              :                  * key. The buffer SHALL be copied by the driver before
    1177              :                  * returning from the call.
    1178              :                  *
    1179              :                  * The variable length array is terminated by key_value field
    1180              :                  * set to NULL.
    1181              :                  */
    1182            1 :                 struct ieee802154_key *mac_keys;
    1183              : 
    1184              :                 /** see @ref IEEE802154_CONFIG_FRAME_COUNTER */
    1185            1 :                 uint32_t frame_counter;
    1186              : 
    1187              :                 /** see @ref IEEE802154_CONFIG_RX_SLOT */
    1188              :                 struct {
    1189              :                         /**
    1190              :                          * Nanosecond resolution timestamp relative to the
    1191              :                          * network subsystem's local clock defining the start of
    1192              :                          * the RX window during which the receiver is expected
    1193              :                          * to be listening (i.e. not including any driver
    1194              :                          * startup times).
    1195              :                          *
    1196              :                          * Configuring an rx_slot with the start attribute set
    1197              :                          * to -1 will cancel and delete any previously active rx
    1198              :                          * slot.
    1199              :                          */
    1200            1 :                         net_time_t start;
    1201              : 
    1202              :                         /**
    1203              :                          * Nanosecond resolution duration of the RX window
    1204              :                          * relative to the above RX window start time during
    1205              :                          * which the receiver is expected to be listening (i.e.
    1206              :                          * not including any shutdown times). Only positive
    1207              :                          * values larger than or equal zero are allowed.
    1208              :                          *
    1209              :                          * Setting the duration to zero will disable the
    1210              :                          * receiver, no matter what the start parameter.
    1211              :                          */
    1212            1 :                         net_time_t duration;
    1213              : 
    1214              :                         /**
    1215              :                          * Used channel
    1216              :                          */
    1217            1 :                         uint8_t channel;
    1218            1 :                 } rx_slot;
    1219              : 
    1220              :                 /**
    1221              :                  * see @ref IEEE802154_CONFIG_CSL_PERIOD
    1222              :                  *
    1223              :                  * in CPU byte order
    1224              :                  */
    1225            1 :                 uint32_t csl_period;
    1226              : 
    1227              :                 /**
    1228              :                  * see @ref IEEE802154_CONFIG_EXPECTED_RX_TIME
    1229              :                  */
    1230            1 :                 net_time_t expected_rx_time;
    1231              : 
    1232              :                 /** see @ref IEEE802154_CONFIG_ENH_ACK_HEADER_IE */
    1233              :                 struct {
    1234              :                         /**
    1235              :                          * Pointer to the header IE, see section 7.4.2.1,
    1236              :                          * figure 7-21
    1237              :                          *
    1238              :                          * Certain header IEs may be incomplete if they require
    1239              :                          * timing information to be injected at runtime
    1240              :                          * on-the-fly, see the list in @ref
    1241              :                          * IEEE802154_CONFIG_ENH_ACK_HEADER_IE.
    1242              :                          */
    1243            1 :                         struct ieee802154_header_ie *header_ie;
    1244              : 
    1245              :                         /**
    1246              :                          * Filters the devices that will receive this IE by
    1247              :                          * extended address. MAY be set to NULL to configure a
    1248              :                          * fallback for all devices (implies that short_addr
    1249              :                          * MUST also be set to @ref
    1250              :                          * IEEE802154_BROADCAST_ADDRESS).
    1251              :                          *
    1252              :                          * in big endian
    1253              :                          */
    1254            1 :                         const uint8_t *ext_addr;
    1255              : 
    1256              :                         /**
    1257              :                          * Filters the devices that will receive this IE by
    1258              :                          * short address. MAY be set to @ref
    1259              :                          * IEEE802154_BROADCAST_ADDRESS to configure a fallback
    1260              :                          * for all devices (implies that ext_addr MUST also set
    1261              :                          * to NULL in this case).
    1262              :                          *
    1263              :                          * in CPU byte order
    1264              :                          */
    1265            1 :                         uint16_t short_addr;
    1266              : 
    1267              :                         /**
    1268              :                          * Flag for purging enh ACK header IEs.
    1269              :                          * When flag is set to true, driver should remove all existing
    1270              :                          * header IEs, and all other entries in config should be ignored.
    1271              :                          * This means that purging current header IEs and
    1272              :                          * configuring a new one in the same call is not allowed.
    1273              :                          */
    1274            1 :                         bool purge_ie;
    1275            1 :                 } ack_ie;
    1276            1 :         };
    1277              : };
    1278              : 
    1279              : /**
    1280              :  * @brief IEEE 802.15.4 driver attributes.
    1281              :  *
    1282              :  * See @ref ieee802154_attr_value and @ref ieee802154_radio_api for usage
    1283              :  * details.
    1284              :  */
    1285            1 : enum ieee802154_attr {
    1286              :         /**
    1287              :          * Retrieves a bit field with supported channel pages. This attribute
    1288              :          * SHALL be implemented by all drivers.
    1289              :          */
    1290              :         IEEE802154_ATTR_PHY_SUPPORTED_CHANNEL_PAGES,
    1291              : 
    1292              :         /**
    1293              :          * Retrieves a pointer to the array of supported channel ranges within
    1294              :          * the currently configured channel page. This attribute SHALL be
    1295              :          * implemented by all drivers.
    1296              :          */
    1297              :         IEEE802154_ATTR_PHY_SUPPORTED_CHANNEL_RANGES,
    1298              : 
    1299              :         /**
    1300              :          * Retrieves a bit field with supported HRP UWB nominal pulse repetition
    1301              :          * frequencies. This attribute SHALL be implemented by all devices that
    1302              :          * support channel page four (HRP UWB).
    1303              :          */
    1304              :         IEEE802154_ATTR_PHY_HRP_UWB_SUPPORTED_PRFS,
    1305              : 
    1306              :         /** Number of attributes defined in ieee802154_attr. */
    1307              :         IEEE802154_ATTR_COMMON_COUNT,
    1308              : 
    1309              :         /** This and higher values are specific to the protocol- or
    1310              :          * driver-specific extensions.
    1311              :          */
    1312              :         IEEE802154_ATTR_PRIV_START = IEEE802154_ATTR_COMMON_COUNT,
    1313              : };
    1314              : 
    1315              : /**
    1316              :  * @brief IEEE 802.15.4 driver attribute values.
    1317              :  *
    1318              :  * @details This structure is reserved to scalar and structured attributes that
    1319              :  * originate in the driver implementation and can neither be implemented as
    1320              :  * boolean @ref ieee802154_hw_caps nor be derived directly or indirectly by the
    1321              :  * MAC (L2) layer. In particular this structure MUST NOT be used to return
    1322              :  * configuration data that originate from L2.
    1323              :  *
    1324              :  * @note To keep this union reasonably small, any attribute requiring a large
    1325              :  * memory area, SHALL be provided pointing to static memory allocated by the
    1326              :  * driver and valid throughout the lifetime of the driver instance.
    1327              :  */
    1328            1 : struct ieee802154_attr_value {
    1329              :         union {
    1330              :                 /* TODO: Implement configuration of phyCurrentPage once drivers
    1331              :                  * need to support channel page switching at runtime.
    1332              :                  */
    1333              :                 /**
    1334              :                  * @brief A bit field that represents the supported channel
    1335              :                  * pages, see @ref ieee802154_phy_channel_page.
    1336              :                  *
    1337              :                  * @note To keep the API extensible as required by the standard,
    1338              :                  * supported pages are modeled as a bitmap to support drivers
    1339              :                  * that implement runtime switching between multiple channel
    1340              :                  * pages.
    1341              :                  *
    1342              :                  * @note Currently none of the Zephyr drivers implements more
    1343              :                  * than one channel page at runtime, therefore only one bit will
    1344              :                  * be set and the current channel page (see the PHY PIB
    1345              :                  * attribute phyCurrentPage, section 11.3, table 11-2) is
    1346              :                  * considered to be read-only, fixed and "well known" via the
    1347              :                  * supported channel pages attribute.
    1348              :                  */
    1349            1 :                 uint32_t phy_supported_channel_pages;
    1350              : 
    1351              :                 /**
    1352              :                  * @brief Pointer to a structure representing channel ranges
    1353              :                  * currently available on the selected channel page.
    1354              :                  *
    1355              :                  * @warning The pointer must be valid and constant throughout
    1356              :                  * the life of the interface.
    1357              :                  *
    1358              :                  * @details The selected channel page corresponds to the
    1359              :                  * phyCurrentPage PHY PIB attribute, see the description of
    1360              :                  * phy_supported_channel_pages above. Currently it can be
    1361              :                  * retrieved via the @ref
    1362              :                  * IEEE802154_ATTR_PHY_SUPPORTED_CHANNEL_PAGES attribute.
    1363              :                  *
    1364              :                  * Most drivers will expose a single channel page with a single,
    1365              :                  * often zero-based, fixed channel range.
    1366              :                  *
    1367              :                  * Some notable exceptions:
    1368              :                  * * The legacy channel page (zero) exposes ranges in different
    1369              :                  *   bands and even PHYs that are usually not implemented by a
    1370              :                  *   single driver.
    1371              :                  * * SUN and LECIM PHYs specify a large number of bands and
    1372              :                  *   operating modes on a single page with overlapping channel
    1373              :                  *   ranges each. Some of these ranges are not zero-based or
    1374              :                  *   contain "holes". This explains why several ranges may be
    1375              :                  *   necessary to represent all available channels.
    1376              :                  * * UWB PHYs often support partial channel ranges on the same
    1377              :                  *   channel page depending on the supported bands.
    1378              :                  *
    1379              :                  * In these cases, drivers may expose custom configuration
    1380              :                  * attributes (Kconfig, devicetree, runtime, ...) that allow
    1381              :                  * switching between sub-ranges within the same channel page
    1382              :                  * (e.g. switching between SubG and 2.4G bands on channel page
    1383              :                  * zero or switching between multiple operating modes in the SUN
    1384              :                  * or LECIM PHYs.
    1385              :                  */
    1386            1 :                 const struct ieee802154_phy_supported_channels *phy_supported_channels;
    1387              : 
    1388              :                 /* TODO: Allow the PRF to be configured for each TX call once
    1389              :                  * drivers need to support PRF switching at runtime.
    1390              :                  */
    1391              :                 /**
    1392              :                  * @brief A bit field representing supported HRP UWB pulse
    1393              :                  * repetition frequencies (PRF), see enum
    1394              :                  * ieee802154_phy_hrp_uwb_nominal_prf.
    1395              :                  *
    1396              :                  * @note Currently none of the Zephyr HRP UWB drivers implements
    1397              :                  * more than one nominal PRF at runtime, therefore only one bit
    1398              :                  * will be set and the current PRF (UwbPrf, MCPS-DATA.request,
    1399              :                  * section 8.3.2, table 8-88) is considered to be read-only,
    1400              :                  * fixed and "well known" via the supported PRF attribute.
    1401              :                  */
    1402            1 :                 uint32_t phy_hrp_uwb_supported_nominal_prfs;
    1403            0 :         };
    1404              : };
    1405              : 
    1406              : /**
    1407              :  * @brief Helper function to handle channel page and range to be called from
    1408              :  * drivers' attr_get() implementation. This only applies to drivers with a
    1409              :  * single channel page.
    1410              :  *
    1411              :  * @param attr The attribute to be retrieved.
    1412              :  * @param phy_supported_channel_page The driver's unique channel page.
    1413              :  * @param phy_supported_channels Pointer to the structure that contains the
    1414              :  * driver's channel range or ranges.
    1415              :  * @param value The pointer to the value struct provided by the user.
    1416              :  *
    1417              :  * @retval 0 if the attribute could be resolved
    1418              :  * @retval -ENOENT if the attribute could not be resolved
    1419              :  */
    1420            1 : static inline int ieee802154_attr_get_channel_page_and_range(
    1421              :         enum ieee802154_attr attr,
    1422              :         const enum ieee802154_phy_channel_page phy_supported_channel_page,
    1423              :         const struct ieee802154_phy_supported_channels *phy_supported_channels,
    1424              :         struct ieee802154_attr_value *value)
    1425              : {
    1426              :         switch (attr) {
    1427              :         case IEEE802154_ATTR_PHY_SUPPORTED_CHANNEL_PAGES:
    1428              :                 value->phy_supported_channel_pages = phy_supported_channel_page;
    1429              :                 return 0;
    1430              : 
    1431              :         case IEEE802154_ATTR_PHY_SUPPORTED_CHANNEL_RANGES:
    1432              :                 value->phy_supported_channels = phy_supported_channels;
    1433              :                 return 0;
    1434              : 
    1435              :         default:
    1436              :                 return -ENOENT;
    1437              :         }
    1438              : }
    1439              : 
    1440              : /**
    1441              :  * @brief IEEE 802.15.4 driver interface API.
    1442              :  *
    1443              :  * @note This structure is called "radio" API for backwards compatibility. A
    1444              :  * better name would be "IEEE 802.15.4 driver API" as typical drivers will not
    1445              :  * only implement L1/radio (PHY) features but also L2 (MAC) features if the
    1446              :  * vendor-specific driver hardware or firmware offers offloading opportunities.
    1447              :  *
    1448              :  * @details While L1-level driver features are exclusively implemented by
    1449              :  * drivers and MAY be mandatory to support certain application requirements, L2
    1450              :  * features SHOULD be optional by default and only need to be implemented for
    1451              :  * performance optimization or precise timing as deemed necessary by driver
    1452              :  * maintainers. Fallback implementations ("Soft MAC") SHOULD be provided in the
    1453              :  * driver-independent L2 layer for all L2/MAC features especially if these
    1454              :  * features are not implemented in vendor hardware/firmware by a majority of
    1455              :  * existing in-tree drivers. If, however, a driver offers offloading
    1456              :  * opportunities then L2 implementations SHALL delegate performance critical or
    1457              :  * resource intensive tasks to the driver.
    1458              :  *
    1459              :  * All drivers SHALL support two externally observable interface operational
    1460              :  * states: "UP" and "DOWN". Drivers MAY additionally support a "TESTING"
    1461              :  * interface state (see `continuous_carrier()`).
    1462              :  *
    1463              :  * The following rules apply:
    1464              :  * * An interface is considered "UP" when it is able to transmit and receive
    1465              :  *   packets, "DOWN" otherwise (see precise definitions of the corresponding
    1466              :  *   ifOperStatus values in RFC 2863, section 3.1.14, @ref net_if_oper_state and
    1467              :  *   the `continuous_carrier()` exception below). A device that has its receiver
    1468              :  *   temporarily disabled during "UP" state due to an active receive window
    1469              :  *   configuration is still considered "UP".
    1470              :  * * Upper layers will assume that the interface managed by the driver is "UP"
    1471              :  *   after a call to `start()` returned zero or `-EALREADY`. Upper layers assume
    1472              :  *   that the interface is "DOWN" after calling `stop()` returned zero or
    1473              :  *   `-EALREADY`.
    1474              :  * * The driver SHALL block `start()`/`stop()` calls until the interface fully
    1475              :  *   transitioned to the new state (e.g. the receiver is operational, ongoing
    1476              :  *   transmissions were finished, etc.). Drivers SHOULD yield the calling thread
    1477              :  *   (i.e. "sleep") if waiting for the new state without CPU interaction is
    1478              :  *   possible.
    1479              :  * * Drivers are responsible of guaranteeing atomicity of state changes.
    1480              :  *   Appropriate means of synchronization SHALL be implemented (locking, atomic
    1481              :  *   flags, ...).
    1482              :  * * While the interface is "DOWN", the driver SHALL be placed in the lowest
    1483              :  *   possible power state. The driver MAY return from a call to `stop()` before
    1484              :  *   it reaches the lowest possible power state, i.e. manage power
    1485              :  *   asynchronously.  While the interface is "UP", the driver SHOULD
    1486              :  *   autonomously and asynchronously transition to lower power states whenever
    1487              :  *   possible. If the driver claims to support timed RX/TX capabilities and the
    1488              :  *   upper layers configure an RX slot, then the driver SHALL immediately
    1489              :  *   transition (asynchronously) to the lowest possible power state until the
    1490              :  *   start of the RX slot or until a scheduled packet needs to be transmitted.
    1491              :  * * The driver SHALL NOT change the interface's "UP"/"DOWN" state on its own.
    1492              :  *   Initially, the interface SHALL be in the "DOWN" state.
    1493              :  * * Drivers that implement the optional `continuous_carrier()` operation will
    1494              :  *   be considered to be in the RFC 2863 "testing" ifOperStatus state if that
    1495              :  *   operation returns zero. This state is active until either `start()` or
    1496              :  *   `stop()` is called. If `continuous_carrier()` returns a non-zero value then
    1497              :  *   the previous state is assumed by upper layers.
    1498              :  * * If calls to `start()`/`stop()` return any other value than zero or
    1499              :  *   `-EALREADY`, upper layers will consider the interface to be in a
    1500              :  *   "lowerLayerDown" state as defined in RFC 2863.
    1501              :  * * The RFC 2863 "dormant", "unknown" and "notPresent" ifOperStatus states are
    1502              :  *   currently not supported. The "lowerLevelUp" state.
    1503              :  * * The `ed_scan()`, `cca()` and `tx()` operations SHALL only be supported in
    1504              :  *   the "UP" state and return `-ENETDOWN` in any other state. See the
    1505              :  *   function-level API documentation below for further details.
    1506              :  *
    1507              :  * @note In case of devices that support timed RX/TX, the "UP" state is not
    1508              :  * equal to "receiver enabled". If a receive window (i.e. RX slot, see @ref
    1509              :  * IEEE802154_CONFIG_RX_SLOT) is configured before calling `start()` then the
    1510              :  * receiver will not be enabled when transitioning to the "UP" state.
    1511              :  * Configuring a receive window while the interface is "UP" will cause the
    1512              :  * receiver to be disabled immediately until the configured reception time has
    1513              :  * arrived.
    1514              :  */
    1515            1 : struct ieee802154_radio_api {
    1516              :         /**
    1517              :          * @brief network interface API
    1518              :          *
    1519              :          * @note Network devices must extend the network interface API. It is
    1520              :          * therefore mandatory to place it at the top of the driver API struct so
    1521              :          * that it can be cast to a network interface.
    1522              :          */
    1523            1 :         struct net_if_api iface_api;
    1524              : 
    1525              :         /**
    1526              :          * @brief Get the device driver capabilities.
    1527              :          *
    1528              :          * @note Implementations SHALL be **isr-ok** and MUST NOT **sleep**. MAY
    1529              :          * be called in any interface state once the driver is fully initialized
    1530              :          * ("ready").
    1531              :          *
    1532              :          * @param dev pointer to IEEE 802.15.4 driver device
    1533              :          *
    1534              :          * @return Bit field with all supported device driver capabilities.
    1535              :          */
    1536              :         enum ieee802154_hw_caps (*get_capabilities)(const struct device *dev);
    1537              : 
    1538              :         /**
    1539              :          * @brief Clear Channel Assessment - Check channel's activity
    1540              :          *
    1541              :          * @note Implementations SHALL be **isr-ok** and MAY **sleep**. SHALL
    1542              :          * return -ENETDOWN unless the interface is "UP".
    1543              :          *
    1544              :          * @param dev pointer to IEEE 802.15.4 driver device
    1545              :          *
    1546              :          * @retval 0 the channel is available
    1547              :          * @retval -EBUSY The channel is busy.
    1548              :          * @retval -EWOULDBLOCK The operation is called from ISR context but
    1549              :          * temporarily cannot be executed without blocking.
    1550              :          * @retval -ENETDOWN The interface is not "UP".
    1551              :          * @retval -ENOTSUP CCA is not supported by this driver.
    1552              :          * @retval -EIO The CCA procedure could not be executed.
    1553              :          */
    1554            1 :         int (*cca)(const struct device *dev);
    1555              : 
    1556              :         /**
    1557              :          * @brief Set current channel
    1558              :          *
    1559              :          * @note Implementations SHALL be **isr-ok** and MAY **sleep**. SHALL
    1560              :          * return -EIO unless the interface is either "UP" or "DOWN".
    1561              :          *
    1562              :          * @param dev pointer to IEEE 802.15.4 driver device
    1563              :          * @param channel the number of the channel to be set in CPU byte order
    1564              :          *
    1565              :          * @retval 0 channel was successfully set
    1566              :          * @retval -EALREADY The previous channel is the same as the requested
    1567              :          * channel.
    1568              :          * @retval -EINVAL The given channel is not within the range of valid
    1569              :          * channels of the driver's current channel page, see the
    1570              :          * IEEE802154_ATTR_PHY_SUPPORTED_CHANNEL_RANGES driver attribute.
    1571              :          * @retval -EWOULDBLOCK The operation is called from ISR context but
    1572              :          * temporarily cannot be executed without blocking.
    1573              :          * @retval -ENOTSUP The given channel is within the range of valid
    1574              :          * channels of the driver's current channel page but unsupported by the
    1575              :          * current driver.
    1576              :          * @retval -EIO The channel could not be set.
    1577              :          */
    1578            1 :         int (*set_channel)(const struct device *dev, uint16_t channel);
    1579              : 
    1580              :         /**
    1581              :          * @brief Set/Unset PAN ID, extended or short address filters.
    1582              :          *
    1583              :          * @note requires IEEE802154_HW_FILTER capability.
    1584              :          *
    1585              :          * @note Implementations SHALL be **isr-ok** and MAY **sleep**. SHALL
    1586              :          * return -EIO unless the interface is either "UP" or "DOWN".
    1587              :          *
    1588              :          * @param dev pointer to IEEE 802.15.4 driver device
    1589              :          * @param set true to set the filter, false to remove it
    1590              :          * @param type the type of entity to be added/removed from the filter
    1591              :          * list (a PAN ID or a source/destination address)
    1592              :          * @param filter the entity to be added/removed from the filter list
    1593              :          *
    1594              :          * @retval 0 The filter was successfully added/removed.
    1595              :          * @retval -EINVAL The given filter entity or filter entity type
    1596              :          * was not valid.
    1597              :          * @retval -EWOULDBLOCK The operation is called from ISR context but
    1598              :          * temporarily cannot be executed without blocking.
    1599              :          * @retval -ENOTSUP Setting/removing this filter or filter type
    1600              :          * is not supported by this driver.
    1601              :          * @retval -EIO Error while setting/removing the filter.
    1602              :          */
    1603            1 :         int (*filter)(const struct device *dev,
    1604              :                       bool set,
    1605              :                       enum ieee802154_filter_type type,
    1606              :                       const struct ieee802154_filter *filter);
    1607              : 
    1608              :         /**
    1609              :          * @brief Set TX power level in dbm
    1610              :          *
    1611              :          * @note Implementations SHALL be **isr-ok** and MAY **sleep**. SHALL
    1612              :          * return -EIO unless the interface is either "UP" or "DOWN".
    1613              :          *
    1614              :          * @param dev pointer to IEEE 802.15.4 driver device
    1615              :          * @param dbm TX power in dbm
    1616              :          *
    1617              :          * @retval 0 The TX power was successfully set.
    1618              :          * @retval -EINVAL The given dbm value is invalid or not supported by
    1619              :          * the driver.
    1620              :          * @retval -EWOULDBLOCK The operation is called from ISR context but
    1621              :          * temporarily cannot be executed without blocking.
    1622              :          * @retval -EIO The TX power could not be set.
    1623              :          */
    1624            1 :         int (*set_txpower)(const struct device *dev, int16_t dbm);
    1625              : 
    1626              :         /**
    1627              :          * @brief Transmit a packet fragment as a single frame
    1628              :          *
    1629              :          * @details Depending on the level of offloading features supported by
    1630              :          * the driver, the frame MAY not be fully encrypted/authenticated or it
    1631              :          * MAY not contain an FCS. It is the responsibility of L2
    1632              :          * implementations to prepare the frame according to the offloading
    1633              :          * capabilities announced by the driver and to decide whether CCA,
    1634              :          * CSMA/CA, ACK or retransmission procedures need to be executed outside
    1635              :          * ("soft MAC") or inside ("hard MAC") the driver .
    1636              :          *
    1637              :          * All frames originating from L2 SHALL have all required IEs
    1638              :          * pre-allocated and pre-filled such that the driver does not have to
    1639              :          * parse and manipulate IEs at all. This includes ACK packets if the
    1640              :          * driver does not have the @ref IEEE802154_HW_RX_TX_ACK capability.
    1641              :          * Also see @ref IEEE802154_CONFIG_ENH_ACK_HEADER_IE for drivers that
    1642              :          * have the @ref IEEE802154_HW_RX_TX_ACK capability.
    1643              :          *
    1644              :          * IEs that cannot be prepared by L2 unless the TX time is known (e.g.
    1645              :          * CSL IE, Rendezvous Time IE, Time Correction IE, ...) SHALL be sent in
    1646              :          * any of the timed TX modes with appropriate timing information
    1647              :          * pre-filled in the IE such that drivers do not have to parse and
    1648              :          * manipulate IEs at all unless the frame is generated by the driver
    1649              :          * itself.
    1650              :          *
    1651              :          * In case any of the timed TX modes is supported and used (see @ref
    1652              :          * ieee802154_hw_caps and @ref ieee802154_tx_mode), the driver SHALL
    1653              :          * take responsibility of scheduling and sending the packet at the
    1654              :          * precise programmed time autonomously without further interaction by
    1655              :          * upper layers. The call to `tx()` will block until the package has
    1656              :          * either been sent successfully (possibly including channel acquisition
    1657              :          * and packet acknowledgment) or a terminal transmission error occurred.
    1658              :          * The driver SHALL sleep and keep power consumption to the lowest
    1659              :          * possible level until the scheduled transmission time arrives or
    1660              :          * during any other idle waiting time.
    1661              :          *
    1662              :          * @warning The driver SHALL NOT take ownership of the given network
    1663              :          * packet and frame (fragment) buffer. Any data required by the driver
    1664              :          * including the actual frame content must be read synchronously and
    1665              :          * copied internally if needed at a later time (e.g. the contents of IEs
    1666              :          * required for protocol configuration, states of frame counters,
    1667              :          * sequence numbers, etc). Both, the packet and the buffer MAY be
    1668              :          * re-used or released by upper layers immediately after the function
    1669              :          * returns.
    1670              :          *
    1671              :          * @note Implementations MAY **sleep** and will usually NOT be
    1672              :          * **isr-ok** - especially when timed TX, CSMA/CA, retransmissions,
    1673              :          * auto-ACK or any other offloading feature is supported that implies
    1674              :          * considerable idle waiting time. SHALL return `-ENETDOWN` unless the
    1675              :          * interface is "UP".
    1676              :          *
    1677              :          * @note The transmission occurs on the radio channel set by the call to
    1678              :          * `set_channel()`. However, if the `CONFIG_IEEE802154_SELECTIVE_TXCHANNEL`
    1679              :          * is set and the driver has the capability `IEEE802154_HW_SELECTIVE_TXCHANNEL`
    1680              :          * then the transmissions requested with `mode` IEEE802154_TX_MODE_TXTIME
    1681              :          * or `IEEE802154_TX_MODE_TXTIME_CCA` SHALL use the radio channel
    1682              :          * returned by `net_pkt_ieee802154_txchannel()` to transmit the packet
    1683              :          * and receive an ACK on that channel if the frame requested it. After
    1684              :          * the operation the driver should return to the channel set previously by
    1685              :          * `set_channel()` call.
    1686              :          * It is responsibility of an upper layer to set the required radio channel
    1687              :          * for the packet by a call to `net_pkt_set_ieee802154_txchannel()`.
    1688              :          * This feature allows CSL transmissions as stated in IEEE 802.15.4-2020
    1689              :          * chapter 6.12.2.7 CSL over multiple channels. This feature allows to perform
    1690              :          * a switch of the radio channel as late as possible before transmission without
    1691              :          * interrupting possible reception that could occur if separate `set_channel()`
    1692              :          * was called.
    1693              :          *
    1694              :          * @param dev pointer to IEEE 802.15.4 driver device
    1695              :          * @param mode the transmission mode, some of which require specific
    1696              :          * offloading capabilities.
    1697              :          * @param pkt pointer to the network packet to be transmitted.
    1698              :          * @param frag pointer to a network buffer containing a single fragment
    1699              :          * with the frame data to be transmitted
    1700              :          *
    1701              :          * @retval 0 The frame was successfully sent or scheduled. If the driver
    1702              :          * supports ACK offloading and the frame requested acknowledgment (AR bit
    1703              :          * set), this means that the packet was successfully acknowledged by its
    1704              :          * peer.
    1705              :          * @retval -EINVAL Invalid packet (e.g. an expected IE is missing or the
    1706              :          * encryption/authentication state is not as expected).
    1707              :          * @retval -EBUSY The frame could not be sent because the medium was
    1708              :          * busy (CSMA/CA or CCA offloading feature only).
    1709              :          * @retval -ENOMSG The frame was not confirmed by an ACK packet (TX ACK
    1710              :          * offloading feature only) or the received ACK packet was invalid.
    1711              :          * @retval -ENOBUFS The frame could not be scheduled due to missing
    1712              :          * internal resources (timed TX offloading feature only).
    1713              :          * @retval -ENETDOWN The interface is not "UP".
    1714              :          * @retval -ENOTSUP The given TX mode is not supported.
    1715              :          * @retval -EIO The frame could not be sent due to some unspecified
    1716              :          * driver error (e.g. the driver being busy).
    1717              :          */
    1718            1 :         int (*tx)(const struct device *dev, enum ieee802154_tx_mode mode,
    1719              :                   struct net_pkt *pkt, struct net_buf *frag);
    1720              : 
    1721              :         /**
    1722              :          * @brief Start the device.
    1723              :          *
    1724              :          * @details Upper layers will assume the interface is "UP" if this
    1725              :          * operation returns with zero or `-EALREADY`. The interface is placed
    1726              :          * in receive mode before returning from this operation unless an RX
    1727              :          * slot has been configured (even if it lies in the past, see @ref
    1728              :          * IEEE802154_CONFIG_RX_SLOT).
    1729              :          *
    1730              :          * @note Implementations SHALL be **isr-ok** and MAY **sleep**. MAY be
    1731              :          * called in any interface state once the driver is fully initialized
    1732              :          * ("ready").
    1733              :          *
    1734              :          * @param dev pointer to IEEE 802.15.4 driver device
    1735              :          *
    1736              :          * @retval 0 The driver was successfully started.
    1737              :          * @retval -EALREADY The driver was already "UP".
    1738              :          * @retval -EWOULDBLOCK The operation is called from ISR context but
    1739              :          * temporarily cannot be executed without blocking.
    1740              :          * @retval -EIO The driver could not be started.
    1741              :          */
    1742            1 :         int (*start)(const struct device *dev);
    1743              : 
    1744              :         /**
    1745              :          * @brief Stop the device.
    1746              :          *
    1747              :          * @details Upper layers will assume the interface is "DOWN" if this
    1748              :          * operation returns with zero or `-EALREADY`. The driver switches off
    1749              :          * the receiver before returning if it was previously on. The driver
    1750              :          * enters the lowest possible power mode after this operation is called.
    1751              :          * This MAY happen asynchronously (i.e. after the operation already
    1752              :          * returned control).
    1753              :          *
    1754              :          * @note Implementations SHALL be **isr-ok** and MAY **sleep**. MAY be
    1755              :          * called in any interface state once the driver is fully initialized
    1756              :          * ("ready").
    1757              :          *
    1758              :          * @param dev pointer to IEEE 802.15.4 driver device
    1759              :          *
    1760              :          * @retval 0 The driver was successfully stopped.
    1761              :          * @retval -EWOULDBLOCK The operation is called from ISR context but
    1762              :          * temporarily cannot be executed without blocking.
    1763              :          * @retval -EALREADY The driver was already "DOWN".
    1764              :          * @retval -EIO The driver could not be stopped.
    1765              :          */
    1766            1 :         int (*stop)(const struct device *dev);
    1767              : 
    1768              : #if defined(CONFIG_IEEE802154_CARRIER_FUNCTIONS)
    1769              :         /**
    1770              :          * @brief Start continuous carrier wave transmission.
    1771              :          *
    1772              :          * @details The method blocks until the interface has started to emit a
    1773              :          * continuous carrier. To leave this mode, `start()` or `stop()` should
    1774              :          * be called, which will put the driver back into the "UP" or "DOWN"
    1775              :          * states, respectively.
    1776              :          *
    1777              :          * @note Implementations MAY **sleep** and will usually NOT be
    1778              :          * **isr-ok**. MAY be called in any interface state once the driver is
    1779              :          * fully initialized ("ready").
    1780              :          *
    1781              :          * @param dev pointer to IEEE 802.15.4 driver device
    1782              :          *
    1783              :          * @retval 0 continuous carrier wave transmission started
    1784              :          * @retval -EALREADY The driver was already in "TESTING" state and
    1785              :          * emitting a continuous carrier.
    1786              :          * @retval -EIO not started
    1787              :          */
    1788              :         int (*continuous_carrier)(const struct device *dev);
    1789              : 
    1790              :         /**
    1791              :          * @brief Start modulated carrier wave transmission.
    1792              :          *
    1793              :          * @details When the radio is emitting modulated carrier signals, it
    1794              :          * blocks all transmissions on the selected channel.
    1795              :          * This function is to be called only during radio
    1796              :          * tests. Do not use it during normal device operation.
    1797              :          *
    1798              :          * @note Implementations MAY **sleep** and will usually NOT be
    1799              :          * **isr-ok**. MAY be called in any interface state once the driver is
    1800              :          * fully initialized ("ready").
    1801              :          *
    1802              :          * @param dev pointer to IEEE 802.15.4 driver device
    1803              :          * @param data Pointer to a buffer to modulate the carrier with.
    1804              :          * The first byte is the data length.
    1805              :          *
    1806              :          * @retval 0 modulated carrier wave transmission started
    1807              :          * @retval -EALREADY The driver was already in "TESTING" state and
    1808              :          * emitting a modulated carrier.
    1809              :          * @retval -EIO not started
    1810              :          */
    1811              :         int (*modulated_carrier)(const struct device *dev, const uint8_t *data);
    1812              : #endif /* CONFIG_IEEE802154_CARRIER_FUNCTIONS */
    1813              : 
    1814              :         /**
    1815              :          * @brief Set or update driver configuration.
    1816              :          *
    1817              :          * @details The method blocks until the interface has been reconfigured
    1818              :          * atomically with respect to ongoing package reception, transmission or
    1819              :          * any other ongoing driver operation.
    1820              :          *
    1821              :          * @note Implementations SHALL be **isr-ok** and MAY **sleep**. MAY be
    1822              :          * called in any interface state once the driver is fully initialized
    1823              :          * ("ready"). Some configuration options may not be supported in all
    1824              :          * interface operational states, see the detailed specifications in @ref
    1825              :          * ieee802154_config_type. In this case the operation returns `-EACCES`.
    1826              :          *
    1827              :          * @param dev pointer to IEEE 802.15.4 driver device
    1828              :          * @param type the configuration type to be set
    1829              :          * @param config the configuration parameters to be set for the given
    1830              :          * configuration type
    1831              :          *
    1832              :          * @retval 0 configuration successful
    1833              :          * @retval -EINVAL The configuration parameters are invalid for the
    1834              :          * given configuration type.
    1835              :          * @retval -ENOTSUP The given configuration type is not supported by
    1836              :          * this driver.
    1837              :          * @retval -EACCES The given configuration type is supported by this
    1838              :          * driver but cannot be configured in the current interface operational
    1839              :          * state.
    1840              :          * @retval -ENOMEM The configuration cannot be saved due to missing
    1841              :          * memory resources.
    1842              :          * @retval -ENOENT The resource referenced in the configuration
    1843              :          * parameters cannot be found in the configuration.
    1844              :          * @retval -EWOULDBLOCK The operation is called from ISR context but
    1845              :          * temporarily cannot be executed without blocking.
    1846              :          * @retval -EIO An internal error occurred while trying to configure the
    1847              :          * given configuration parameter.
    1848              :          */
    1849            1 :         int (*configure)(const struct device *dev,
    1850              :                          enum ieee802154_config_type type,
    1851              :                          const struct ieee802154_config *config);
    1852              : 
    1853              :         /**
    1854              :          * @brief Run an energy detection scan.
    1855              :          *
    1856              :          * @note requires IEEE802154_HW_ENERGY_SCAN capability
    1857              :          *
    1858              :          * @note The radio channel must be set prior to calling this function.
    1859              :          *
    1860              :          * @note Implementations SHALL be **isr-ok** and MAY **sleep**. SHALL
    1861              :          * return `-ENETDOWN` unless the interface is "UP".
    1862              :          *
    1863              :          * @param dev pointer to IEEE 802.15.4 driver device
    1864              :          * @param duration duration of energy scan in ms
    1865              :          * @param done_cb function called when the energy scan has finished
    1866              :          *
    1867              :          * @retval 0 the energy detection scan was successfully scheduled
    1868              :          *
    1869              :          * @retval -EBUSY the energy detection scan could not be scheduled at
    1870              :          * this time
    1871              :          * @retval -EALREADY a previous energy detection scan has not finished
    1872              :          * yet.
    1873              :          * @retval -ENETDOWN The interface is not "UP".
    1874              :          * @retval -ENOTSUP This driver does not support energy scans.
    1875              :          * @retval -EIO The energy detection procedure could not be executed.
    1876              :          */
    1877            1 :         int (*ed_scan)(const struct device *dev,
    1878              :                        uint16_t duration,
    1879              :                        energy_scan_done_cb_t done_cb);
    1880              : 
    1881              :         /**
    1882              :          * @brief Get the current time in nanoseconds relative to the network
    1883              :          * subsystem's local uptime clock as represented by this network
    1884              :          * interface.
    1885              :          *
    1886              :          * See @ref net_time_t for semantic details.
    1887              :          *
    1888              :          * @note requires IEEE802154_HW_TXTIME and/or IEEE802154_HW_RXTIME
    1889              :          * capabilities. Implementations SHALL be **isr-ok** and MUST NOT
    1890              :          * **sleep**. MAY be called in any interface state once the driver is
    1891              :          * fully initialized ("ready").
    1892              :          *
    1893              :          * @param dev pointer to IEEE 802.15.4 driver device
    1894              :          *
    1895              :          * @return nanoseconds relative to the network subsystem's local clock,
    1896              :          * -1 if an error occurred or the operation is not supported
    1897              :          */
    1898            1 :         net_time_t (*get_time)(const struct device *dev);
    1899              : 
    1900              :         /**
    1901              :          * @brief Get the current estimated worst case accuracy (maximum ±
    1902              :          * deviation from the nominal frequency) of the network subsystem's
    1903              :          * local clock used to calculate tolerances and guard times when
    1904              :          * scheduling delayed receive or transmit radio operations.
    1905              :          *
    1906              :          * The deviation is given in units of PPM (parts per million).
    1907              :          *
    1908              :          * @note requires IEEE802154_HW_TXTIME and/or IEEE802154_HW_RXTIME
    1909              :          * capabilities.
    1910              :          *
    1911              :          * @note Implementations may estimate this value based on current
    1912              :          * operating conditions (e.g. temperature). Implementations SHALL be
    1913              :          * **isr-ok** and MUST NOT **sleep**. MAY be called in any interface
    1914              :          * state once the driver is fully initialized ("ready").
    1915              :          *
    1916              :          * @param dev pointer to IEEE 802.15.4 driver device
    1917              :          *
    1918              :          * @return current estimated clock accuracy in PPM
    1919              :          */
    1920            1 :         uint8_t (*get_sch_acc)(const struct device *dev);
    1921              : 
    1922              :         /**
    1923              :          * @brief Get the value of a driver specific attribute.
    1924              :          *
    1925              :          * @note This function SHALL NOT return any values configurable by the
    1926              :          * MAC (L2) layer. It is reserved to non-boolean (i.e. scalar or
    1927              :          * structured) attributes that originate from the driver implementation
    1928              :          * and cannot be directly or indirectly derived by L2. Boolean
    1929              :          * attributes SHALL be implemented as @ref ieee802154_hw_caps.
    1930              :          *
    1931              :          * @note Implementations SHALL be **isr-ok** and MUST NOT **sleep**. MAY
    1932              :          * be called in any interface state once the driver is fully initialized
    1933              :          * ("ready").
    1934              :          *
    1935              :          * @retval 0 The requested attribute is supported by the driver and the
    1936              :          * value can be retrieved from the corresponding @ref ieee802154_attr_value
    1937              :          * member.
    1938              :          *
    1939              :          * @retval -ENOENT The driver does not provide the requested attribute.
    1940              :          * The value structure has not been updated with attribute data. The
    1941              :          * content of the value attribute is undefined.
    1942              :          */
    1943            1 :         int (*attr_get)(const struct device *dev,
    1944              :                         enum ieee802154_attr attr,
    1945              :                         struct ieee802154_attr_value *value);
    1946              : };
    1947              : 
    1948              : /* Make sure that the network interface API is properly setup inside
    1949              :  * IEEE 802.15.4 driver API struct (it is the first one).
    1950              :  */
    1951              : BUILD_ASSERT(offsetof(struct ieee802154_radio_api, iface_api) == 0);
    1952              : 
    1953              : /** @} */
    1954              : 
    1955              : /**
    1956              :  * @name IEEE 802.15.4 driver utils
    1957              :  * @{
    1958              :  */
    1959              : 
    1960              : /** @cond INTERNAL_HIDDEN */
    1961              : #define IEEE802154_AR_FLAG_SET (0x20)
    1962              : /** INTERNAL_HIDDEN @endcond */
    1963              : 
    1964              : /**
    1965              :  * @brief Check if the AR flag is set on the frame inside the given @ref
    1966              :  * net_pkt.
    1967              :  *
    1968              :  * @param frag A valid pointer on a net_buf structure, must not be NULL,
    1969              :  *        and its length should be at least 1 byte (ImmAck frames are the
    1970              :  *        shortest supported frames with 3 bytes excluding FCS).
    1971              :  *
    1972              :  * @return true if AR flag is set, false otherwise
    1973              :  */
    1974            1 : static inline bool ieee802154_is_ar_flag_set(struct net_buf *frag)
    1975              : {
    1976              :         return (*frag->data & IEEE802154_AR_FLAG_SET);
    1977              : }
    1978              : 
    1979              : /** @} */
    1980              : 
    1981              : /**
    1982              :  * @name IEEE 802.15.4 driver callbacks
    1983              :  * @{
    1984              :  */
    1985              : 
    1986              : /* TODO: Fix drivers to either unref the packet before they return NET_OK or to
    1987              :  * return NET_CONTINUE instead. See note below.
    1988              :  */
    1989              : /**
    1990              :  * @brief IEEE 802.15.4 driver ACK handling callback into L2 that drivers must
    1991              :  *        call when receiving an ACK package.
    1992              :  *
    1993              :  * @details The IEEE 802.15.4 standard prescribes generic procedures for ACK
    1994              :  *          handling on L2 (MAC) level. L2 stacks therefore have to provides a
    1995              :  *          fast and re-usable generic implementation of this callback for
    1996              :  *          drivers to call when receiving an ACK packet.
    1997              :  *
    1998              :  *          Note: This function is part of Zephyr's 802.15.4 stack driver -> L2
    1999              :  *          "inversion-of-control" adaptation API and must be implemented by all
    2000              :  *          IEEE 802.15.4 L2 stacks.
    2001              :  *
    2002              :  * @param iface A valid pointer on a network interface that received the packet
    2003              :  * @param pkt A valid pointer on a packet to check
    2004              :  *
    2005              :  * @return NET_OK if L2 handles the ACK package, NET_CONTINUE or NET_DROP otherwise.
    2006              :  *
    2007              :  * @warning Deviating from other functions in the net stack returning
    2008              :  * net_verdict, this function will not unref the package even if it returns
    2009              :  * NET_OK.
    2010              :  */
    2011            1 : extern enum net_verdict ieee802154_handle_ack(struct net_if *iface, struct net_pkt *pkt);
    2012              : 
    2013              : /**
    2014              :  * @brief IEEE 802.15.4 driver initialization callback into L2 called by drivers
    2015              :  *        to initialize the active L2 stack for a given interface.
    2016              :  *
    2017              :  * @details Drivers must call this function as part of their own initialization
    2018              :  *          routine.
    2019              :  *
    2020              :  *          Note: This function is part of Zephyr's 802.15.4 stack driver -> L2
    2021              :  *          "inversion-of-control" adaptation API and must be implemented by all
    2022              :  *          IEEE 802.15.4 L2 stacks.
    2023              :  *
    2024              :  * @param iface A valid pointer on a network interface
    2025              :  */
    2026              : #ifndef CONFIG_IEEE802154_RAW_MODE
    2027            1 : extern void ieee802154_init(struct net_if *iface);
    2028              : #else
    2029              : #define ieee802154_init(_iface_)
    2030              : #endif /* CONFIG_IEEE802154_RAW_MODE */
    2031              : 
    2032              : /** @} */
    2033              : 
    2034              : #ifdef __cplusplus
    2035              : }
    2036              : #endif
    2037              : 
    2038              : /**
    2039              :  * @}
    2040              :  */
    2041              : 
    2042              : #endif /* ZEPHYR_INCLUDE_NET_IEEE802154_RADIO_H_ */
        

Generated by: LCOV version 2.0-1