Line data Source code
1 1 : /* 2 : * Copyright (c) 2023 Nordic Semiconductor ASA 3 : * 4 : * SPDX-License-Identifier: Apache-2.0 5 : */ 6 : 7 : /** 8 : * @file 9 : * @brief This file extends interface of ieee802154_radio.h for OpenThread. 10 : */ 11 : 12 : #ifndef ZEPHYR_INCLUDE_NET_IEEE802154_RADIO_OPENTHREAD_H_ 13 : #define ZEPHYR_INCLUDE_NET_IEEE802154_RADIO_OPENTHREAD_H_ 14 : 15 : #include <zephyr/net/ieee802154_radio.h> 16 : 17 : /** Bit number starting the OpenThread specific capabilities of ieee802154 driver. */ 18 1 : #define IEEE802154_OPENTHREAD_HW_CAPS_BITS_START IEEE802154_HW_CAPS_BITS_PRIV_START 19 : 20 : /** 21 : * OpenThread specific capabilities of ieee802154 driver. 22 : * This type extends @ref ieee802154_hw_caps. 23 : */ 24 1 : enum ieee802154_openthread_hw_caps { 25 : /** Capability to transmit with @ref IEEE802154_OPENTHREAD_TX_MODE_TXTIME_MULTIPLE_CCA 26 : * mode. 27 : */ 28 : IEEE802154_OPENTHREAD_HW_MULTIPLE_CCA = BIT(IEEE802154_OPENTHREAD_HW_CAPS_BITS_START), 29 : 30 : /** Capability to support CST-related features. 31 : * 32 : * The CST-related features are described by "Specification changes for Thread-in-Mobile" 33 : * Draft version 1, July 11, 2024. The CST allows to transmit a frame with CST Phase and 34 : * CST Period IEs as described by chapter 4.6.6.1 of the Thread-in-Mobile specification 35 : * change. The upper layer implementation (OpenThread) is responsible for preparing 36 : * a frame to be transmitted that contains placeholders where the CST Phase and CST Period 37 : * are to be placed. The implementation of a driver is responsible for injecting 38 : * correct value for CST Phase IE and CST Period IE based on configuration parameters 39 : * @ref IEEE802154_OPENTHREAD_CONFIG_CST_PERIOD and 40 : * @ref IEEE802154_OPENTHREAD_CONFIG_EXPECTED_TX_TIME. 41 : * 42 : * @note The CST transmission in its design is very similar to CSL reception. 43 : * In the CSL reception the receiver side informs its peer about the moment in time 44 : * when it will be able to receive. In the CST transmission the transmitter side informs 45 : * its peer about the moment in time when the next transmission will occur. 46 : */ 47 : IEEE802154_OPENTHREAD_HW_CST = BIT(IEEE802154_OPENTHREAD_HW_CAPS_BITS_START + 1), 48 : }; 49 : 50 : /** @brief TX mode */ 51 1 : enum ieee802154_openthread_tx_mode { 52 : /** 53 : * The @ref IEEE802154_OPENTHREAD_TX_MODE_TXTIME_MULTIPLE_CCA mode allows to send 54 : * a scheduled packet if the channel is reported idle after at most 55 : * 1 + max_extra_cca_attempts CCAs performed back-to-back. 56 : * 57 : * This mode is a non-standard experimental OpenThread feature. It allows transmission 58 : * of a packet within a certain time window. 59 : * The earliest transmission time is specified as in the other TXTIME modes: 60 : * When the first CCA reports an idle channel then the first symbol of the packet's PHR 61 : * SHALL be present at the local antenna at the time represented by the scheduled 62 : * TX timestamp (referred to as T_tx below). 63 : * 64 : * If the first CCA reports a busy channel, then additional CCAs up to 65 : * max_extra_cca_attempts will be done until one of them reports an idle channel and 66 : * the packet is sent out or the max number of attempts is reached in which case 67 : * the transmission fails. 68 : * 69 : * The timing of these additional CCAs depends on the capabilities of the driver 70 : * which reports them in the T_recca and T_ccatx driver attributes 71 : * (see @ref IEEE802154_OPENTHREAD_ATTR_T_RECCA and 72 : * @ref IEEE802154_OPENTHREAD_ATTR_T_CCATX). Based on these attributes the upper layer 73 : * can calculate the latest point in time (T_txmax) that the first symbol of the scheduled 74 : * packet's PHR SHALL be present at the local antenna: 75 : * 76 : * T_maxtxdelay = max_extra_cca_attempts * (aCcaTime + T_recca) - T_recca + T_ccatx 77 : * T_txmax = T_tx + T_maxtxdelay 78 : * 79 : * See IEEE 802.15.4-2020, section 11.3, table 11-1 for the definition of aCcaTime. 80 : * 81 : * Drivers implementing this TX mode SHOULD keep T_recca and T_ccatx as short as possible. 82 : * T_ccatx SHALL be less than or equal aTurnaroundTime as defined in ibid., 83 : * section 11.3, table 11-1. 84 : * 85 : * CCA SHALL be executed as defined by the phyCcaMode PHY PIB attribute (see ibid., 86 : * section 11.3, table 11-2). 87 : * 88 : * Requires IEEE802154_OPENTHREAD_HW_MULTIPLE_CCA capability. 89 : * 90 : * @note Capability @ref IEEE802154_HW_SELECTIVE_TXCHANNEL applies as for 91 : * @ref IEEE802154_TX_MODE_TXTIME_CCA. 92 : */ 93 : IEEE802154_OPENTHREAD_TX_MODE_TXTIME_MULTIPLE_CCA = IEEE802154_TX_MODE_PRIV_START 94 : }; 95 : 96 : /** 97 : * OpenThread specific configuration types of ieee802154 driver. 98 : * This type extends @ref ieee802154_config_type. 99 : */ 100 1 : enum ieee802154_openthread_config_type { 101 : /** Allows to configure extra CCA for transmission requested with mode 102 : * @ref IEEE802154_OPENTHREAD_TX_MODE_TXTIME_MULTIPLE_CCA. 103 : * Requires IEEE802154_OPENTHREAD_HW_MULTIPLE_CCA capability. 104 : */ 105 : IEEE802154_OPENTHREAD_CONFIG_MAX_EXTRA_CCA_ATTEMPTS = IEEE802154_CONFIG_PRIV_START, 106 : 107 : /** Configures the CST period of a device. 108 : * 109 : * When a frame containing CST Period IE is about to be transmitted by a driver, 110 : * the driver SHALL inject the CST Period value to the CST Period IE based on 111 : * the value of this configuration parameter. 112 : * 113 : * Requires IEEE802154_OPENTHREAD_HW_CST capability. 114 : */ 115 : IEEE802154_OPENTHREAD_CONFIG_CST_PERIOD, 116 : 117 : /** Configure a point in time at which a TX frame is expected to be transmitted. 118 : * 119 : * When a frame containing CST Phase IE is about to be transmitted by a driver, 120 : * the driver SHALL inject the CST Phase IE value to the CST Phase IE based on 121 : * the value of this configuration parameter parameter, the time of transmission 122 : * and the CST Period value. 123 : * 124 : * This parameter configures the nanosecond resolution timepoint relative to 125 : * the network subsystem's local clock at which a TX frame's end of SFD 126 : * (i.e. equivalently its end of SHR, start of PHR) is expected to be transmitted 127 : * at the local antenna. 128 : * 129 : * Requires IEEE802154_OPENTHREAD_HW_CST capability. 130 : */ 131 : IEEE802154_OPENTHREAD_CONFIG_EXPECTED_TX_TIME, 132 : }; 133 : 134 : /** 135 : * Thread vendor OUI for vendor specific header or nested information elements, 136 : * see IEEE 802.15.4-2020, sections 7.4.2.2 and 7.4.4.30. 137 : * 138 : * in little endian 139 : */ 140 1 : #define IEEE802154_OPENTHREAD_THREAD_IE_VENDOR_OUI { 0x9b, 0xb8, 0xea } 141 : 142 : /** length of IEEE 802.15.4-2020 vendor OUIs */ 143 1 : #define IEEE802154_OPENTHREAD_VENDOR_OUI_LEN 3 144 : 145 : /** OpenThread specific configuration data of ieee802154 driver. */ 146 1 : struct ieee802154_openthread_config { 147 : union { 148 : /** Common configuration */ 149 1 : struct ieee802154_config common; 150 : 151 : /** ``IEEE802154_OPENTHREAD_CONFIG_MAX_EXTRA_CCA_ATTEMPTS`` 152 : * 153 : * The maximum number of extra CCAs to be performed when transmission is 154 : * requested with mode @ref IEEE802154_OPENTHREAD_TX_MODE_TXTIME_MULTIPLE_CCA. 155 : */ 156 1 : uint8_t max_extra_cca_attempts; 157 : 158 : /** ``IEEE802154_OPENTHREAD_CONFIG_CST_PERIOD`` 159 : * 160 : * The CST period (in CPU byte order). 161 : */ 162 1 : uint32_t cst_period; 163 : 164 : /** ``IEEE802154_OPENTHREAD_CONFIG_EXPECTED_TX_TIME`` 165 : * 166 : * A point in time at which a TX frame is expected to be transmitted. 167 : */ 168 1 : net_time_t expected_tx_time; 169 0 : }; 170 : }; 171 : 172 : /** 173 : * OpenThread specific attributes of ieee802154 driver. 174 : * This type extends @ref ieee802154_attr 175 : */ 176 1 : enum ieee802154_openthread_attr { 177 : 178 : /** Attribute: Maximum time between consecutive CCAs performed back-to-back. 179 : * 180 : * This is attribute for T_recca parameter mentioned for 181 : * @ref IEEE802154_OPENTHREAD_TX_MODE_TXTIME_MULTIPLE_CCA. 182 : * Time is expressed in microseconds. 183 : */ 184 : IEEE802154_OPENTHREAD_ATTR_T_RECCA = IEEE802154_ATTR_PRIV_START, 185 : 186 : /** Attribute: Maximum time between detection of CCA idle channel and the moment of 187 : * start of SHR at the local antenna. 188 : * 189 : * This is attribute for T_ccatx parameter mentioned for 190 : * @ref IEEE802154_OPENTHREAD_TX_MODE_TXTIME_MULTIPLE_CCA. 191 : * Time is expressed in microseconds. 192 : */ 193 : IEEE802154_OPENTHREAD_ATTR_T_CCATX 194 : }; 195 : 196 : /** 197 : * OpenThread specific attribute value data of ieee802154 driver. 198 : * This type extends @ref ieee802154_attr_value 199 : */ 200 1 : struct ieee802154_openthread_attr_value { 201 : union { 202 : /** Common attribute value */ 203 1 : struct ieee802154_attr_value common; 204 : 205 : /** @brief Attribute value for @ref IEEE802154_OPENTHREAD_ATTR_T_RECCA */ 206 1 : uint16_t t_recca; 207 : 208 : /** @brief Attribute value for @ref IEEE802154_OPENTHREAD_ATTR_T_CCATX */ 209 1 : uint16_t t_ccatx; 210 : 211 0 : }; 212 : }; 213 : 214 : #endif /* ZEPHYR_INCLUDE_NET_IEEE802154_RADIO_OPENTHREAD_H_ */