/* * Copyright (C) 2017 Inria * * This file is subject to the terms and conditions of the GNU Lesser * General Public License v2.1. See the file LICENSE in the top level * directory for more details. */ /** * @defgroup net_loramac LoRaMAC * @ingroup net * @brief LoRaMAC definitions * * @{ * * @file * @brief LoRaMAC header definitions * * @author Alexandre Abadie */ #ifndef NET_LORAMAC_H #define NET_LORAMAC_H #include #include #include #include "modules.h" #ifdef __cplusplus extern "C" { #endif /** * @defgroup net_loramac_conf LoRaMAC compile configurations * @ingroup config * @{ */ /** * @brief Default device EUI * * 8 bytes key, required for join procedure */ #ifndef CONFIG_LORAMAC_DEV_EUI_DEFAULT #define CONFIG_LORAMAC_DEV_EUI_DEFAULT "0000000000000000" #endif /** * @brief Default join EUI * * 8 bytes key, required for join procedure */ #ifndef CONFIG_LORAMAC_JOIN_EUI_DEFAULT #define CONFIG_LORAMAC_JOIN_EUI_DEFAULT "0000000000000000" #endif /** * @brief Default application EUI * * 8 bytes key, required for join procedure */ #ifndef CONFIG_LORAMAC_APP_EUI_DEFAULT #define CONFIG_LORAMAC_APP_EUI_DEFAULT "0000000000000000" #endif /** * @brief Default application key * * 16 bytes key, required for join procedure */ #ifndef CONFIG_LORAMAC_APP_KEY_DEFAULT #define CONFIG_LORAMAC_APP_KEY_DEFAULT "00000000000000000000000000000000" #endif /** * @brief Default network key * * 16 bytes key, required for join procedure */ #ifndef CONFIG_LORAMAC_NWK_KEY_DEFAULT #define CONFIG_LORAMAC_NWK_KEY_DEFAULT "00000000000000000000000000000000" #endif /** * @brief Default application session key * * 16 bytes key, only required for ABP join procedure type */ #ifndef CONFIG_LORAMAC_APP_SKEY_DEFAULT #define CONFIG_LORAMAC_APP_SKEY_DEFAULT "00000000000000000000000000000000" #endif /** * @brief Default network session key * * 16 bytes key, only required for ABP join procedure type. */ #ifndef CONFIG_LORAMAC_NWK_SKEY_DEFAULT #define CONFIG_LORAMAC_NWK_SKEY_DEFAULT "00000000000000000000000000000000" #endif /** * @brief Default network session integrity key * * 16 bytes key, required for join procedure */ #ifndef CONFIG_LORAMAC_FNWKSINT_KEY_DEFAULT #define CONFIG_LORAMAC_FNWKSINT_KEY_DEFAULT "00000000000000000000000000000000" #endif /** * @brief Default serving network session integrity key * * 16 bytes key, required for join procedure */ #ifndef CONFIG_LORAMAC_SNWKSINT_KEY_DEFAULT #define CONFIG_LORAMAC_SNWKSINT_KEY_DEFAULT "00000000000000000000000000000000" #endif /** * @brief Default network session encryption key * * 16 bytes key, required for join procedure */ #ifndef CONFIG_LORAMAC_NWKSENC_KEY_DEFAULT #define CONFIG_LORAMAC_NWKSENC_KEY_DEFAULT "00000000000000000000000000000000" #endif /** * @brief Default device address */ #ifndef CONFIG_LORAMAC_DEV_ADDR_DEFAULT #define CONFIG_LORAMAC_DEV_ADDR_DEFAULT "00000000" #endif /** * @brief Default LoRaWAN region */ #if !IS_ACTIVE(CONFIG_LORAMAC_REGION_EU_868) \ && !IS_ACTIVE(CONFIG_LORAMAC_REGION_IN_865) #define CONFIG_LORAMAC_REGION_EU_868 1 #endif /** * @brief Default device class (A, B or C) * * Configure the class of device. LoRaWAN supports three classes of operation * for end nodes namely Class A, B and C. All LoRaWAN devices are expected to * implement Class A, whereas Class B and Class C can be considered as * extensions to the specification of Class A devices. * * @see [LoRaWAN Classes by TTN](https://www.thethingsnetwork.org/docs/lorawan/classes.html) * * @note GNRC LoRaWAN only supports Class A */ #if IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DEVICE_CLASS_A) #define CONFIG_LORAMAC_DEFAULT_DEVICE_CLASS (LORAMAC_CLASS_A) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DEVICE_CLASS_B) #define CONFIG_LORAMAC_DEFAULT_DEVICE_CLASS (LORAMAC_CLASS_B) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DEVICE_CLASS_C) #define CONFIG_LORAMAC_DEFAULT_DEVICE_CLASS (LORAMAC_CLASS_C) #endif #ifndef CONFIG_LORAMAC_DEFAULT_DEVICE_CLASS #define CONFIG_LORAMAC_DEFAULT_DEVICE_CLASS (LORAMAC_CLASS_A) #endif /** * @brief Default NetID (only valid with ABP join procedure) * * NETID is used by networks for assigning network-specific addresses to their * end-devices (i.e., DevAddr) so that uplink frames sent by those devices even * when they are roaming outside their home network can be forwarded to their * home network. */ #ifndef CONFIG_LORAMAC_DEFAULT_NETID #define CONFIG_LORAMAC_DEFAULT_NETID (1U) #endif /** * @brief Toggle network type (public or private) * * Set "1" to enable private network, set "0" to enable public network. * This configuration sets the sync word for LoRaWAN communication. This should * be in concordance with the gateway configuration. Public networks use `0x34` * while private networks use `0x12` as sync word. */ #ifdef DOXYGEN #define CONFIG_LORAMAC_DEFAULT_PRIVATE_NETWORK #endif /** * @brief Default datarate index * * Data rate combines two aspects, Bandwidth (BW) and Spreading Factor (SF). BW * depends on the region while SF contributes to the dwell time in any given * band which is limited by region. DR hence signifies difference combination on * BW and SF for different regions. Refer LoRaWAN 1.0.3 Regional Parameters for * more information. */ #if IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DR_0) #define CONFIG_LORAMAC_DEFAULT_DR (LORAMAC_DR_0) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DR_1) #define CONFIG_LORAMAC_DEFAULT_DR (LORAMAC_DR_1) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DR_2) #define CONFIG_LORAMAC_DEFAULT_DR (LORAMAC_DR_2) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DR_3) #define CONFIG_LORAMAC_DEFAULT_DR (LORAMAC_DR_3) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DR_4) #define CONFIG_LORAMAC_DEFAULT_DR (LORAMAC_DR_4) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DR_5) #define CONFIG_LORAMAC_DEFAULT_DR (LORAMAC_DR_5) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DR_6) #define CONFIG_LORAMAC_DEFAULT_DR (LORAMAC_DR_6) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DR_7) #define CONFIG_LORAMAC_DEFAULT_DR (LORAMAC_DR_7) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DR_8) #define CONFIG_LORAMAC_DEFAULT_DR (LORAMAC_DR_8) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DR_9) #define CONFIG_LORAMAC_DEFAULT_DR (LORAMAC_DR_9) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DR_10) #define CONFIG_LORAMAC_DEFAULT_DR (LORAMAC_DR_10) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DR_11) #define CONFIG_LORAMAC_DEFAULT_DR (LORAMAC_DR_11) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DR_12) #define CONFIG_LORAMAC_DEFAULT_DR (LORAMAC_DR_12) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DR_13) #define CONFIG_LORAMAC_DEFAULT_DR (LORAMAC_DR_13) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DR_14) #define CONFIG_LORAMAC_DEFAULT_DR (LORAMAC_DR_14) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_DR_15) #define CONFIG_LORAMAC_DEFAULT_DR (LORAMAC_DR_15) #endif #ifndef CONFIG_LORAMAC_DEFAULT_DR #define CONFIG_LORAMAC_DEFAULT_DR (LORAMAC_DR_0) #endif /** * @brief Default MAC TX power index * * TXPower index indicates power levels relative to the max EIRP level of the * end-device. Refer LoRaWAN 1.0.3 Regional Parameters for more information. */ #if IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_TX_POWER_0) #define CONFIG_LORAMAC_DEFAULT_TX_POWER (LORAMAC_TX_PWR_0) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_TX_POWER_1) #define CONFIG_LORAMAC_DEFAULT_TX_POWER (LORAMAC_TX_PWR_1) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_TX_POWER_2) #define CONFIG_LORAMAC_DEFAULT_TX_POWER (LORAMAC_TX_PWR_2) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_TX_POWER_3) #define CONFIG_LORAMAC_DEFAULT_TX_POWER (LORAMAC_TX_PWR_3) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_TX_POWER_4) #define CONFIG_LORAMAC_DEFAULT_TX_POWER (LORAMAC_TX_PWR_4) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_TX_POWER_5) #define CONFIG_LORAMAC_DEFAULT_TX_POWER (LORAMAC_TX_PWR_5) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_TX_POWER_6) #define CONFIG_LORAMAC_DEFAULT_TX_POWER (LORAMAC_TX_PWR_6) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_TX_POWER_7) #define CONFIG_LORAMAC_DEFAULT_TX_POWER (LORAMAC_TX_PWR_7) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_TX_POWER_8) #define CONFIG_LORAMAC_DEFAULT_TX_POWER (LORAMAC_TX_PWR_8) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_TX_POWER_9) #define CONFIG_LORAMAC_DEFAULT_TX_POWER (LORAMAC_TX_PWR_9) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_TX_POWER_10) #define CONFIG_LORAMAC_DEFAULT_TX_POWER (LORAMAC_TX_PWR_10) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_TX_POWER_11) #define CONFIG_LORAMAC_DEFAULT_TX_POWER (LORAMAC_TX_PWR_11) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_TX_POWER_12) #define CONFIG_LORAMAC_DEFAULT_TX_POWER (LORAMAC_TX_PWR_12) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_TX_POWER_13) #define CONFIG_LORAMAC_DEFAULT_TX_POWER (LORAMAC_TX_PWR_13) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_TX_POWER_14) #define CONFIG_LORAMAC_DEFAULT_TX_POWER (LORAMAC_TX_PWR_14) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_TX_POWER_15) #define CONFIG_LORAMAC_DEFAULT_TX_POWER (LORAMAC_TX_PWR_15) #endif #ifndef CONFIG_LORAMAC_DEFAULT_TX_POWER #define CONFIG_LORAMAC_DEFAULT_TX_POWER (LORAMAC_TX_PWR_1) #endif /** * @brief Default MAC TX port (from 1 to 223) * * The TX port denotes the port field `FPort` in the payload and is commonly * used on the destination side (Application Server) to distinguish different * payload formats. For example it can be used to identify different sensor * types/values from the same end-node and hence different payload formats can * be assigned to the different values based on value of port. */ #ifndef CONFIG_LORAMAC_DEFAULT_TX_PORT #define CONFIG_LORAMAC_DEFAULT_TX_PORT (2U) #endif /** * @brief Default MAC TX mode (confirmable or unconfirmable) * * A confirmed uplink will expect an acknowledgment from the network server; * otherwise, the message will be retransmitted by the number indicated by * @ref CONFIG_LORAMAC_DEFAULT_RETX , whereas an unconfirmed message will not * expect any acknowledgment back from the network server. */ #if IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_TX_MODE_CNF) #define CONFIG_LORAMAC_DEFAULT_TX_MODE (LORAMAC_TX_CNF) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_TX_MODE_UNCNF) #define CONFIG_LORAMAC_DEFAULT_TX_MODE (LORAMAC_TX_UNCNF) #endif #ifndef CONFIG_LORAMAC_DEFAULT_TX_MODE #define CONFIG_LORAMAC_DEFAULT_TX_MODE (LORAMAC_TX_CNF) #endif /** * @brief Default redundancy for unconfirmed uplink * * This corresponds to the number of unconfirmed uplink retransmissions when * using ADR. This configuration does not affect confirmed uplinks. By * default, uplinks are sent without retransmissions (this means, the device * sends only one uplink packet) * * @note This value MUST NOT be greater than 14, since the LinkADRCommand it's * already limited by a 4 bit value (therefore, 15 uplink transmissions) */ #ifndef CONFIG_LORAMAC_DEFAULT_REDUNDANCY #define CONFIG_LORAMAC_DEFAULT_REDUNDANCY (0U) #endif /** * @brief Enable/disable adaptive datarate state * * If enabled the end node will inform the network server about the status of * ADR using the ADR field in uplink data packet. The network server will then * optimize the data rate and the transmission power of the end node based on * the information collected from the network. */ #ifdef DOXYGEN #define CONFIG_LORAMAC_DEFAULT_ADR #endif /** * @brief Default uplink retransmission * * Maximum number of retransmissions to be used for a confirmed uplink packet, * if no downlink acknowledgment is received from the network. */ #ifndef CONFIG_LORAMAC_DEFAULT_RETX #define CONFIG_LORAMAC_DEFAULT_RETX (5U) #endif /** * @brief Default link check interval (in seconds) * * 0 means the link check process is disabled. The link check process is used by * an end-device to validate its connectivity with the network. The frame has * no payload. When a `LinkCheckReq` is received by the network server via one * or multiple gateways, it responds with a `LinkCheckAns` MAC command. */ #ifndef CONFIG_LORAMAC_DEFAULT_LINKCHK #define CONFIG_LORAMAC_DEFAULT_LINKCHK (0U) #endif /** * @brief Default first RX window delay (in ms) * * This configuration specifies the delay in seconds to open the RX1 window * after the end of uplink modulation on the end-node. */ #ifndef CONFIG_LORAMAC_DEFAULT_RX1_DELAY #define CONFIG_LORAMAC_DEFAULT_RX1_DELAY (1000U) #endif /** * @brief Default second RX (RX2) window datarate index * * This may be changed only if the network server can be configured with the * same datarate. */ #if IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_RX2_DR_0) #define CONFIG_LORAMAC_DEFAULT_RX2_DR (LORAMAC_DR_0) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_RX2_DR_1) #define CONFIG_LORAMAC_DEFAULT_RX2_DR (LORAMAC_DR_1) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_RX2_DR_2) #define CONFIG_LORAMAC_DEFAULT_RX2_DR (LORAMAC_DR_2) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_RX2_DR_3) #define CONFIG_LORAMAC_DEFAULT_RX2_DR (LORAMAC_DR_3) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_RX2_DR_4) #define CONFIG_LORAMAC_DEFAULT_RX2_DR (LORAMAC_DR_4) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_RX2_DR_5) #define CONFIG_LORAMAC_DEFAULT_RX2_DR (LORAMAC_DR_5) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_RX2_DR_6) #define CONFIG_LORAMAC_DEFAULT_RX2_DR (LORAMAC_DR_6) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_RX2_DR_7) #define CONFIG_LORAMAC_DEFAULT_RX2_DR (LORAMAC_DR_7) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_RX2_DR_8) #define CONFIG_LORAMAC_DEFAULT_RX2_DR (LORAMAC_DR_8) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_RX2_DR_9) #define CONFIG_LORAMAC_DEFAULT_RX2_DR (LORAMAC_DR_9) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_RX2_DR_10) #define CONFIG_LORAMAC_DEFAULT_RX2_DR (LORAMAC_DR_10) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_RX2_DR_11) #define CONFIG_LORAMAC_DEFAULT_RX2_DR (LORAMAC_DR_11) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_RX2_DR_12) #define CONFIG_LORAMAC_DEFAULT_RX2_DR (LORAMAC_DR_12) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_RX2_DR_13) #define CONFIG_LORAMAC_DEFAULT_RX2_DR (LORAMAC_DR_13) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_RX2_DR_14) #define CONFIG_LORAMAC_DEFAULT_RX2_DR (LORAMAC_DR_14) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_RX2_DR_15) #define CONFIG_LORAMAC_DEFAULT_RX2_DR (LORAMAC_DR_15) #endif #ifndef CONFIG_LORAMAC_DEFAULT_RX2_DR #if IS_ACTIVE(CONFIG_LORAMAC_REGION_EU_868) #define CONFIG_LORAMAC_DEFAULT_RX2_DR (LORAMAC_DR_0) #elif IS_ACTIVE(CONFIG_LORAMAC_REGION_IN_865) #define CONFIG_LORAMAC_DEFAULT_RX2_DR (LORAMAC_DR_2) #endif #endif /** * @brief Default second RX (RX2) window frequency (in Hz) */ #ifndef CONFIG_LORAMAC_DEFAULT_RX2_FREQ #if IS_ACTIVE(CONFIG_LORAMAC_REGION_EU_868) #define CONFIG_LORAMAC_DEFAULT_RX2_FREQ (869525000UL) #elif IS_ACTIVE(CONFIG_LORAMAC_REGION_IN_865) #define CONFIG_LORAMAC_DEFAULT_RX2_FREQ (866550000UL) #endif #endif /** * @brief Default LoRaMAC join procedure * * There are two options, Over The Air Activation (OTAA) results in device * sending join request to the network whereas in the case of Activation By * Personalization (ABP) the user enters the activation keys manually. OTAA is * the preferred and most secure way to connect to a LoRaWAN network. For quick * testing ABP is preferred as the device can transmit right away without * waiting for the network to provision the keys. */ #if IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_JOIN_PROCEDURE_OTAA) #define CONFIG_LORAMAC_DEFAULT_JOIN_PROCEDURE (LORAMAC_JOIN_OTAA) #elif IS_ACTIVE(CONFIG_LORAMAC_DEFAULT_JOIN_PROCEDURE_ABP) #define CONFIG_LORAMAC_DEFAULT_JOIN_PROCEDURE (LORAMAC_JOIN_ABP) #endif #ifndef CONFIG_LORAMAC_DEFAULT_JOIN_PROCEDURE #define CONFIG_LORAMAC_DEFAULT_JOIN_PROCEDURE (LORAMAC_JOIN_OTAA) #endif /** * @brief Default LoRaMAC join accept delay 1 (in seconds) * * Maximum wait time in end node to receive the `join-accept` message sent by * the network in the first receive window. This is similar to the operation of * RX1 window. */ #ifndef CONFIG_LORAMAC_DEFAULT_JOIN_DELAY1 #define CONFIG_LORAMAC_DEFAULT_JOIN_DELAY1 (5U) #endif /** * @brief Default LoRaMAC join accept delay 2 * * Maximum wait time in end node to receive the `join-accept` message sent by * the network in the second receive window. This is similar to the operation of * RX2 window. */ #ifndef CONFIG_LORAMAC_DEFAULT_JOIN_DELAY2 #define CONFIG_LORAMAC_DEFAULT_JOIN_DELAY2 (6U) #endif /** * @brief Default max FCNT gap * * Frame counter deviation is the difference between the frame counter values * transmitted by the End Node and the value stored in Network Server (NS). */ #ifndef CONFIG_LORAMAC_DEFAULT_MAX_FCNT_GAP #define CONFIG_LORAMAC_DEFAULT_MAX_FCNT_GAP (16384U) #endif /** * @brief Default maximum system overall timing error * * This configuration is used to increase the RX window to account for timer * drift. This may be decreased if the system clock is accurate, for eg: if the * system clock is from a TCXO. */ #ifndef CONFIG_LORAMAC_DEFAULT_SYSTEM_MAX_RX_ERROR #define CONFIG_LORAMAC_DEFAULT_SYSTEM_MAX_RX_ERROR (50) #endif /** * @brief Default minimum RX symbols to detect a frame * * This configuration is used to arrive at `T_RX_late` which is used in RX * window calculation. This may be increased to account for inaccuracies in * system timer. Refer SX1276_settings_for_LoRaWAN_v2p2.pdf (AN1200.24) * from Semtech for more information. */ #ifndef CONFIG_LORAMAC_DEFAULT_MIN_RX_SYMBOLS #define CONFIG_LORAMAC_DEFAULT_MIN_RX_SYMBOLS (12) #endif /** * @} */ /** * @brief Default adaptive datarate ACK limit (in s) * * @note This feature is not yet supported. */ #ifndef LORAMAC_DEFAULT_ADR_ACK_LIMIT #define LORAMAC_DEFAULT_ADR_ACK_LIMIT (64U) #endif /** * @brief Default adaptive datarate ACK delay (in s) * * @note This feature is not yet supported. */ #ifndef LORAMAC_DEFAULT_ADR_ACK_DELAY #define LORAMAC_DEFAULT_ADR_ACK_DELAY (32U) #endif /** * @brief Default adaptive datarate timeout * * @note This feature is not yet supported. */ #ifndef LORAMAC_DEFAULT_ADR_TIMEOUT #define LORAMAC_DEFAULT_ADR_TIMEOUT (3U) #endif /** * @brief Default second RX window delay (in ms) */ #define LORAMAC_DEFAULT_RX2_DELAY (1000U + CONFIG_LORAMAC_DEFAULT_RX1_DELAY) /** * @name LoRaMAC constants * @{ */ /** * @brief Device EUI length in bytes */ #define LORAMAC_DEVEUI_LEN (8U) /** * @brief Device address length in bytes */ #define LORAMAC_DEVADDR_LEN (4U) /** * @brief Application EUI length in bytes */ #define LORAMAC_APPEUI_LEN (8U) /** * @brief Join EUI length in bytes */ #define LORAMAC_JOINEUI_LEN (8U) /** * @brief Application key length in bytes */ #define LORAMAC_APPKEY_LEN (16U) /** * @brief Network key length in bytes */ #define LORAMAC_NWKKEY_LEN (16U) /** * @brief Application session key length in bytes */ #define LORAMAC_APPSKEY_LEN (16U) /** * @brief Network session key length in bytes */ #define LORAMAC_NWKSKEY_LEN (16U) /** * @brief Forwarding Network session integrity key length in bytes */ #define LORAMAC_FNWKSINTKEY_LEN (16U) /** * @brief Serving Network session integrity key length in bytes */ #define LORAMAC_SNWKSINTKEY_LEN (16U) /** * @brief Network session encryption key length in bytes */ #define LORAMAC_NWKSENCKEY_LEN (16U) /** * @brief Join session integrity key length in bytes */ #define LORAMAC_JSINTKEY_LEN (16U) /** * @brief Join session encryption key length in bytes */ #define LORAMAC_JSENCKEY_LEN (16U) /** * @brief Network session encryption key length in bytes */ #define LORAMAC_JSINTKEY_LEN (16U) /** * @brief Minimum port value */ #define LORAMAC_PORT_MIN (1U) /** * @brief Maximum port value */ #define LORAMAC_PORT_MAX (223U) /** * @brief Application Nonce length in bytes */ #define LORAMAC_APP_NONCE_LEN (3U) /** * @brief Join nonce length in bytes */ #define LORAMAC_JOIN_NONCE_LEN (3U) /** * @brief Network ID length in bytes */ #define LORAMAC_NETWORK_ID_LEN (3U) /** * @brief Channel mask length * * Must match CHANNELS_MASK_SIZE in src/mac/region/RegionXXYYY.c */ #if defined(REGION_AU915) || defined(REGION_CN470) || defined(REGION_US915) || defined(REGION_US915_HYBRID) || defined(REGION_AS923) #define LORAMAC_CHANNELS_MASK_LEN (6U) #else #define LORAMAC_CHANNELS_MASK_LEN (1U) #endif /** @} */ /** * @name LoRaMAC parameters indexes * @{ */ /** * @brief Device class */ typedef enum { LORAMAC_CLASS_A, /**< Class A device */ LORAMAC_CLASS_B, /**< Class B device */ LORAMAC_CLASS_C, /**< Class C device */ } loramac_class_t; /** * @brief LoRaMAC network join procedure type */ typedef enum { LORAMAC_JOIN_OTAA, /**< Other-the-air activation */ LORAMAC_JOIN_ABP, /**< Activation by personnalization */ } loramac_join_mode_t; /** * @brief LoRaMAC transmission mode */ typedef enum { LORAMAC_TX_CNF, /**< Confirmable transmission mode */ LORAMAC_TX_UNCNF, /**< Unconfirmable transmission mode */ } loramac_tx_mode_t; /** * @brief LoRaMAC datarate indexes * * Each index corresponds to a different modulation, spreading factor * and bandwidth depending on the regions. */ typedef enum { /** * - ISM EU863-870: LoRa modulation, SF12, BW125 (250bit/s) * - ISM US902-928: LoRa modulation, SF10, BW125 (980bit/s) * - ISM CN779-787: LoRa modulation, SF12, BW125 (250bit/s) * - ISM EU433: LoRa modulation, SF12, BW125 (250bit/s) * - ISM AU915-928: LoRa modulation, SF10, BW125 (980bit/s) * - ISM CN470-510: LoRa modulation, SF12, BW125 (250bit/s) * - ISM AS923: LoRa modulation, SF12, BW125 (250bit/s) * - ISM KR920-923: LoRa modulation, SF12, BW125 (250bit/s) * * Default value used. */ LORAMAC_DR_0 = 0, /** * - ISM EU863-870: LoRa modulation, SF11, BW125 (440bit/s) * - ISM US902-928: LoRa modulation, SF9, BW125 (1760bit/s) * - ISM CN779-787: LoRa modulation, SF11, BW125 (440bit/s) * - ISM EU433: LoRa modulation, SF11, BW125 (440bit/s) * - ISM AU915-928: LoRa modulation, SF9, BW125 (1760bit/s) * - ISM CN470-510: LoRa modulation, SF11, BW125 (440bit/s) * - ISM AS923: LoRa modulation, SF11, BW125 (440bit/s) * - ISM KR920-923: LoRa modulation, SF11, BW125 (440bit/s) */ LORAMAC_DR_1, /** * - ISM EU863-870: LoRa modulation, SF10, BW125 (980bit/s) * - ISM US902-928: LoRa modulation, SF8, BW125 (3125bit/s) * - ISM CN779-787: LoRa modulation, SF10, BW125 (980bit/s) * - ISM EU433: LoRa modulation, SF10, BW125 (980bit/s) * - ISM AU915-928: LoRa modulation, SF8, BW125 (3125bit/s) * - ISM CN470-510: LoRa modulation, SF10, BW125 (980bit/s) * - ISM AS923: LoRa modulation, SF10, BW125 (980bit/s) * - ISM KR920-923: LoRa modulation, SF10, BW125 (980bit/s) */ LORAMAC_DR_2, /** * - ISM EU863-870: LoRa modulation, SF9, BW125 (1760bit/s) * - ISM US902-928: LoRa modulation, SF7, BW125 (5470bit/s) * - ISM CN779-787: LoRa modulation, SF9, BW125 (1760bit/s) * - ISM EU433: LoRa modulation, SF9, BW125 (1760bit/s) * - ISM AU915-928: LoRa modulation, SF7, BW125 (5470bit/s) * - ISM CN470-510: LoRa modulation, SF9, BW125 (1760bit/s) * - ISM AS923: LoRa modulation, SF9, BW125 (1760bit/s) * - ISM KR920-923: LoRa modulation, SF9, BW125 (1760bit/s) */ LORAMAC_DR_3, /** * - ISM EU863-870: LoRa modulation, SF8, BW125 (3125bit/s) * - ISM US902-928: LoRa modulation, SF8, BW500 (12500bit/s) * - ISM CN779-787: LoRa modulation, SF8, BW125 (3125bit/s) * - ISM EU433: LoRa modulation, SF8, BW125 (3125bit/s) * - ISM AU915-928: LoRa modulation, SF8, BW500 (12500bit/s) * - ISM CN470-510: LoRa modulation, SF8, BW125 (3125bit/s) * - ISM AS923: LoRa modulation, SF8, BW125 (3125bit/s) * - ISM KR920-923: LoRa modulation, SF8, BW125 (3125bit/s) */ LORAMAC_DR_4, /** * - ISM EU863-870: LoRa modulation, SF7, BW125 (5470bit/s) * - ISM US902-928: reserved for future use * - ISM CN779-787: LoRa modulation, SF7, BW125 (5470bit/s) * - ISM EU433: LoRa modulation, SF7, BW125 (5470bit/s) * - ISM AU915-928: reserved for future use * - ISM CN470-510: LoRa modulation, SF7, BW125 (5470bit/s) * - ISM AS923: LoRa modulation, SF7, BW125 (5470bit/s) * - ISM KR920-923: LoRa modulation, SF7, BW125 (5470bit/s) */ LORAMAC_DR_5, /** * - ISM EU863-870: LoRa modulation, SF7, BW250 (11000bit/s) * - ISM US902-928: reserved for future use * - ISM CN779-787: LoRa modulation, SF7, BW250 (11000bit/s) * - ISM EU433 : LoRa modulation, SF7, BW250 (11000bit/s) * - ISM AU915-928: reserved for future use * - ISM CN470-510: reserved for future use * - ISM AS923: LoRa modulation, SF7, BW250 (11000bit/s) * - ISM KR920-923: reserved for future use */ LORAMAC_DR_6, /** * - ISM EU863-870: FSK modulation (50000bit/s) * - ISM US902-928: reserved for future use * - ISM CN779-787: FSK modulation (50000bit/s) * - ISM EU433: FSK modulation (50000bit/s) * - ISM AU915-928: reserved for future use * - ISM CN470-510: reserved for future use * - ISM AS923: FSK modulation (50000bit/s) * - ISM KR920-923: reserved for future use */ LORAMAC_DR_7, /** * - ISM EU863-870: reserved for future use * - ISM US902-928: LoRa modulation, SF12, BW500 (980bit/s) * - ISM CN779-787: reserved for future use * - ISM EU433: reserved for future use * - ISM AU915-928: LoRa modulation, SF12, BW500 (980bit/s) * - ISM CN470-510: reserved for future use * - ISM AS923: reserved for future use * - ISM KR920-923: reserved for future use */ LORAMAC_DR_8, /** * - ISM EU863-870: reserved for future use * - ISM US902-928: LoRa modulation, SF11, BW500 (1760bit/s) * - ISM CN779-787: reserved for future use * - ISM EU433: reserved for future use * - ISM AU915-928: LoRa modulation, SF11, BW500 (1760bit/s) * - ISM CN470-510: reserved for future use * - ISM AS923: reserved for future use * - ISM KR920-923: reserved for future use */ LORAMAC_DR_9, /** * - ISM EU863-870: reserved for future use * - ISM US902-928: LoRa modulation, SF10, BW500 (3900bit/s) * - ISM CN779-787: reserved for future use * - ISM EU433: reserved for future use * - ISM AU915-928: LoRa modulation, SF10, BW500 (3900bit/s) * - ISM CN470-510: reserved for future use * - ISM AS923: reserved for future use * - ISM KR920-923: reserved for future use */ LORAMAC_DR_10, /** * - ISM EU863-870: reserved for future use * - ISM US902-928: LoRa modulation, SF9, BW500 (7000bit/s) * - ISM CN779-787: reserved for future use * - ISM EU433: reserved for future use * - ISM AU915-928: LoRa modulation, SF9, BW500 (7000bit/s) * - ISM CN470-510: reserved for future use * - ISM AS923: reserved for future use * - ISM KR920-923: reserved for future use */ LORAMAC_DR_11, /** * - ISM EU863-870: reserved for future use * - ISM US902-928: LoRa modulation, SF8, BW500 (12500bit/s) * - ISM CN779-787: reserved for future use * - ISM EU433: reserved for future use * - ISM AU915-928: LoRa modulation, SF8, BW500 (12500bit/s) * - ISM CN470-510: reserved for future use * - ISM AS923: reserved for future use * - ISM KR920-923: reserved for future use */ LORAMAC_DR_12, /** * - ISM EU863-870: reserved for future use * - ISM US902-928: LoRa modulation, SF7, BW500 (21900bit/s) * - ISM CN779-787: reserved for future use * - ISM EU433: reserved for future use * - ISM AU915-928: LoRa modulation, SF7, BW500 (21900bit/s) * - ISM CN470-510: reserved for future use * - ISM AS923: reserved for future use * - ISM KR920-923: reserved for future use */ LORAMAC_DR_13, /** * - ISM EU863-870: reserved for future use * - ISM US902-928: reserved for future use * - ISM CN779-787: reserved for future use * - ISM EU433: reserved for future use * - ISM AU915-928: reserved for future use * - ISM CN470-510: reserved for future use * - ISM AS923: reserved for future use * - ISM KR920-923: reserved for future use */ LORAMAC_DR_14, /** * - ISM EU863-870: reserved for future use * - ISM US902-928: reserved for future use * - ISM CN779-787: reserved for future use * - ISM EU433: reserved for future use * - ISM AU915-928: reserved for future use * - ISM CN470-510: reserved for future use * - ISM AS923: reserved for future use * - ISM KR920-923: reserved for future use */ LORAMAC_DR_15, } loramac_dr_idx_t; /** * @brief LoRaMAC transmission power indexes * * Each index corresponds to a different modulation, spreading factor * and bandwidth depending on the regions. */ typedef enum { /** * - EU863-870: 20dBm (if supported) * - US902-928: 30dBm (if supported) * - CN779-787: 10dBm * - EU433: 10dBm * - AU915-928: 30dBm * - CN470-510: 17dBm * - ISM AS923: 14dBm * - ISM KR920-923: 20dBm */ LORAMAC_TX_PWR_0 = 0, /** * - EU863-870: 14dBm * - US902-928: 28dBm * - CN779-787: 7dBm * - EU433: 7dBm * - AU915-928: 28dBm * - CN470-510: 16dBm * - ISM AS923: 12dBm * - ISM KR920-923: 14dBm * * Default value used */ LORAMAC_TX_PWR_1, /** * - EU863-870: 11dBm * - US902-928: 26dBm * - CN779-787: 4dBm * - EU433: 4dBm * - AU915-928: 26dBm * - CN470-510: 14dBm * - ISM AS923: 10dBm * - ISM KR920-923: 10dBm */ LORAMAC_TX_PWR_2, /** * - EU863-870: 8dBm * - US902-928: 24dBm * - CN779-787: 1dBm * - EU433: 1dBm * - AU915-928: 24dBm * - CN470-510: 12dBm * - ISM AS923: 8dBm * - ISM KR920-923: 8dBm */ LORAMAC_TX_PWR_3, /** * - EU863-870: 5dBm * - US902-928: 22dBm * - CN779-787: -2dBm * - EU433: -2dBm * - AU915-928: 22dBm * - CN470-510: 10dBm * - ISM AS923: 6dBm * - ISM KR920-923: 5dBm */ LORAMAC_TX_PWR_4, /** * - EU863-870: 2dBm * - US902-928: 20dBm * - CN779-787: -5dBm * - EU433: -5dBm * - AU915-928: 20dBm * - CN470-510: 7dBm * - ISM AS923: 4dBm * - ISM KR920-923: 2dBm */ LORAMAC_TX_PWR_5, /** * - EU863-870: Reserved for future use * - US902-928: 18dBm * - CN779-787: Reserved for future use * - EU433: Reserved for future use * - AU915-928: 18dBm * - CN470-510: 5dBm * - ISM AS923: Reserved for future use * - ISM KR920-923: 0dBm */ LORAMAC_TX_PWR_6, /** * - EU863-870: Reserved for future use * - US902-928: 16dBm * - CN779-787: Reserved for future use * - EU433: Reserved for future use * - AU915-928: 16dBm * - CN470-510: 2dBm * - ISM AS923: Reserved for future use * - ISM KR920-923: Reserved for future use */ LORAMAC_TX_PWR_7, /** * - EU863-870: Reserved for future use * - US902-928: 14dBm * - CN779-787: Reserved for future use * - EU433: Reserved for future use * - AU915-928: 14dBm * - CN470-510: Reserved for future use * - ISM AS923: Reserved for future use * - ISM KR920-923: Reserved for future use */ LORAMAC_TX_PWR_8, /** * - EU863-870: Reserved for future use * - US902-928: 12dBm * - CN779-787: Reserved for future use * - EU433: Reserved for future use * - AU915-928: 12dBm * - CN470-510: Reserved for future use * - ISM AS923: Reserved for future use * - ISM KR920-923: Reserved for future use */ LORAMAC_TX_PWR_9, /** * - EU863-870: Reserved for future use * - US902-928: 10dBm * - CN779-787: Reserved for future use * - EU433: Reserved for future use * - AU915-928: 10dBm * - CN470-510: Reserved for future use * - ISM AS923: Reserved for future use * - ISM KR920-923: Reserved for future use */ LORAMAC_TX_PWR_10, /** * - EU863-870: Reserved for future use * - US902-928: Reserved for future use * - CN779-787: Reserved for future use * - EU433: Reserved for future use * - AU915-928: Reserved for future use * - CN470-510: Reserved for future use * - ISM AS923: Reserved for future use * - ISM KR920-923: Reserved for future use */ LORAMAC_TX_PWR_11, /** * - EU863-870: Reserved for future use * - US902-928: Reserved for future use * - CN779-787: Reserved for future use * - EU433: Reserved for future use * - AU915-928: Reserved for future use * - CN470-510: Reserved for future use * - ISM AS923: Reserved for future use * - ISM KR920-923: Reserved for future use */ LORAMAC_TX_PWR_12, /** * - EU863-870: Reserved for future use * - US902-928: Reserved for future use * - CN779-787: Reserved for future use * - EU433: Reserved for future use * - AU915-928: Reserved for future use * - CN470-510: Reserved for future use * - ISM AS923: Reserved for future use * - ISM KR920-923: Reserved for future use */ LORAMAC_TX_PWR_13, /** * - EU863-870: Reserved for future use * - US902-928: Reserved for future use * - CN779-787: Reserved for future use * - EU433: Reserved for future use * - AU915-928: Reserved for future use * - CN470-510: Reserved for future use * - ISM AS923: Reserved for future use * - ISM KR920-923: Reserved for future use */ LORAMAC_TX_PWR_14, /** * - EU863-870: Reserved for future use * - US902-928: Reserved for future use * - CN779-787: Reserved for future use * - EU433: Reserved for future use * - AU915-928: Reserved for future use * - CN470-510: Reserved for future use * - ISM AS923: Reserved for future use * - ISM KR920-923: Reserved for future use */ LORAMAC_TX_PWR_15, } loramac_tx_pwr_idx_t; /** @} */ /** * @brief A LoRaMAC network channel */ typedef struct { uint32_t freq; /**< Center frequency in Hz */ uint8_t index; /**< Channel index in defined list */ uint8_t bw; /**< Bandwidth index */ uint8_t dr_min; /**< Minimum datarate index */ uint8_t dr_max; /**< Maximum datarate index */ uint8_t dcycle; /**< Duty cycle to use on this channel (1 to 100) */ } loramac_channel_t; /** * @brief Compute the time on air of a LoRa packet * * This function uses a precomputed table to calculate time on air without * using floating point arithmetic * * @param[in] pkt_len Length of a packet in bytes * @param[in] dr Datarate used to send the packet * @param[in] cr Coding rate used to send the packet * @return time on air in us */ static inline uint32_t lora_time_on_air(size_t pkt_len, loramac_dr_idx_t dr, uint8_t cr) { assert(dr <= LORAMAC_DR_6); const uint8_t _K[6][4] = { { 0, 1, 5, 5 }, /* DR0 */ { 0, 1, 4, 5 }, /* DR1 */ { 1, 5, 5, 5 }, /* DR2 */ { 1, 4, 5, 4 }, /* DR3 */ { 1, 3, 4, 4 }, /* DR4 */ { 1, 2, 4, 3 } /* DR5 */ }; uint32_t t_sym = 1 << (15 - dr); uint32_t t_preamble = (t_sym << 3) + (t_sym << 2) + (t_sym >> 2); uint8_t index = (dr < LORAMAC_DR_6) ? dr : LORAMAC_DR_5; uint8_t n0 = _K[index][0]; uint32_t nb_symbols; uint8_t offset = _K[index][1]; if (pkt_len < offset) { nb_symbols = 8 + n0 * (cr + 4); } else { uint8_t c1 = _K[index][2]; uint8_t c2 = _K[index][3]; uint8_t pos = (pkt_len - offset) % (c1 + c2); uint8_t cycle = (pkt_len - offset) / (c1 + c2); nb_symbols = 8 + (n0 + 2 * cycle + 1 + (pos > (c1 - 1))) * (cr + 4); } uint32_t t_payload = t_sym * nb_symbols; return t_preamble + t_payload; } #ifdef __cplusplus } #endif #endif /* NET_LORAMAC_H */ /** * @} */