/***************************************************************************/
//force include some sections for doxygen
#ifdef DOXYGEN
#define DEFINETYPES
#endif

// The basic TOKEN_DEF macro should not be used directly since the simplified
//  definitions are safer to use. For completeness of information, the basic
//  macro has the following format:
//
//  TOKEN_DEF(name,creator,iscnt,isidx,type,arraysize,...)
//  name - The root name used for the token
//  creator - a "creator code" used to uniquely identify the token
//  iscnt - a boolean flag that is set to identify a counter token
//  isidx - a boolean flag that is set to identify an indexed token
//  type - the basic type or typdef of the token
//  arraysize - the number of elements making up an indexed token
//  ... - initializers used when reseting the tokens to default values
//
//
// The following convenience macros are used to simplify the definition
//  process for commonly specified parameters to the basic TOKEN_DEF macro
//  DEFINE_BASIC_TOKEN(name, type, ...)
//  DEFINE_INDEXED_TOKEN(name, type, arraysize, ...)
//  DEFINE_COUNTER_TOKEN(name, type, ...)
//  DEFINE_FIXED_BASIC_TOKEN(name, type, address, ...)
//  DEFINE_FIXED_INDEXED_TOKEN(name, type, arraysize, address, ...)
//  DEFINE_FIXED_COUNTER_TOKEN(name, type, address, ...)
//  DEFINE_MFG_TOKEN(name, type, address, ...)
//

#ifndef DOXYGEN_SHOULD_SKIP_THIS

