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