LCOV - code coverage report
Current view: top level - zephyr/net - ieee802154.h Hit Total Coverage
Test: new.info Lines: 39 39 100.0 %
Date: 2024-12-21 18:13:37

          Line data    Source code
       1           1 : /*
       2             :  * Copyright (c) 2016 Intel Corporation.
       3             :  *
       4             :  * SPDX-License-Identifier: Apache-2.0
       5             :  */
       6             : 
       7             : /**
       8             :  * @file
       9             :  * @brief IEEE 802.15.4 native L2 stack public header
      10             :  *
      11             :  * @note All references to the standard in this file cite IEEE 802.15.4-2020.
      12             :  */
      13             : 
      14             : #ifndef ZEPHYR_INCLUDE_NET_IEEE802154_H_
      15             : #define ZEPHYR_INCLUDE_NET_IEEE802154_H_
      16             : 
      17             : #include <limits.h>
      18             : #include <zephyr/net/net_l2.h>
      19             : #include <zephyr/net/net_mgmt.h>
      20             : #include <zephyr/crypto/cipher.h>
      21             : #include <zephyr/net/ieee802154_radio.h>
      22             : 
      23             : #ifdef __cplusplus
      24             : extern "C" {
      25             : #endif
      26             : 
      27             : /**
      28             :  * @defgroup ieee802154 IEEE 802.15.4 and Thread APIs
      29             :  * @since 1.0
      30             :  * @version 0.8.0
      31             :  * @ingroup connectivity
      32             :  *
      33             :  * @brief IEEE 802.15.4 native and OpenThread L2, configuration, management and
      34             :  * driver APIs
      35             :  *
      36             :  * @details The IEEE 802.15.4 and Thread subsystems comprise the OpenThread L2
      37             :  * subsystem, the native IEEE 802.15.4 L2 subsystem ("Soft" MAC), a mostly
      38             :  * vendor and protocol agnostic driver API shared between the OpenThread and
      39             :  * native L2 stacks ("Hard" MAC and PHY) as well as several APIs to configure
      40             :  * the subsystem (shell, net management, Kconfig, devicetree, etc.).
      41             :  *
      42             :  * The **OpenThread subsystem API** integrates the external <a
      43             :  * href="https://openthread.io">OpenThread</a> stack into Zephyr. It builds upon
      44             :  * Zephyr's native IEEE 802.15.4 driver API.
      45             :  *
      46             :  * The **native IEEE 802.15.4 subsystem APIs** are exposed at different levels
      47             :  * and address several audiences:
      48             :  *  - shell (end users, application developers):
      49             :  *    - a set of IEEE 802.15.4 shell commands (see `shell> ieee802154 help`)
      50             :  *  - application API (application developers):
      51             :  *    - IPv6, DGRAM and RAW sockets for actual peer-to-peer, multicast and
      52             :  *      broadcast data exchange between nodes including connection specific
      53             :  *      configuration (sample coming soon, see
      54             :  *      https://github.com/linux-wpan/wpan-tools/tree/master/examples for now
      55             :  *      which inspired our API and therefore has a similar socket API),
      56             :  *    - Kconfig and devicetree configuration options (net config library
      57             :  *      extension, subsystem-wide MAC and PHY Kconfig/DT options, driver/vendor
      58             :  *      specific Kconfig/DT options, watch out for options prefixed with
      59             :  *      IEEE802154/ieee802154),
      60             :  *    - Network Management: runtime configuration of the IEEE 802.15.4
      61             :  *      protocols stack at the MAC (L2) and PHY (L1) levels
      62             :  *      (see @ref ieee802154_mgmt),
      63             :  *  - L2 integration (subsystem contributors):
      64             :  *    - see @ref ieee802154_l2
      65             :  *    - implementation of Zephyr's internal L2-level socket and network context
      66             :  *      abstractions (context/socket operations, see @ref net_l2),
      67             :  *    - protocol-specific extension to the interface structure (see @ref net_if)
      68             :  *    - protocol-specific extensions to the network packet structure
      69             :  *      (see @ref net_pkt),
      70             :  *
      71             :  *  - OpenThread and native IEEE 802.15.4 share a common **driver API** (driver
      72             :  *    maintainers/contributors):
      73             :  *    - see @ref ieee802154_driver
      74             :  *    - a basic, mostly PHY-level driver API to be implemented by all drivers,
      75             :  *    - several "hard MAC" (hardware/firmware offloading) extension points for
      76             :  *      performance critical or timing sensitive aspects of the protocol
      77             :  */
      78             : 
      79             : /**
      80             :  * @defgroup ieee802154_l2 IEEE 802.15.4 L2
      81             :  * @since 1.0
      82             :  * @version 0.8.0
      83             :  * @ingroup ieee802154
      84             :  *
      85             :  * @brief IEEE 802.15.4 L2 APIs
      86             :  *
      87             :  * @details This API provides integration with Zephyr's sockets and network
      88             :  * contexts. **Application and driver developers should never interface directly
      89             :  * with this API.** It is of interest to subsystem maintainers only.
      90             :  *
      91             :  * The API implements and extends the following structures:
      92             :  *    - implements Zephyr's internal L2-level socket and network context
      93             :  *      abstractions (context/socket operations, see @ref net_l2),
      94             :  *    - protocol-specific extension to the interface structure (see @ref net_if)
      95             :  *    - protocol-specific extensions to the network packet structure
      96             :  *      (see @ref net_pkt),
      97             :  *
      98             :  * @note All section, table and figure references are to the IEEE 802.15.4-2020
      99             :  * standard.
     100             :  *
     101             :  * @{
     102             :  */
     103             : 
     104             : /**
     105             :  * @brief Represents the PHY constant aMaxPhyPacketSize, see section 11.3.
     106             :  *
     107             :  * @note Currently only 127 byte sized packets are supported although some PHYs
     108             :  * (e.g. SUN, MSK, LECIM, ...) support larger packet sizes. Needs to be changed
     109             :  * once those PHYs should be fully supported.
     110             :  */
     111           1 : #define IEEE802154_MAX_PHY_PACKET_SIZE  127
     112             : 
     113             : /**
     114             :  * @brief Represents the frame check sequence length, see section 7.2.1.1.
     115             :  *
     116             :  * @note Currently only a 2 byte FCS is supported although some PHYs (e.g. SUN,
     117             :  * TVWS, ...) optionally support a 4 byte FCS. Needs to be changed once those
     118             :  * PHYs should be fully supported.
     119             :  */
     120           1 : #define IEEE802154_FCS_LENGTH           2
     121             : 
     122             : /**
     123             :  * @brief IEEE 802.15.4 "hardware" MTU (not to be confused with L3/IP MTU), i.e.
     124             :  * the actual payload available to the next higher layer.
     125             :  *
     126             :  * @details This is equivalent to the IEEE 802.15.4 MAC frame length minus
     127             :  * checksum bytes which is again equivalent to the PHY payload aka PSDU length
     128             :  * minus checksum bytes. This definition exists for compatibility with the same
     129             :  * concept in Linux and Zephyr's L3. It is not a concept from the IEEE 802.15.4
     130             :  * standard.
     131             :  *
     132             :  * @note Currently only the original frame size from the 2006 standard version
     133             :  * and earlier is supported. The 2015+ standard introduced PHYs with larger PHY
     134             :  * payload. These are not (yet) supported in Zephyr.
     135             :  */
     136           1 : #define IEEE802154_MTU                  (IEEE802154_MAX_PHY_PACKET_SIZE - IEEE802154_FCS_LENGTH)
     137             : 
     138             : /* TODO: Support flexible MTU and FCS lengths for IEEE 802.15.4-2015ff */
     139             : 
     140             : /** IEEE 802.15.4 short address length. */
     141           1 : #define IEEE802154_SHORT_ADDR_LENGTH    2
     142             : 
     143             : /** IEEE 802.15.4 extended address length. */
     144           1 : #define IEEE802154_EXT_ADDR_LENGTH      8
     145             : 
     146             : /** IEEE 802.15.4 maximum address length. */
     147           1 : #define IEEE802154_MAX_ADDR_LENGTH      IEEE802154_EXT_ADDR_LENGTH
     148             : 
     149             : /**
     150             :  * A special channel value that symbolizes "all" channels or "any" channel -
     151             :  * depending on context.
     152             :  */
     153           1 : #define IEEE802154_NO_CHANNEL           USHRT_MAX
     154             : 
     155             : /**
     156             :  * Represents the IEEE 802.15.4 broadcast short address, see sections 6.1 and
     157             :  * 8.4.3, table 8-94, macShortAddress.
     158             :  */
     159           1 : #define IEEE802154_BROADCAST_ADDRESS         0xffff
     160             : 
     161             : /**
     162             :  * Represents a special IEEE 802.15.4 short address that indicates that a device
     163             :  * has been associated with a coordinator but did not receive a short address,
     164             :  * see sections 6.4.1 and 8.4.3, table 8-94, macShortAddress.
     165             :  */
     166           1 : #define IEEE802154_NO_SHORT_ADDRESS_ASSIGNED 0xfffe
     167             : 
     168             : /** Represents the IEEE 802.15.4 broadcast PAN ID, see section 6.1. */
     169           1 : #define IEEE802154_BROADCAST_PAN_ID 0xffff
     170             : 
     171             : /**
     172             :  * Represents a special value of the macShortAddress MAC PIB attribute, while the
     173             :  * device is not associated, see section 8.4.3, table 8-94.
     174             :  */
     175           1 : #define IEEE802154_SHORT_ADDRESS_NOT_ASSOCIATED IEEE802154_BROADCAST_ADDRESS
     176             : 
     177             : /**
     178             :  * Represents a special value of the macPanId MAC PIB attribute, while the
     179             :  * device is not associated, see section 8.4.3, table 8-94.
     180             :  */
     181           1 : #define IEEE802154_PAN_ID_NOT_ASSOCIATED        IEEE802154_BROADCAST_PAN_ID
     182             : 
     183             : /** Interface-level security attributes, see section 9.5. */
     184           1 : struct ieee802154_security_ctx {
     185             :         /**
     186             :          * Interface-level outgoing frame counter, section 9.5, table 9-8,
     187             :          * secFrameCounter.
     188             :          *
     189             :          * Only used when the driver does not implement key-specific frame
     190             :          * counters.
     191             :          */
     192           1 :         uint32_t frame_counter;
     193             : 
     194             :         /** @cond INTERNAL_HIDDEN */
     195             :         struct cipher_ctx enc;
     196             :         struct cipher_ctx dec;
     197             :         /** INTERNAL_HIDDEN @endcond */
     198             : 
     199             :         /**
     200             :          * @brief Interface-level frame encryption security key material
     201             :          *
     202             :          * @details Currently native L2 only supports a single secKeySource, see
     203             :          * section 9.5, table 9-9, in combination with secKeyMode zero (implicit
     204             :          * key mode), see section 9.4.2.3, table 9-7.
     205             :          *
     206             :          * @warning This is no longer in accordance with the 2015+ versions of
     207             :          * the standard and needs to be extended in the future for full security
     208             :          * procedure compliance.
     209             :          */
     210           1 :         uint8_t key[16];
     211             : 
     212             :         /** Length in bytes of the interface-level security key material. */
     213           1 :         uint8_t key_len;
     214             : 
     215             :         /**
     216             :          * @brief Frame security level, possible values are defined in section
     217             :          * 9.4.2.2, table 9-6.
     218             :          *
     219             :          * @warning Currently native L2 allows to configure one common security
     220             :          * level for all frame types, commands and information elements. This is
     221             :          * no longer in accordance with the 2015+ versions of the standard and
     222             :          * needs to be extended in the future for full security procedure
     223             :          * compliance.
     224             :          */
     225           1 :         uint8_t level   : 3;
     226             : 
     227             :         /**
     228             :          * @brief Frame security key mode
     229             :          *
     230             :          * @details Currently only implicit key mode is partially supported, see
     231             :          * section 9.4.2.3, table 9-7, secKeyMode.
     232             :          *
     233             :          * @warning This is no longer in accordance with the 2015+ versions of
     234             :          * the standard and needs to be extended in the future for full security
     235             :          * procedure compliance.
     236             :          */
     237           1 :         uint8_t key_mode        : 2;
     238             : 
     239             :         /** @cond INTERNAL_HIDDEN */
     240             :         uint8_t _unused : 3;
     241             :         /** INTERNAL_HIDDEN @endcond */
     242             : };
     243             : 
     244             : /** @brief IEEE 802.15.4 device role */
     245           1 : enum ieee802154_device_role {
     246             :         IEEE802154_DEVICE_ROLE_ENDDEVICE,       /**< End device */
     247             :         IEEE802154_DEVICE_ROLE_COORDINATOR,     /**< Coordinator */
     248             :         IEEE802154_DEVICE_ROLE_PAN_COORDINATOR, /**< PAN coordinator */
     249             : };
     250             : 
     251             : /** IEEE 802.15.4 L2 context. */
     252           1 : struct ieee802154_context {
     253             :         /**
     254             :          * @brief PAN ID
     255             :          *
     256             :          * @details The identifier of the PAN on which the device is operating.
     257             :          * If this value is 0xffff, the device is not associated. See section
     258             :          * 8.4.3.1, table 8-94, macPanId.
     259             :          *
     260             :          * in CPU byte order
     261             :          */
     262           1 :         uint16_t pan_id;
     263             : 
     264             :         /**
     265             :          * @brief Channel Number
     266             :          *
     267             :          * @details The RF channel to use for all transmissions and receptions,
     268             :          * see section 11.3, table 11-2, phyCurrentChannel. The allowable range
     269             :          * of values is PHY dependent as defined in section 10.1.3.
     270             :          *
     271             :          * in CPU byte order
     272             :          */
     273           1 :         uint16_t channel;
     274             : 
     275             :         /**
     276             :          * @brief Short Address (in CPU byte order)
     277             :          *
     278             :          * @details Range:
     279             :          *  * 0x0000–0xfffd: associated, short address was assigned
     280             :          *  * 0xfffe: associated but no short address assigned
     281             :          *  * 0xffff: not associated (default),
     282             :          *
     283             :          * See section 6.4.1, table 6-4 (Usage of the shart address) and
     284             :          * section 8.4.3.1, table 8-94, macShortAddress.
     285             :          */
     286           1 :         uint16_t short_addr;
     287             : 
     288             :         /**
     289             :          * @brief Extended Address (in little endian)
     290             :          *
     291             :          * @details The extended address is device specific, usually permanently
     292             :          * stored on the device and immutable.
     293             :          *
     294             :          * See section 8.4.3.1, table 8-94, macExtendedAddress.
     295             :          */
     296           1 :         uint8_t ext_addr[IEEE802154_MAX_ADDR_LENGTH];
     297             : 
     298             :         /** Link layer address (in big endian) */
     299           1 :         struct net_linkaddr_storage linkaddr;
     300             : 
     301             : #ifdef CONFIG_NET_L2_IEEE802154_SECURITY
     302             :         /** Security context */
     303           1 :         struct ieee802154_security_ctx sec_ctx;
     304             : #endif
     305             : 
     306             : #ifdef CONFIG_NET_L2_IEEE802154_MGMT
     307             :         /** Pointer to scanning parameters and results, guarded by scan_ctx_lock */
     308           1 :         struct ieee802154_req_params *scan_ctx;
     309             : 
     310             :         /**
     311             :          * Used to maintain integrity of data for all fields in this struct
     312             :          * unless otherwise documented on field level.
     313             :          */
     314           1 :         struct k_sem scan_ctx_lock;
     315             : 
     316             :         /**
     317             :          * @brief Coordinator extended address
     318             :          *
     319             :          * @details see section 8.4.3.1, table 8-94, macCoordExtendedAddress,
     320             :          * the address of the coordinator through which the device is
     321             :          * associated.
     322             :          *
     323             :          * A value of zero indicates that a coordinator extended address is
     324             :          * unknown (default).
     325             :          *
     326             :          * in little endian
     327             :          */
     328           1 :         uint8_t coord_ext_addr[IEEE802154_MAX_ADDR_LENGTH];
     329             : 
     330             :         /**
     331             :          * @brief Coordinator short address
     332             :          *
     333             :          * @details see section 8.4.3.1, table 8-94, macCoordShortAddress, the
     334             :          * short address assigned to the coordinator through which the device is
     335             :          * associated.
     336             :          *
     337             :          * A value of 0xfffe indicates that the coordinator is only using its
     338             :          * extended address. A value of 0xffff indicates that this value is
     339             :          * unknown.
     340             :          *
     341             :          * in CPU byte order
     342             :          */
     343           1 :         uint16_t coord_short_addr;
     344             : #endif
     345             : 
     346             :         /** Transmission power in dBm. */
     347           1 :         int16_t tx_power;
     348             : 
     349             :         /** L2 flags */
     350           1 :         enum net_l2_flags flags;
     351             : 
     352             :         /**
     353             :          * @brief Data sequence number
     354             :          *
     355             :          * @details The sequence number added to the transmitted Data frame or
     356             :          * MAC command, see section 8.4.3.1, table 8-94, macDsn.
     357             :          */
     358           1 :         uint8_t sequence;
     359             : 
     360             :         /**
     361             :          * @brief Device Role
     362             :          *
     363             :          * @details See section 6.1: A device may be operating as end device
     364             :          * (0), coordinator (1), or PAN coordinator (2). If no device role is
     365             :          * explicitly configured then the device will be treated as an end
     366             :          * device.
     367             :          *
     368             :          * A value of 3 is undefined.
     369             :          *
     370             :          * Can be read/set via @ref ieee802154_device_role.
     371             :          */
     372           1 :         uint8_t device_role : 2;
     373             : 
     374             :         /** @cond INTERNAL_HIDDEN */
     375             :         uint8_t _unused : 5;
     376             :         /** INTERNAL_HIDDEN @endcond */
     377             : 
     378             :         /**
     379             :          * ACK requested flag, guarded by ack_lock
     380             :          */
     381           1 :         uint8_t ack_requested: 1;
     382             : 
     383             :         /** ACK expected sequence number, guarded by ack_lock */
     384           1 :         uint8_t ack_seq;
     385             : 
     386             :         /** ACK lock, guards ack_* fields */
     387           1 :         struct k_sem ack_lock;
     388             : 
     389             :         /**
     390             :          * @brief Context lock
     391             :          *
     392             :          * @details This lock guards all mutable context attributes unless
     393             :          * otherwise mentioned on attribute level.
     394             :          */
     395           1 :         struct k_sem ctx_lock;
     396             : };
     397             : 
     398             : /** @cond INTERNAL_HIDDEN */
     399             : 
     400             : /* L2 context type to be used with NET_L2_GET_CTX_TYPE */
     401             : #define IEEE802154_L2_CTX_TYPE  struct ieee802154_context
     402             : 
     403             : /** INTERNAL_HIDDEN @endcond */
     404             : 
     405             : #ifdef __cplusplus
     406             : }
     407             : #endif
     408             : 
     409             : /**
     410             :  * @}
     411             :  */
     412             : 
     413             : #endif /* ZEPHYR_INCLUDE_NET_IEEE802154_H_ */

Generated by: LCOV version 1.14