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_ */
|