#define DEFINE_BASIC_TOKEN(name, type, ...) \
  TOKEN_DEF(name, CREATOR_##name, 0, 0, type, 1, __VA_ARGS__)

#define DEFINE_COUNTER_TOKEN(name, type, ...) \
  TOKEN_DEF(name, CREATOR_##name, 1, 0, type, 1, __VA_ARGS__)

#define DEFINE_INDEXED_TOKEN(name, type, arraysize, ...) \
  TOKEN_DEF(name, CREATOR_##name, 0, 1, type, (arraysize), __VA_ARGS__)

#define DEFINE_FIXED_BASIC_TOKEN(name, type, address, ...) \
  TOKEN_NEXT_ADDRESS(name, (address))                      \
  TOKEN_DEF(name, CREATOR_##name, 0, 0, type, 1, __VA_ARGS__)

#define DEFINE_FIXED_COUNTER_TOKEN(name, type, address, ...) \
  TOKEN_NEXT_ADDRESS(name, (address))                        \
  TOKEN_DEF(name, CREATOR_##name, 1, 0, type, 1, __VA_ARGS__)

#define DEFINE_FIXED_INDEXED_TOKEN(name, type, arraysize, address, ...) \
  TOKEN_NEXT_ADDRESS(name, (address))                                   \
  TOKEN_DEF(name, CREATOR_##name, 0, 1, type, (arraysize), __VA_ARGS__)
#endif //DOXYGEN_SHOULD_SKIP_THIS

// The Simulated EEPROM unit tests define all of their own tokens.
#ifndef SIM_EEPROM_TEST

// The creator codes are here in one list instead of next to their token
// definitions so comparison of the code is easier.  The only requirement
// on these creator definitions is that they all must be unique.  A favorite
// method for picking creator codes is to use two ASCII characters
// to make the codes more memorable.

#ifndef DOXYGEN_SHOULD_SKIP_THIS
// STACK CREATORS
#define CREATOR_STACK_NVDATA_VERSION                         0x0001
#define CREATOR_STACK_NODE_DATA                              0x0003
#define CREATOR_STACK_SECURITY_KEY                           0x0004
#define CREATOR_STACK_NONCE_COUNTER                          0x0005
#define CREATOR_STACK_CHILD_TABLE                            0x0006
#define CREATOR_STACK_LAST_ASSIGNED_ID                       0x0007
#define CREATOR_STACK_BOOT_COUNTER                           0x0008
#define CREATOR_STACK_PARENT_LONG_ID                         0x0009
#define CREATOR_STACK_SECURITY_KEY_ID                        0x000A

// NVM3KEY domain base keys
#define NVM3KEY_DOMAIN_USER    0x00000U
#define NVM3KEY_DOMAIN_CONNECT 0x30000U
#define NVM3KEY_DOMAIN_COMMON  0x80000U

// STACK KEYS
#define NVM3KEY_STACK_NVDATA_VERSION           (NVM3KEY_DOMAIN_CONNECT | 0x0001)
#define NVM3KEY_STACK_NODE_DATA                (NVM3KEY_DOMAIN_CONNECT | 0x0003)
#define NVM3KEY_STACK_SECURITY_KEY             (NVM3KEY_DOMAIN_CONNECT | 0x0004)
#define NVM3KEY_STACK_NONCE_COUNTER            (NVM3KEY_DOMAIN_CONNECT | 0x0005)
#define NVM3KEY_STACK_SECURITY_KEY_ID          (NVM3KEY_DOMAIN_CONNECT | 0x009A)
// This key is used for an indexed token and the subsequent 0x7F keys are also
// reserved.
#define NVM3KEY_STACK_CHILD_TABLE              (NVM3KEY_DOMAIN_CONNECT | 0x0010)
#define NVM3KEY_STACK_LAST_ASSIGNED_ID         (NVM3KEY_DOMAIN_CONNECT | 0x0090)
#define NVM3KEY_STACK_BOOT_COUNTER             (NVM3KEY_DOMAIN_CONNECT | 0x0091)
#define NVM3KEY_STACK_PARENT_LONG_ID           (NVM3KEY_DOMAIN_CONNECT | 0x0092)

#endif //DOXYGEN_SHOULD_SKIP_THIS

// MANUFACTURING DATA
// Since the manufacturing data is platform specific, we pull in the proper
// file here.
#if defined(EMBER_TEST)
  #include "hal/micro/cortexm3/efm32/token-manufacturing.h"
#endif

// STACK DATA
// *the addresses of these tokens must not change*

#define CURRENT_STACK_TOKEN_VERSION 0x03FC //MSB is version, LSB is complement

#ifdef DEFINETYPES

typedef uint16_t tokTypeStackNvdataVersion;

typedef uint32_t tokTypeStackNonceCounter;

typedef struct {
  uint8_t networkKey[16]; 
} tokTypeStackKey;

typedef uint32_t tokTypeStackKeyID;

typedef struct {
  uint16_t panId; 
  int16_t radioTxPower; 
  uint16_t radioFreqChannel; 
  uint8_t nodeType; 
  uint16_t nodeId; 
  uint16_t parentId; 
} tokTypeStackNodeData;

typedef struct {
  EmberEUI64 longId; 
  EmberNodeId shortId; 
  uint8_t flags; 
} tokTypeStackChildTableEntry;

typedef uint16_t tokTypeStackLastAllocatedId;

typedef uint32_t tokTypeStackBootCounter;

typedef EmberEUI64 tokTypeParentLongId;

#endif //DEFINETYPES

#ifdef DEFINETOKENS

DEFINE_BASIC_TOKEN(STACK_NVDATA_VERSION,
                   tokTypeStackNvdataVersion,
                   CURRENT_STACK_TOKEN_VERSION)

DEFINE_BASIC_TOKEN(STACK_SECURITY_KEY,
                   tokTypeStackKey,
                   { 0, })

DEFINE_BASIC_TOKEN(STACK_SECURITY_KEY_ID,
                   tokTypeStackKeyID,
                   0x00000000)

DEFINE_BASIC_TOKEN(STACK_NODE_DATA,
                   tokTypeStackNodeData,
                   { 0xFFFF, 0, 0xFF, 0xFF, 0xFFFF, 0xFFFF })

DEFINE_BASIC_TOKEN(STACK_LAST_ASSIGNED_ID,
                   tokTypeStackLastAllocatedId,
                   0x0000)

DEFINE_INDEXED_TOKEN(STACK_CHILD_TABLE,
                     tokTypeStackChildTableEntry,
                     EMBER_CHILD_TABLE_TOKEN_SIZE,
                     { 0, })

DEFINE_COUNTER_TOKEN(STACK_NONCE_COUNTER,
                     tokTypeStackNonceCounter,
                     0x00000000)

DEFINE_COUNTER_TOKEN(STACK_BOOT_COUNTER,
                     tokTypeStackBootCounter,
                     0x0000)

DEFINE_BASIC_TOKEN(STACK_PARENT_LONG_ID,
                   tokTypeParentLongId,
                   { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF })

#endif //DEFINETOKENS

#ifdef MAC_DEBUG_TOKEN
// MAC DEBUG DATA
#include "stack/mac/token-mac-debug-legacy.h"
#endif

// APPLICATION DATA

#include "sl_token_manager_config.h"
#if (SL_TOKEN_MANAGER_CUSTOM_TOKENS_PRESENT)
  #include SL_TOKEN_MANAGER_CUSTOM_TOKEN_HEADER
#endif

#else //SIM_EEPROM_TEST

//The Simulated EEPROM unit tests define all of their tokens via the
//APPLICATION_TOKEN_HEADER macro.
  #ifdef APPLICATION_TOKEN_HEADER
    #include APPLICATION_TOKEN_HEADER
  #endif

#endif //SIM_EEPROM_TEST

Modules#

tokTypeStackKey

tokTypeStackNodeData

tokTypeStackChildTableEntry

Token types#

The types used for each stack token.

typedef uint16_t

Type for TOKEN_STACK_NVDATA_VERSION. Keeps the version number of stack tokens.

typedef uint32_t

Type for TOKEN_STACK_NONCE_COUNTER. Used to make sure that Nonce used for security is not repeated even after unexpected reboot.

typedef uint32_t

Type for TOKEN_STACK_SECURITY_KEY_ID. Used to make sure that Nonce used for security is not repeated even after unexpected reboot.

typedef uint16_t

Type for TOKEN_STACK_LAST_ASSIGNED_ID. Stores the last assigned NodeId if the device is EMBER_STAR_COORDINATOR.

typedef uint32_t

Type for TOKEN_STACK_BOOT_COUNTER. Increments at boot (during emberInit()).

typedef EmberEUI64

Type for TOKEN_STACK_PARENT_LONG_ID. Stores the Long Id of the parent of this device. Only used for EMBER_MAC_MODE_DEVICE and EMBER_MAC_MODE_SLEEPY_DEVICE device types.

Macros#

#define
DEFINETYPES

Stack token definitions This file should not be included directly. It is accessed by the other token files.

#define
CURRENT_STACK_TOKEN_VERSION 0x03FC

The current version number of the stack tokens. MSB is the version. LSB is a complement.

Token types Documentation#

tokTypeStackNvdataVersion#

typedef uint16_t tokTypeStackNvdataVersion

Type for TOKEN_STACK_NVDATA_VERSION. Keeps the version number of stack tokens.


tokTypeStackNonceCounter#

typedef uint32_t tokTypeStackNonceCounter

Type for TOKEN_STACK_NONCE_COUNTER. Used to make sure that Nonce used for security is not repeated even after unexpected reboot.


tokTypeStackKeyID#

typedef uint32_t tokTypeStackKeyID

Type for TOKEN_STACK_SECURITY_KEY_ID. Used to make sure that Nonce used for security is not repeated even after unexpected reboot.


tokTypeStackLastAllocatedId#

typedef uint16_t tokTypeStackLastAllocatedId

Type for TOKEN_STACK_LAST_ASSIGNED_ID. Stores the last assigned NodeId if the device is EMBER_STAR_COORDINATOR.


tokTypeStackBootCounter#

typedef uint32_t tokTypeStackBootCounter

Type for TOKEN_STACK_BOOT_COUNTER. Increments at boot (during emberInit()).


tokTypeParentLongId#

typedef EmberEUI64 tokTypeParentLongId

Type for TOKEN_STACK_PARENT_LONG_ID. Stores the Long Id of the parent of this device. Only used for EMBER_MAC_MODE_DEVICE and EMBER_MAC_MODE_SLEEPY_DEVICE device types.