/*
 * ZBOSS Zigbee 3.0
 *
 * Copyright (c) 2012-2026 DSR Corporation, Denver CO, USA.
 * www.dsr-zboss.com
 * www.dsr-corporation.com
 * All rights reserved.
 *
 *
 * Use in source and binary forms, redistribution in binary form only, with
 * or without modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions in binary form, except as embedded into a Nordic
 *    Semiconductor ASA integrated circuit in a product or a software update for
 *    such product, must reproduce the above copyright notice, this list of
 *    conditions and the following disclaimer in the documentation and/or other
 *    materials provided with the distribution.
 *
 * 2. Neither the name of Nordic Semiconductor ASA nor the names of its
 *    contributors may be used to endorse or promote products derived from this
 *    software without specific prior written permission.
 *
 * 3. This software, with or without modification, must only be used with a Nordic
 *    Semiconductor ASA integrated circuit.
 *
 * 4. Any software provided in binary form under this license must not be reverse
 *    engineered, decompiled, modified and/or disassembled.
 *
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
/* PURPOSE: Configuration file: configuration- and platform-specific definitions,
constants etc.
*/

#ifndef ZB_CONFIG_H
#define ZB_CONFIG_H 1

/**
   Load vendor specific configurations
*/

/*! Specification version of the specification */
/* Moved here so it is defined before zb_vendor.h is included */
#define ZB_STACK_SPEC_VERSION 23U

/* \defgroup buildconfig Build Configurations
   @{ */
#include "zb_vendor.h"
/**
   Load common ZBOSS definitions
*/
#include "zb_config_common.h"


/*
  some BDB defaults
*/
#if defined ZB_LITE_BDB_ONLY_COMMISSIONING && !defined ZB_BDB_MODE
#define ZB_BDB_MODE
#endif

#ifdef ZB_BDB_MODE
#define ZB_BDB_ENABLE_FINDING_BINDING
#if !defined(NCP_MODE_HOST)
/* BDB mandates GPPB */
#define ZB_ENABLE_ZGP
#endif /* !NCP_MODE_HOST */
/* Starting from BDB 3.1 rejoin backoff is mandatory. */
#define ZB_REJOIN_BACKOFF
/* Distributed is M for BDB, but not for SE */
#define ZB_DISTRIBUTED_SECURITY_ON
#endif  /* ZB_BDB_MODE */

/*
 * NCP does not yet support the rejoin backoff.
 * However, some vendor files explicitly define it.
 */
#if defined(NCP_MODE_HOST) && defined(ZB_REJOIN_BACKOFF)
#undef ZB_REJOIN_BACKOFF
#endif

/* Always ON in r23 */
#define APS_FRAGMENTATION
#define ZB_BEACON_SURVEY
#define ZB_PARENT_CLASSIFICATION
#if !defined ZB_MACSPLIT_DEVICE && !defined TC_SWAPOUT
#define TC_SWAPOUT
#endif
#define ZB_SECURITY_INSTALLCODES


/*
 * ZC/ZR - GPPB role library     (default) (implementation of Basic Proxy is mandatory for Zigbee 3.0 ZR)
 * ZC/ZR - GPCB role library               (Options file shall use ZB_ENABLE_ZGP_COMBO define)
 * ZC/ZR - GP Commissioning Tool           (Options file shall use ZGP_COMMISSIONING_TOOL define)
 * ZED   - Target role library   (default) (Options file shall use ZB_ENABLE_ZGP_TARGET define)
 * ZED   - Target+ role library            (Options file shall use ZB_ENABLE_ZGP_TARGET_PLUS define)
 *
 * To enable advanced features (not covered by the current version of GP specification) please
 * define ZB_ENABLE_ZGP_ADVANCED, so in this case the GPPB/GPCB/GPCT basic libs will be re-compiled
 * to GPP/GPC/GPCT advanced libs
 *
 * GP infrastructure devices:
 *
 *   A.3.2.1 GP Target device ability:
 *    - ability to receive any GP frame in tunneled mode
 *
 *   A.3.2.2 GP Target+ device ability:
 *    - ability to receive any GP frame both in direct mode and in tunneled mode
 *
 *   A.3.2.3 GP Proxy device ability:
 *    - ability to receive any GP frame in direct mode when the proxy is in the radio range of the
 *      GPD
 *    - ability to send to the registered sink devices a GP Notification command with the received
 *      GP frame
 *    - ability to maintain a Proxy Table at commissioning time to register sink devices which are
 *      asking for GP frame forwarding service
 *    - ability to update the Proxy Table based on the observed GP traffic in order to enable GP
 *      device mobility in the network
 *    - ability to drop scheduled tunneling of GP frame, based on received GP commands related to
 *      the same GP frame
 *
 *   A.3.2.4 GP Combo device
 *    - ability to receive any GP frame both in direct mode and in tunneled mode
 *
 */

#ifdef ZB_ZGPD_ROLE
#define ZB_ENABLE_ZGP_DIRECT
#define ZB_ENABLE_ZGP_SECUR
#define APP_ONLY_NVRAM

#ifndef ZB_MAC_INTERFACE_SINGLE
#define ZB_MAC_INTERFACE_SINGLE
#endif

#ifndef ZB_MAC_MONOLITHIC
#define ZB_MAC_MONOLITHIC
#endif

#elif defined ZB_ENABLE_ZGP && !defined ZB_ENABLE_ZGP_TARGET && defined ZB_ED_ROLE
#undef ZB_ENABLE_ZGP
#endif

#if defined ZB_ENABLE_ZGP_DIRECT && !defined ZB_ENABLE_ZGP_TARGET && defined ZB_ED_ROLE
#undef ZB_ENABLE_ZGP_DIRECT
#endif


#if (defined ZB_ENABLE_ZGP && !defined ZB_ZGPD_ROLE) || defined ZB_DOCUMENT_ZGP

/*
#define ZB_ENABLE_ZGP_ADVANCED
*/

#define ZB_ENABLE_ZGP_CLUSTER
#define ZB_ENABLE_ZGP_SECUR
#define ZB_USEALIAS

#ifndef ZB_ED_ROLE
/* ZED can only be implemented as GP Target/Target+ */
#define ZB_ENABLE_ZGP_PROXY
#endif

#ifndef ZB_ENABLE_ZGP_TARGET
#define ZB_ENABLE_ZGP_DIRECT
#define ZB_ENABLE_ZGP_TX_QUEUE
#endif

#if (defined ZB_ENABLE_ZGP_COMBO || defined ZB_ENABLE_ZGP_TARGET || defined ZB_ENABLE_ZGP_TARGET_PLUS || defined ZGP_COMMISSIONING_TOOL)
#define ZB_ENABLE_ZGP_SINK

/* Old implementation of 8 bit vector handling on ZGP Sink Side is deprecated now.
 *   Let's keep it until SC will decide to discontinue it
 *   All the code under this define should be removed once it will be discontinued */
#ifndef ZB_ZGP_SINK_SUPPORT_LEGACY_8BIT_VECTOR_HANDLING
#define ZB_ZGP_SINK_SUPPORT_LEGACY_8BIT_VECTOR_HANDLING
#endif

/**< ZGP Sink Match Info is legacy and is deprecated now.
 *   Let's keep it until SC will decide to discontinue it
 *   All the code under this define should be removed once it will be discontinued */
#ifndef ZB_ZGP_SINK_SUPPORT_LEGACY_MATCH_INFO
#define ZB_ZGP_SINK_SUPPORT_LEGACY_MATCH_INFO
#endif

#ifdef ZB_ZGP_SINK_SUPPORT_LEGACY_MATCH_INFO
/** Max number of command identifiers in one
 *  functionality matching table entry */
#define ZB_ZGP_MATCH_TBL_MAX_CMDS_FOR_MATCH 5U

/** Max number of cluster identifiers in one
 *  functionality matching table entry */
#define ZB_ZGP_TBL_MAX_CLUSTERS 5U
#endif  /* ZB_ZGP_SINK_SUPPORT_LEGACY_MATCH_INFO */

#endif

/** Sink table size */
#ifndef ZB_ZGP_SINK_TBL_SIZE
#define ZB_ZGP_SINK_TBL_SIZE 32U
#endif /* ZB_ZGP_SINK_TBL_SIZE */


/* 5.1.2.3.2 test specification - The default value for DUT-GPP being a Basic Combo pr a Basic Proxy
 * is "ZigBeeAlliance09", i.e. {0x5A 0x69 0x67 0x42 0x65 0x65 0x41 0x6C 0x6C 0x69 0x61 0x6E
 * 0x63 0x65 0x30 0x39}. */
#define ZB_ZGP_DEFAULT_LINK_KEY "ZigBeeAlliance09"

/* 5.1.2.3.2 test specification - The default value for DUT-GPP being a Basic Proxy or Basic Combo
 * is 0b000. */
#define ZB_ZGP_DEFAULT_SHARED_SECURITY_KEY_TYPE ZB_ZGP_SEC_KEY_TYPE_NO_KEY

/* A.3.3.2.5 The default value is 180 seconds. */
#ifndef ZB_ZGP_DEFAULT_COMMISSIONING_WINDOW
#define ZB_ZGP_DEFAULT_COMMISSIONING_WINDOW 180U
#endif

/* in bytes */
#define ZB_ZGP_MIN_PROXY_TABLE_ENTRY_SIZE 7U

#ifndef ZB_ZGP_PROXY_COMMISSIONING_DEFAULT_COMMUNICATION_MODE
#define ZB_ZGP_PROXY_COMMISSIONING_DEFAULT_COMMUNICATION_MODE ZGP_PROXY_COMM_MODE_UNICAST
#endif

/*! \addtogroup ZB_CONFIG */
/*! @{ */

/**
 * Default commissioning exit mode. According to spec should be "On pairing success" (0x01)
 *
 * @see ZGP spec, A.3.3.2 Server Attributes */
#define ZB_ZGP_DEFAULT_COMMISSIONING_EXIT_MODE ZGP_COMMISSIONING_EXIT_MODE_ON_PAIRING_SUCCESS

/*! @} */ /* ZB_CONFIG */

/* A.3.3.2 Server Attributes, default value gpsSecurityLevel = 0x06
  Minimal GPD Security Level = 0x02
  Protection with gpLinkKey = 1
  Involve TC = 0
*/
#define ZB_ZGP_DEFAULT_SEC_LEVEL_MIN_GPD_SEC_LEVEL ZB_ZGP_SEC_LEVEL_FULL_NO_ENC
#define ZB_ZGP_DEFAULT_SEC_LEVEL_PROTECTION_WITH_GP_LINK_KEY ZB_ZGP_SEC_LEVEL_PROTECTION_WITH_GP_LINK_KEY
#define ZB_ZGP_DEFAULT_SEC_LEVEL_INVOLVE_TC ZB_ZGP_SEC_LEVEL_PROTECTION_DO_NOT_INVOLVE_TC

#define ZB_ZGP_MAX_TEMP_MASTER_COUNT 0x03U
#define ZB_ZGP_DMAX_FOR_ACCUMULATE_TEMP_MASTER_INFO 100U
#define ZB_ZGP_MIN_SINK_TABLE_ENTRY_SIZE 8U
#ifndef MAX_ZGP_CLUSTER_GPDF_PAYLOAD_SIZE
#define MAX_ZGP_CLUSTER_GPDF_PAYLOAD_SIZE 65U /* (64 for APP_000 + 1 byte header size) */
#endif
#define ZB_GP_DMIN_U_MS 5U
#define ZB_GP_DMIN_B_MS 32U

/* A.3.3.2 Server Attributes, default value 0x01 */
#ifndef ZB_ZGP_DEFAULT_COMMUNICATION_MODE
#define ZB_ZGP_DEFAULT_COMMUNICATION_MODE ZGP_COMMUNICATION_MODE_GROUPCAST_DERIVED
#endif


#ifdef ZB_ENABLE_ZGP_PROXY
#ifndef ZB_ZGP_PROXY_TBL_SIZE
#define ZB_ZGP_PROXY_TBL_SIZE 16U
#endif /* ZB_ZGP_PROXY_TBL_SIZE */
#endif  /* ZB_ENABLE_ZGP_PROXY */

#endif  /* !ZB_ZGPD_ROLE */

/** @cond DOXYGEN_INTERNAL_DOC */
/**
   ZB_ENABLE_SE_MIN_CONFIG - enables CBKE-related structures and functionality
   can be defined in vendor file directly, or enabled, when ZB_ENABLE_SE is defined
*/
#ifdef ZB_ENABLE_SE
#ifndef ZB_ENABLE_SE_MIN_CONFIG
#define ZB_ENABLE_SE_MIN_CONFIG
#endif
#endif

/** @endcond */ /* DOXYGEN_INTERNAL_DOC */

#if defined ZB_ENABLE_SE_MIN_CONFIG
#ifndef ZB_SECURITY_INSTALLCODES
#define ZB_SECURITY_INSTALLCODES
#endif
/* ZB_ENABLE_SE could be set to enable only CBKE but not SE commissioning */
#ifndef ZB_NO_SE_COMMISSIONING
#define ZB_SE_COMMISSIONING
#endif
#ifndef APS_FRAGMENTATION
#define APS_FRAGMENTATION
#endif

#ifndef ZB_SE_DISABLE_TIME_SYNC
#define ZB_ENABLE_TIME_SYNC
#endif

#ifdef ZB_SE_KE_WHITELIST
#ifndef ZB_SE_KE_WHITELIST_MAX_SIZE
#define ZB_SE_KE_WHITELIST_MAX_SIZE 32U
#endif
#endif

#endif  /* if defined ZB_ENABLE_SE_MIN_CONFIG */

/*
 * Use vendor file to define build for the desired band:
 *
 * ZB_R22_MULTIMAC_MODE - 2.4GHz band and Sub-GHz band supported
 * ZB_SUBGHZ_ONLY_MODE  - only Sub-GHz band supported
 * Nothing of above     - only 2.4GHz band supported
 */
#if defined ZB_SUBGHZ_ONLY_MODE && defined ZB_R22_MULTIMAC_MODE
#error ZB_SUBGHZ_ONLY_MODE && ZB_R22_MULTIMAC_MODE defined!
#endif /* ZB_SUBGHZ_ONLY_MODE && ZB_R22_MULTIMAC_MODE */

#if defined ZB_SUBGHZ_ONLY_MODE || defined ZB_R22_MULTIMAC_MODE
/* Sub-GHz is used without reference to 2.4GHz band enabled */
#define ZB_SUBGHZ_BAND_ENABLED

/* Current Sub-GHz properties */
#define ZB_MAC_DUTY_CYCLE_MONITORING
#define ZB_MAC_POWER_CONTROL
#define ZB_SUB_GHZ_LBT
#define ZB_ENHANCED_BEACON_SUPPORT
#define ZB_JOINING_LIST_SUPPORT
#define ZB_SUB_GHZ_ZB30_SUPPORT
#define ZB_FILTER_OUT_CLUSTERS
#define ZB_MGMT_NWK_ENHANCED_UPDATE_ENABLED
#else
#if defined ZB_ZCL_SUPPORT_CLUSTER_SUBGHZ
#error "Sub-GHz cluster can be defined only when Sub-GHz enabled for stack"
#endif /* ZB_ZCL_SUPPORT_CLUSTER_SUBGHZ */
#endif /* ZB_SUBGHZ_ONLY_MODE || ZB_R22_MULTIMAC_MODE */

/**
   Number of frames in GPFS (repeated frames with same mac seq number)

   For debug purposes set it to 1
*/

#ifndef ZB_ZGP_TX_QUEUE_SIZE
#define ZB_ZGP_TX_QUEUE_SIZE 10U
#endif

#ifdef ZB_ZGP_IMMED_TX
/** Number of zb_zgp_tx_pinfo_t in zb_zgp_tx_packet_info_q_t. */
#define ZB_ZGP_TX_PACKET_INFO_COUNT ZB_ZGP_TX_QUEUE_SIZE + (ZB_IOBUF_POOL_SIZE / 4U)
/** Value with which immed_tx_frame_counter is incremented upon a reboot. */
#define ZB_GP_IMMED_TX_FRAME_COUNTER_UPDATE_INTERVAL 1000U
#define ZGP_INCLUDE_DST_LONG_ADDR
#else
#define ZB_ZGP_TX_PACKET_INFO_COUNT ZB_ZGP_TX_QUEUE_SIZE
#endif  /* ZB_ZGP_IMMED_TX */
/** Maximum payload length in outgoing ZGP frames */
#ifndef ZB_ZGP_TX_CMD_PLD_MAX_SIZE
#define ZB_ZGP_TX_CMD_PLD_MAX_SIZE  64U /* Maximum payload size of APP_0000 packet */
#endif

#define ZB_ZGP_LED_COMMISSIONING_PARAMS ZB_LED_ARG_CREATE(0, ZB_LED_BLINK_HALF_SEC)

/* some preconditions and dependencies */
#ifdef ZB_BDB_TOUCHLINK
#define ZB_ENABLE_ZLL
#define ZB_ENABLE_INTER_PAN_EXCHANGE
#endif

/* Add dependency to the Inter-Pan exchange */
#ifdef  ZB_ENABLE_INTER_PAN_NON_DEFAULT_CHANNEL
#ifndef ZB_ENABLE_INTER_PAN_EXCHANGE
#define ZB_ENABLE_INTER_PAN_EXCHANGE
#endif
#endif


/*
  Features to be specified in vendor config:

  - ZB_ENABLE_HA
  - ZB_ENABLE_ZLL
  - ENABLE_ZGP_TARGET_PLUS

  HA specific:
  -ZB_ALL_DEVICE_SUPPORT

*/

/* BDB uses HA clusters */
#if defined ZB_BDB_MODE && !defined ZB_ENABLE_HA
#define ZB_ENABLE_HA
#endif

/**
   Size of table used for long addresses compression: 3 bytes of manufacturer ID.

   ZBOSS implements long address compression: 3 bytes of manufacturer
   ID are stored in the separate table; reference to manufacturer
   entry is stored in the long address giving 2 bytes economy.

   That is an absolute limit of numbers of manufacturers known to the device.

   @note All that machinery will not work if instead of legal
   manufacturer IDs (or illegal, but fixed IDs) use random values.
 */
#ifndef ZB_DEV_MANUFACTURER_TABLE_SIZE
#define ZB_DEV_MANUFACTURER_TABLE_SIZE 32U
#endif

/* There were configuration options for different platforms.
   Since in ZOI we are separating stack and platform making not all platforms visible,
   include here current platform-specific stuff.

   Now every platform has its own platform/include/zb_config_platform.h where we moved stuff like
#if (defined ZB_CONFIG_LINUX_NSNG || defined ZB_CONFIG_SGW_NSNG)
#define ZB_NSNG
#define ZB_DSR_MAC
...


Ideally should rework the whole zb_config.h to suit better for that new concept.

 */
#include "zb_config_platform.h"


/** @cond DOXYGEN_MULTIMAC_SECTION */
  /**
   * Stack supports two configurations: single MAC interface and multiple MAC interfaces (multi-MAC).
   *
   * Single MAC configuration can be activated by ZB_MAC_INTERFACE_SINGLE define in vendor file.
   * Multi-MAC configuration is used if ZB_MAC_INTERFACE_SINGLE is not defined (even if only one MAC is available).
   *
   * There are several available MACs:
   *   - ZB_MAC_MONOLITHIC - monolithic MAC (used by default)
   *   - ZB_MACSPLIT_HOST
   *   - ZB_MACSPLIT_DEVICE - MAC that is used as SoC part for MAC-split host
   *   - ZB_EXTMAC - external MAC
   *   - ZB_MAC_SUBGHZ
   *   - ZB_MAC_BLE - BLE MAC that is used as a part of Zigbee Direct feature
   *
   * Supported MAC types should be defined in vendors, BLE MAC will be registered automatically after Zigbee Direct linking
   * and initialization.
   *
   * ZB_COMPILE_MAC_MONOLITHIC is used to compile monolithic MAC and use it as a part of MAC-split device.
   */

  /* Monolithic MAC is a default interface and used when enabled interfaces are not specified in vendors */

#if !defined(ZB_MAC_BLE) && !defined(ZB_MAC_MONOLITHIC) && !defined(ZB_MACSPLIT_HOST) && !defined(ZB_MACSPLIT_DEVICE) && !defined(ZB_MAC_SUBGHZ) && !defined(NCP_MODE_HOST) && !defined (ZB_EXTMAC)
  #define ZB_MAC_MONOLITHIC
  /*#define ZB_MAC_INTERFACE_SINGLE*/
#endif /* !ZB_MAC_BLE && !ZB_MAC_MONOLITHIC && !ZB_MACSPLIT_HOST && !ZB_MACSPLIT_DEVICE && !ZB_MAC_SUBGHZ && !NCP_MODE_HOST && !ZB_EXTMAC */

#if (defined(ZB_MAC_MONOLITHIC) || defined(ZB_MACSPLIT_DEVICE)) && !defined(ZB_ALIEN_MAC)
  #define ZB_COMPILE_MAC_MONOLITHIC
#endif

/** @endcond */ /* DOXYGEN_MULTIMAC_SECTION */

#ifndef ZB_ZGPD_GPFS_SIZE
#define ZB_ZGPD_GPFS_SIZE 4U
#endif


#if defined(ZB_SUB_GHZ)
#if defined(ZB_SUB_GHZ_EU1)
#define ZB_TRANSCEIVER_MAX_CHANNEL_NUMBER     34U
#define ZB_TRANSCEIVER_START_CHANNEL_NUMBER   0U

#elif defined(ZB_SUB_GHZ_EU2)
#define ZB_TRANSCEIVER_MAX_CHANNEL_NUMBER     17U
#define ZB_TRANSCEIVER_START_CHANNEL_NUMBER   0U

#elif defined(ZB_SUB_GHZ_EU3)
#define ZB_TRANSCEIVER_MAX_CHANNEL_NUMBER     17U
#define ZB_TRANSCEIVER_START_CHANNEL_NUMBER   0U

#elif defined(ZB_SUB_GHZ_US)
#define ZB_TRANSCEIVER_MAX_CHANNEL_NUMBER     10U
#define ZB_TRANSCEIVER_START_CHANNEL_NUMBER   0U
#elif defined ZB_SUB_GHZ_JP
#error "FixMe VS"
//#define ZB_TRANSCEIVER_MAX_CHANNEL_NUMBER     10
//#define ZB_TRANSCEIVER_START_CHANNEL_NUMBER   0
#elif defined ZB_SUB_GHZ_CN
#error "FixMe VS"
//#define ZB_TRANSCEIVER_MAX_CHANNEL_NUMBER     10
//#define ZB_TRANSCEIVER_START_CHANNEL_NUMBER   0
#else
#error "define Region!! (EU or US or JP or CN)"
#endif
#endif  /* ZB_SUB_GHZ */

#ifdef ZB_SUB_GHZ
#if defined(ZB_SUB_GHZ_EU1)    /* European countries and Russia */
//#define ZB_TRANSCEIVER_ALL_CHANNELS_MASK   0x00000001 /* 0000.0000 0000.0000 0000.0000 0000.0001 */
#error "Define ZB_TRANSCEIVER_ALL_CHANNELS_MASK for EU1"
#elif defined(ZB_SUB_GHZ_EU2)    /* European countries and Russia */
#define ZB_TRANSCEIVER_ALL_CHANNELS_MASK   0x0001FFFFU /* 0000.0000 0000.0001 1111.1111 1111.1111 */
#elif defined(ZB_SUB_GHZ_EU3)    /* European countries and Russia */
#define ZB_TRANSCEIVER_ALL_CHANNELS_MASK   0x0001FFFFU /* 0000.0000 0000.0001 1111.1111 1111.1111 */
#elif defined(ZB_SUB_GHZ_US)  /* US channels */
//#define ZB_TRANSCEIVER_ALL_CHANNELS_MASK   0x000007FE /* 0000.0000 0000.0000 0000.0111 1111.1110 */
#error "Define ZB_TRANSCEIVER_ALL_CHANNELS_MASK for USA"
#elif defined(ZB_SUB_GHZ_JP)
#error "Define ZB_TRANSCEIVER_ALL_CHANNELS_MASK for Japan"
#elif defined(ZB_SUB_GHZ_CN)
#error "Define ZB_TRANSCEIVER_ALL_CHANNELS_MASK for China"
#endif
#else
/* #define ZB_TRANSCEIVER_ALL_CHANNELS_MASK   (0xffff << 11) */ /* 0000.0111 1111.1111 1111.1000 0000.0000*/
/* C51 doesn't like long shifts, it just cut last two bytes. (11-26) */
#if defined ZB_SUBGHZ_BAND_ENABLED
#define ZB_TRANSCEIVER_ALL_CHANNELS_MASK   0x07FFF800U     /* 11-26 for compatibility with 2.4Ghz*/
#define ZB_TRANSCEIVER_ALL_CHANNELS_MASK_PAGE23 0xB9FFFFFFU
#define ZB_TRANSCEIVER_ALL_CHANNELS_MASK_PAGE24 0xC01FFFFFU
#define ZB_TRANSCEIVER_ALL_CHANNELS_MASK_PAGE25 0xCFFFFFFFU
#define ZB_TRANSCEIVER_ALL_CHANNELS_MASK_PAGE26 0xD00000FFU
#define ZB_TRANSCEIVER_ALL_CHANNELS_MASK_PAGE27 0xD81FFFFFU
#define ZB_TRANSCEIVER_ALL_CHANNELS_MASK_PAGE28 0xE7FFFFFFU
#define ZB_TRANSCEIVER_ALL_CHANNELS_MASK_PAGE29 0xE80001FFU
#define ZB_TRANSCEIVER_ALL_CHANNELS_MASK_PAGE30 0xF7FFFFFFU
#define ZB_TRANSCEIVER_ALL_CHANNELS_MASK_PAGE31 0xFFFFFFFFU
#else

/* Channels mask can be defined in platform configuration, so
 * check its existence here */
#ifndef ZB_TRANSCEIVER_ALL_CHANNELS_MASK
#define ZB_TRANSCEIVER_ALL_CHANNELS_MASK   0x07FFF800U /* 0000.0111 1111.1111 1111.1000 0000.0000*/
#endif /* ZB_TRANSCEIVER_ALL_CHANNELS_MASK */

#endif /* !ZB_SUBGHZ_BAND_ENABLED */
#endif /*ZB_SUB_GHZ*/

#define MAC_DEVICE_TABLE_SIZE 4U

#if defined ZB_ENABLE_INTER_PAN_EXCHANGE && ! defined ZB_MAC_EXT_DATA_REQ
#define ZB_MAC_EXT_DATA_REQ
#endif /* defined ZB_ENABLE_INTER_PAN_EXCHANGE && ! defined ZB_MAC_EXT_DATA_REQ */

#ifdef ZB_MACSPLIT_DEVICE

#ifndef ZB_MACSPLIT
#define ZB_MACSPLIT
#endif

#define NVRAM_NOT_AVAILABLE
#ifdef ZB_ED_ROLE
#undef ZB_ED_ROLE
#endif
#ifdef ZB_USE_NVRAM
#undef ZB_USE_NVRAM
#endif
#ifdef ZB_ENABLE_HA
#undef ZB_ENABLE_HA
#endif
#ifdef ZB_BDB_MODE
#undef ZB_BDB_MODE
#endif
#ifdef ZB_DISTRIBUTED_SECURITY_ON
#undef ZB_DISTRIBUTED_SECURITY_ON
#endif
#ifdef ZB_CONFIGURABLE_MEM
#error "MACSPLIT SOC cannot be compiled with configurable memory"
#endif
#endif  /* ZB_MACSPLIT_DEVICE */

#ifdef ZB_MACSPLIT_HOST

#ifndef ZB_MACSPLIT
#define ZB_MACSPLIT
#endif

#endif  /* ZB_MACSPLIT_HOST */

#ifdef ZB_MACSPLIT

#if defined ZB_MACSPLIT_TRANSPORT_EXTERNAL
#define ZB_MACSPLIT_TRANSPORT_TYPE ZB_MACSPLIT_TRANSPORT_TYPE_EXTERNAL
#elif defined ZB_MACSPLIT_TRANSPORT_SERIAL || defined ZB_TRANSPORT_LINUX_UART

#if defined ZB_MACSPLIT_TRANSPORT_MUX
#define ZB_MACSPLIT_TRANSPORT_TYPE ZB_MACSPLIT_TRANSPORT_TYPE_MUX
#else
#define ZB_MACSPLIT_TRANSPORT_TYPE ZB_MACSPLIT_TRANSPORT_TYPE_SERIAL
#endif /* ZB_MACSPLIT_TRANSPORT_MUX */

#elif defined ZB_MACSPLIT_TRANSPORT_USERIAL
#define ZB_MACSPLIT_TRANSPORT_TYPE ZB_MACSPLIT_TRANSPORT_TYPE_USERIAL
#elif defined ZB_MACSPLIT_TRANSPORT_SPI
#define ZB_MACSPLIT_TRANSPORT_TYPE ZB_MACSPLIT_TRANSPORT_TYPE_SPI
#elif defined ZB_MACSPLIT_TRANSPORT_MUX
#define ZB_MACSPLIT_TRANSPORT_TYPE ZB_MACSPLIT_TRANSPORT_TYPE_MUX
#endif

#endif  /* ZB_MACSPLIT */


/* MAC transport in Linux, line NSNG, uart/MAC-Split etc */
#ifdef MAC_TRANSPORT_USES_SELECT
/* Since we are waiting for event inside select() call in the same
 * thread as main loop runs, we have no radio which can wake up MCU, so
 * ZR can't sleep. Only sleepy ZED can be put asleep. */
#define ZB_MAC_RADIO_CANT_WAKEUP_MCU
#endif

/***********************************************************************/
/****************************General stack options**********************/
/***********************************************************************/

#define ZB_VERSION "0.2.0.1"

/*! \addtogroup ZB_CONFIG */
/*! @{ */

/** Network Selection Stack Profile ID*/
#define STACK_NETWORK_SELECT  0x00U
/** 2007 Stack Profile ID */
#define STACK_2007            0x01U
/** Pro Stack Profile ID */
#define STACK_PRO             0x02U

/**
   This define switches PRO version on or off.
*/
#define ZB_PRO_STACK

/**
   If defined, 2007 stack profile is implemented
*/
//#define ZB_STACK_PROFILE_2007

/**
 *    If defined, NVRAM is used
 *    Create *.nvram file
 *
 *    To be used near always to prevent flash damage (flash can do ~1000 rewrites only)
 *
 *    For certification test need comment.
 *    Else change Assignment to Rejoin for second and last runs
 *
 */
//#define NVRAM_NOT_AVAILABLE

#if !defined NVRAM_NOT_AVAILABLE && !defined ZB_USE_NVRAM
#define ZB_USE_NVRAM
#endif
/*! @} */ /* ZB_CONFIG */

/**
   Use 32-bit timer
*/
#define ZB_TIMER_32

#ifndef ZB_CB_QUANT
#define ZB_CB_QUANT 1U
#endif  /* !ZB_CB_QUANT */

/*! \addtogroup ZB_CONFIG */
/*! @{ */

/* MMDEVQ: what to do??? */
/**
   Zigbee channel selection.
   Default value of ZB_AIB().aps_channel_mask
   Channels to be used for discovery and join.
   If a single channel is selected, there is no need to perform energy scan.

   @note ZLL, HA, ZLL tests can redefine this mask with the means of other constants.
*/

/* ZB_DEFAULT_APS_CHANNEL_MASK can be redefined in zb_vendor.h */
#ifndef ZB_DEFAULT_APS_CHANNEL_MASK
#ifdef ZB_SUB_GHZ
#if defined(ZB_SUB_GHZ_EU1)    /* European countries and Russia */
//#define ZB_TRANSCEIVER_ALL_CHANNELS_MASK   0x00000001 /* 0000.0000 0000.0000 0000.0000 0000.0001 */
#error "Define ZB_DEFAULT_APS_CHANNEL_MASK for EU1"
#elif defined(ZB_SUB_GHZ_EU2)    /* European countries and Russia */
//#define ZB_DEFAULT_APS_CHANNEL_MASK ((1l<<11))
#define ZB_DEFAULT_APS_CHANNEL_MASK ((1Ul<<11U))
#elif defined(ZB_SUB_GHZ_EU3)    /* European countries and Russia */
#define ZB_DEFAULT_APS_CHANNEL_MASK ((1Ul<<11U))
#elif defined(ZB_SUB_GHZ_US)  /* US channels */
//#define ZB_DEFAULT_APS_CHANNEL_MASK ((1l<<11))
#error "Define ZB_DEFAULT_APS_CHANNEL_MASK for USA"
#elif defined(ZB_SUB_GHZ_JP)
#error "Define ZB_DEFAULT_APS_CHANNEL_MASK for Japan"
#elif defined(ZB_SUB_GHZ_CN)
#error "Define ZB_DEFAULT_APS_CHANNEL_MASK for China"
#endif
#else
//#define ZB_DEFAULT_APS_CHANNEL_MASK ((1l<<11))
/* Change that place if you want to set channel for internal tests */
//#define ZB_DEFAULT_APS_CHANNEL_MASK ((1l<<11))
/* #define ZB_DEFAULT_APS_CHANNEL_MASK ((1l<<16)) */
#define ZB_DEFAULT_APS_CHANNEL_MASK (ZB_TRANSCEIVER_ALL_CHANNELS_MASK)
#endif
#endif  /* ZB_DEFAULT_APS_CHANNEL_MASK */
/** @} */ /* ZB_CONFIG */


/*  PRO stack specific details */
#ifndef ZB_PRO_STACK
/**
   NWK: If defined, use distributed address assigning for tree and for mesh routing (Zigbee 2007).
*/
#define ZB_NWK_DISTRIBUTED_ADDRESS_ASSIGN
#else /*ZB_PRO_STACK*/
/**
   NWK: If defined, use stochastic address assignment (Zigbee PRO).
*/
#define ZB_NWK_STOCHASTIC_ADDRESS_ASSIGN

/*! Source routing path length, also called nwkMaxSourceRoute */
#define ZB_NWK_MAX_PATH_LENGTH  5U
/*! Source route table capacity */
/* 10/21/2019 EE CR:MINOR Isn't it too many? Can we handle situation when source route table is not big enough? */
#define ZB_NWK_MAX_SRC_ROUTES   ZB_NEIGHBOR_TABLE_SIZE
/* 10/21/2019 EE CR:MINOR Better indicate in const name that this is time in seconds by adding _S suffix */
/*! Expiration time of the source route table (300 sec) */
#define ZB_NWK_SRC_ROUTE_TABLE_EXPIRY 60U

/**
   Minimal time between MTORR when ZBOSS decided to run MTORR at some event
 */
#define ZB_MIN_TIME_BETWEEN_MTORR ZB_MILLISECONDS_TO_BEACON_INTERVAL(10000u)
/**
   If advised to send MTORR, do it after that delay
 */
#define ZB_DELAY_BEFORE_ADVISED_MTORR ZB_MILLISECONDS_TO_BEACON_INTERVAL(2000u)


#define ZB_DELAY_BEFORE_ADVISED_MTORR_HIPRI ZB_MILLISECONDS_TO_BEACON_INTERVAL(500u)

/**
   Delay to Send MTORR just after boot
 */
#define ZB_DELAY_BEFORE_MTORR_AT_BOOT ZB_MILLISECONDS_TO_BEACON_INTERVAL(100u)

#endif /*ZB_PRO_STACK*/

#if defined ZB_MULTIPAN_HOST && !defined ZB_MULTIPAN_DISABLE_CHANNEL_CHANGE_BLOCKING_WHILE_JOINED
/** This define disables channel changing by default (except for temporary channel changes) while device is on network
 *  regardless of device's role. It may be ZC that formed the network or ZR/ZED that joined it.
 *  This feature may be configured in run-time, see zb_nwk_mutlipan_allow_channel_change_while_joined for more info. */
#define ZB_MULTIPAN_ENABLE_CHANNEL_CHANGE_BLOCKING_WHILE_JOINED
#endif /* ZB_MULTIPAN_HOST && !ZB_MULTIPAN_DISABLE_CHANNEL_CHANGE_BLOCKING_WHILE_JOINED */


#if defined ZB_MAC_PENDING_BIT_SOURCE_MATCHING

#if !defined ZB_MAC_SWITCHABLE_PB_MATCHING && defined ZB_MAC_SOFTWARE_PB_MATCHING && defined ZB_MAC_HARDWARE_PB_MATCHING
#error "Do not define SW and HW pending bit matching at the same time! Use ZB_MAC_SWITCHABLE_PB_MATCHING instead of it!"
#endif /* !ZB_MAC_SWITCHABLE_PB_MATCHING && ZB_MAC_SOFTWARE_PB_MATCHING && ZB_MAC_HARDWARE_PB_MATCHING */

#if defined ZB_MAC_SWITCHABLE_PB_MATCHING
#ifndef ZB_MAC_SOFTWARE_PB_MATCHING
#define ZB_MAC_SOFTWARE_PB_MATCHING
#endif

#ifndef ZB_MAC_HARDWARE_PB_MATCHING
#define ZB_MAC_HARDWARE_PB_MATCHING
#endif
#endif /* ZB_MAC_SWITCHABLE_PB_MATCHING */

#endif /* ZB_MAC_PENDING_BIT_SOURCE_MATCHING */


#if defined ZB_MAC_SWITCHABLE_PB_MATCHING || defined ZB_MAC_SOFTWARE_PB_MATCHING || defined ZB_MAC_HARDWARE_PB_MATCHING

#ifndef ZB_MAC_PENDING_BIT_SOURCE_MATCHING
#error "ZB_MAC_PENDING_BIT_SOURCE_MATCHING must be defined in your vendor or platform config file either!"
#endif /* !ZB_MAC_PENDING_BIT_SOURCE_MATCHING */

#endif /* ZB_MAC_SWITCHABLE_PB_MATCHING || ZB_MAC_SOFTWARE_PB_MATCHING || ZB_MAC_HARDWARE_PB_MATCHING */


/****************************Zigbee Roles*******************************/

/*
# Device roles per build.

We usually have ZC and ZR combined.
We can have ZR which can be switched to ZED (via reset to factory defaults), or ZR which is "just ZR".
It could be useful to have ZC-only and ZR-only libraries.
ZED rx-on-when-idle can be configurable at runtime or at compile time.

To better divide ZC an ZR define functionality groups:

- routing & parent srv (zc & zr) - ZB_ROUTER_ROLE (name is not perfect, but keep it to minimize code change)
- centralized TC - ZB_COORDINATOR_ROLE  (name is not perfect, but keep it to minimize code change)
- joiner client functionality (zr & zed) - ZB_JOIN_CLIENT
- formation functionality - ZB_FORMATION == ZB_COORDINATOR_ROLE || ZB_ROUTER_ROLE && ZB_DISTRIBUTED_SECURITY_ON. Also in request key etc
- distributed-only ZR build (do not link router's update device etc) - ZB_DISTRIBUTED_ONLY
- distributed security - ZB_ROUTER_ROLE & ZB_DISTRIBUTED_SECURITY_ON
  - ZR (link if enabled?)
- router security (upd dev send etc) ZB_ROUTER_SECURITY == ZB_ROUTER_ROLE && !ZB_COORDINATOR_ROLE && !ZB_DISTRIBUTED_ONLY
- By default

- panid conflict resolution (TBD)
  - ZC part - always, or if enabled
  - ZR part - if enabled

- address conflict resolution (TBD)
  - in ZR role
  - in ZC role (recheck: is it so?)

- ZED functionality (either ZED or ZR) - ZB_ED_FUNC. Can be present in ED-only or ZR build.

ZB_ED_ROLE == ZB_ED_FUNC && !ZB_ROUTER_ROLE && !ZB_COORDINATOR_ROLE

ZB_ED_FUNC is polling and ED aging.

ZB_ROUTER_ROLE, ZB_COORDINATOR_ROLE, ZB_ED_ROLE defines exists for the very beginning. Let's keep it in the code where it is appropriate.

In general, define ZB_COORDINATOR_ROLE to compile ZC-only build, ZB_ROUTER_ROLE to compile ZR+ZED build, ZB_ED_ROLE to compile ZED-only build.
 */

#if !defined ZB_ED_ROLE && !defined ZB_ZGPD_ROLE && !defined ZB_COORDINATOR_ROLE && !defined ZB_ROUTER_ROLE
/**
   If no any role defined, let it be max possible roles set: ZC + ZR switchable to ZED at runtime
*/
#define ZB_COORDINATOR_ROLE
#define ZB_ROUTER_ROLE
/**
 * If ZB_ROUTER_NO_ED defined, ZR library has no ZED functionality.
 * ZR can't switch to ZED mode from application or implicitly join as ZED.
 */
#ifndef ZB_ROUTER_NO_ED
/*! Define Zigbee end device functionality */
#define ZB_ED_FUNC
#endif
#endif

#if defined ZB_ED_ROLE || defined ZB_ROUTER_ROLE
/*! Define joiner client functionality */
#define ZB_JOIN_CLIENT
#endif

#if defined ZB_COORDINATOR_ROLE && !defined ZB_ROUTER_ROLE
/**
   If only ZB_COORDINATOR_ROLE is defined, only ZC role is compiled.
*/
#define ZB_ROUTER_ROLE
#define ZB_COORDINATOR_ONLY
#endif /*defined ZB_COORDINATOR_ROLE && !defined ZB_ROUTER_ROLE*/

#if defined ZB_ROUTER_ROLE && !defined ZB_COORDINATOR_ONLY && !defined ZB_ROUTER_NO_ED

/* By default ZR can be switched to ZED at runtime. */
/*! ZB end device functionality */
#ifndef ZB_ED_FUNC
#define ZB_ED_FUNC
#endif

#endif

/*
Related defines
ZB_LITE_ROUTER_ONLY_ROLE
ZB_ED_RX_OFF_WHEN_IDLE
 */

#if defined ZB_COORDINATOR_ROLE || (defined ZB_ROUTER_ROLE && defined ZB_DISTRIBUTED_SECURITY_ON)

/*! Formation is supported by ZC or ZR in Distributed mode */
#define ZB_FORMATION
#endif

#if defined ZB_ROUTER_ROLE && !defined ZB_COORDINATOR_ONLY && !defined ZB_DISTRIBUTED_ONLY
/*! Defines router security */
#define ZB_ROUTER_SECURITY
#endif

#if defined ZB_ED_ROLE && (defined ZB_ROUTER_ROLE || defined ZB_COORDINATOR_ROLE)
#error Conflicting defines: ZB_ED_ROLE excludes ZB_ROUTER_ROLE/ZB_COORDINATOR_ROLE
#endif

#ifdef ZB_ED_ROLE
/* ED functionality is implemented by ZED-only build or ZR switchable to ZED */
#define ZB_ED_FUNC
#endif
/** @addtogroup ZB_CONFIG */
/** @{ */

#if !defined ZB_CONFIGURABLE_MEM && !defined ZB_NWK_DISC_TABLE_SIZE
#ifndef ZB_MEMORY_COMPACT
#define ZB_NWK_DISC_TABLE_SIZE 32U
#else
#define ZB_NWK_DISC_TABLE_SIZE 6U
#endif
#endif



/**
 *   NWK: size of the neighbor table
 *
 *  @note This is a default value of the define. This value can be changed by user.
 */
#ifndef ZB_NEIGHBOR_TABLE_SIZE

#if defined ZB_COORDINATOR_ROLE
#define ZB_NEIGHBOR_TABLE_SIZE 32U

#elif defined ZB_ROUTER_ROLE
#define ZB_NEIGHBOR_TABLE_SIZE 32U

#elif defined ZB_ED_ROLE
/* Space for Parent only. Now ext neighbor functionality is in nwk disc table */
#define ZB_NEIGHBOR_TABLE_SIZE 1U

#elif defined ZB_ZGPD_ROLE
/* zcl_common.zgpd.o won't be built without any ZB_NEIGHBOR_TABLE_SIZE definition. */
#define ZB_NEIGHBOR_TABLE_SIZE 1U

#else
#error No any role defined
#endif  /* roles */

#endif /* ZB_NEIGHBOR_TABLE_SIZE */

#if ZB_NEIGHBOR_TABLE_SIZE > 255U
#error ZB_NEIGHBOR_TABLE_SIZE should be less than 255 (fit into 1 byte)
#endif

#if (defined ZB_ED_ROLE) && (ZB_NEIGHBOR_TABLE_SIZE != 1)
#error Invalid configuration, neighbor table for ED build should have a single entry according to R23 PICS - "NWK-NT-SIZE-ZED - Neighbor Table Size is equal to 1 (for End Devices)"
#endif

/**
 *  Scheduler callbacks queue size. Usually not need to change it.
 *
 *  @note This is a default value of the define. This value can be changed by user.
*/
#ifndef ZB_SCHEDULER_Q_SIZE
#ifdef ZB_ED_ROLE
#define ZB_SCHEDULER_Q_SIZE 16U
#else
/* @note: If set ZB_SCHEDULER_Q_SIZE > 32 is set, change alarms bitmask in the scheduler */
#define ZB_SCHEDULER_Q_SIZE 32U
#endif
#endif /*ZB_SCHEDULER_Q_SIZE*/
/** @} */ /* ZB_CONFIG */
#if defined ZB_ED_ROLE
/**
   End device idle time-out
*/
#define ZB_TIME_ED_IDLE ZB_MILLISECONDS_TO_BEACON_INTERVAL(7500)
#endif


#if defined ZB_ROUTER_ROLE
/**
   NWK: If defined, enable routing functionality
*/
#define ZB_NWK_ROUTING

/**
   Number of secure materials to store
*/
#define N_SECUR_MATERIAL 3U


#ifndef ZB_NWK_STOCHASTIC_ADDRESS_ASSIGN
/**
   If not defined, implement tree routing
*/
#define ZB_NWK_TREE_ROUTING
#endif /*ZB_NWK_STOCHASTIC_ADDRESS_ASSIGN*/

/**
   NWK: if defined, implement mesh routing
*/
#define ZB_NWK_MESH_ROUTING

#else

#define N_SECUR_MATERIAL 1U

#endif  /* coordinator or router */


/****************************APS layer options**************************/
/** @addtogroup ZB_CONFIG */
/** @{ */
#ifndef ZB_MAX_EP_NUMBER
/* max supported EP number, increase if needed */
/** Maximum number of supported endpoints per device */
#define ZB_MAX_EP_NUMBER 5U
#endif
/* APS binding */

#ifndef ZB_MEMORY_COMPACT

#ifndef ZB_APS_SRC_BINDING_TABLE_SIZE
/**
 *  APS: SRC binding table size
 *
 *  @note This is a default value of the define. This value can be changed by user.
*/
#define ZB_APS_SRC_BINDING_TABLE_SIZE 32U
#endif


#ifndef ZB_APS_DST_BINDING_TABLE_SIZE
/**
 *   APS: DST binding table size
 *
 *   @note This is a default value of the define. This value can be changed by user.
*/
#define ZB_APS_DST_BINDING_TABLE_SIZE 32U
#endif


#ifndef ZB_APS_GROUP_TABLE_SIZE
/**
   APS: max number of groups in the system
*/
#define ZB_APS_GROUP_TABLE_SIZE       16U
#endif


#ifndef ZB_APS_ENDPOINTS_IN_GROUP_TABLE
/**
   APS: max number of endpoints per group table entry
*/
#define ZB_APS_ENDPOINTS_IN_GROUP_TABLE 8U
#endif

/**
   APS: size of queue to be used to pass
   incoming group addresses packets up
*/
#define ZB_APS_GROUP_UP_Q_SIZE 8U

#else  /* ZB_MEMORY_COMPACT */

#ifndef ZB_APS_SRC_BINDING_TABLE_SIZE
#define ZB_APS_SRC_BINDING_TABLE_SIZE 8U
#endif


#ifndef ZB_APS_DST_BINDING_TABLE_SIZE
/**
   APS: DST binding table size
*/
#define ZB_APS_DST_BINDING_TABLE_SIZE 8U
#endif


#ifndef ZB_APS_GROUP_TABLE_SIZE
/**
   APS: max number of groups in the system
*/
#define ZB_APS_GROUP_TABLE_SIZE       4U
#endif


#ifndef ZB_APS_ENDPOINTS_IN_GROUP_TABLE
/**
   APS: max number of endpoints per group table entry
*/
#define ZB_APS_ENDPOINTS_IN_GROUP_TABLE 4U
#endif

/**
   APS: size of queue to be used to pass
   incoming group addresses packets up
*/
#define ZB_APS_GROUP_UP_Q_SIZE 4U

#endif  /* ZB_MEMORY_COMPACT */


#ifndef ZB_N_APS_KEY_PAIR_ARR_MAX_SIZE
/**
 * APS: maximum number of tables with key-pair information
 *
 * @note This is a default value of the define. This value can be changed by user.
*/
#ifdef ZB_ED_ROLE
#define ZB_N_APS_KEY_PAIR_ARR_MAX_SIZE            5U
#else
/* [EE] 05/25/2016 CR:MINOR Set it to some big value - say, 128. This is total #
 * of devices in the network, not neighbor table size */
#define ZB_N_APS_KEY_PAIR_ARR_MAX_SIZE            ZB_NEIGHBOR_TABLE_SIZE
#endif
#endif

/**
   If the joining device does not receive any of
   the keys within apsSecurityTimeOutPeriod, of receiving the NLME-JOIN.
   confirm primitive, it shall reset

   apsSecurityTimeOutPeriod value for revision 23 equal to 10 seconds
   (See Zigbee specification subclause 4.4.12)
*/
#ifdef ZB_PRO_STACK
#define ZB_APS_SECURITY_TIME_OUT_PERIOD_DEFAULT 10000U
#else
/* i.e. 700 milliseconds on 2.4 GHz */
#define ZB_APS_SECURITY_TIME_OUT_PERIOD_DEFAULT 700U
#endif

/**
 APS: Get APS ACK wait time for the device depending on its receiver on when idle
*/
/* WARNING: Generally, it is not according to spec. There are some nwk and APS routines that should
 * correlate to this interval, for these we will use ZB_N_APS_ACK_WAIT_DURATION_FROM_SLEEPY. */
#if !(defined ZB_ED_RX_OFF_WHEN_IDLE && defined ZB_ED_ROLE)
#define ZB_N_APS_ACK_WAIT_DURATION(_rx_on_when_idle)  \
  ((_rx_on_when_idle) ?                                                 \
   ZB_N_APS_ACK_WAIT_DURATION_FROM_NON_SLEEPY : ZB_N_APS_ACK_WAIT_DURATION_FROM_SLEEPY)
#else
#define ZB_N_APS_ACK_WAIT_DURATION(_rx_on_when_idle)  \
  (ZB_N_APS_ACK_WAIT_DURATION_FROM_SLEEPY)
#endif

/****************************NWK layer options**************************/

/*
  If defined, NWK and upper layers can access PIB directly.

  Usually, can be defined when using our MAC.
  Undef it to separate MAC and upper layers IB spaces for debug purposes.

  #define ZB_DIRECT_PIB_ACCESS

*/
/**
 *   NWK: size of the long-short address translation table
 *
 *   @note This is a default value of the define. This value can be changed by user.
*/
#ifndef ZB_IEEE_ADDR_TABLE_SIZE
#ifndef ZB_MEMORY_COMPACT
#define ZB_IEEE_ADDR_TABLE_SIZE 101U
#else /* ZB_MEMORY_COMPACT */
#define ZB_IEEE_ADDR_TABLE_SIZE 32U
#endif /* ZB_MEMORY_COMPACT */
#endif /* ZB_IEEE_ADDR_TABLE_SIZE */

#ifndef ZB_PANID_TABLE_SIZE
/**
   NWK: size of the long-short Pan ID translation table

   Must be <= (packet buffer size - sizeof(*discovery_confirm)) / sizeof(*network_descriptor)

   That value limits number of Pan IDs visible for device during active scan.
*/
#define ZB_PANID_TABLE_SIZE 16U
#endif
/** @cond DOXYGEN_INTERNAL_DOC */
/**
   If defined, add jitter to broadcast transmits etc.

   @note It adds zb_random() and breaks some tests that are supposed to know
   next generated address by setting random generator start.
*/
#define ZB_NWK_USE_SEND_JITTER
/** @endcond */ /* DOXYGEN_INTERNAL_DOC */
/* Some defaults for ZDO startup */

#ifndef ZB_TRACE_LEVEL
/**
   NWK: default energy/active scan duration
*/
#define ZB_DEFAULT_SCAN_DURATION 4U

#ifdef ZB_SUBGHZ_BAND_ENABLED
/** @cond DOXYGEN_SUBGHZ_FEATURE */
/* as defined in D.7 of Zigbee/r22 */
#define ZB_DEFAULT_SCAN_DURATION_SUB_GHZ 7U
/** @endcond */ /* DOXYGEN_SUBGHZ_FEATURE */
#else
#define ZB_DEFAULT_SCAN_DURATION_SUB_GHZ ZB_DEFAULT_SCAN_DURATION
#endif /* !ZB_SUBGHZ_BAND_ENABLED */

#else  /* ZB_TRACE_LEVEL */

#ifndef ZB_NSNG
/* SNCP release build has enabled trace and in the same time requires to have scan duration value set to 3 */
#ifdef SNCP_MODE
#define ZB_DEFAULT_SCAN_DURATION 3U
#else
#define ZB_DEFAULT_SCAN_DURATION 5U
#endif /* SNCP_MODE */
#else
/* Increase scan duration for NSNG: usually it runs with high trace level, so we can miss beacons if scan too fast */
#define ZB_DEFAULT_SCAN_DURATION 6U
#endif

#if defined ZB_SUBGHZ_BAND_ENABLED
#define ZB_DEFAULT_SCAN_DURATION_SUB_GHZ 7U
#else
#define ZB_DEFAULT_SCAN_DURATION_SUB_GHZ ZB_DEFAULT_SCAN_DURATION
#endif /* !ZB_SUBGHZ_BAND_ENABLED */

#endif /*ZB_TRACE_LEVEL*/


#if ZB_ZDO_NWK_SCAN_ATTEMPTS == 1U
/**
   Integer value representing the
   * number of scan attempts to make
   * before the NWK layer decides
   * which Zigbee coordinator or
   * router to associate with
   */

#define ZB_NWK_ONE_SCAN_ATTEMPT
#endif /*ZB_ZDO_NWK_SCAN_ATTEMPTS == 1*/


/**
   Number of pending Mgmt_Leave requests allowed
*/
#ifndef ZB_MEMORY_COMPACT
#define ZB_ZDO_PENDING_LEAVE_SIZE 4U
#else
#define ZB_ZDO_PENDING_LEAVE_SIZE 2U
#endif /*ZB_MEMORY_COMPACT*/
/** @cond DOXYGEN_INTERNAL_DOC */
#ifndef ZB_COORDINATOR_ONLY
/* Enables PAN blacklisting. Note: it was under ifdef
 * ZB_COORDINATOR_ROLE. But ZBOSS usually built with ZR & ZC, so
 * blacklist is useful for ZR. */
/** Enables PAN blacklisting */
#define ZB_NWK_BLACKLIST
#ifndef ZB_NWK_BLACKLIST_SIZE
/** Size of PAN IDs blacklist */
#define ZB_NWK_BLACKLIST_SIZE 16U
#endif
#endif

/**
 *   NWK Mesh route: routing table size
 *
 *   @note This is a default value of the define. This value can be changed by user.
*/
#ifndef ZB_MEMORY_COMPACT
#define ZB_NWK_ROUTING_TABLE_SIZE ZB_NEIGHBOR_TABLE_SIZE
#else
#define ZB_NWK_ROUTING_TABLE_SIZE 5U
#endif
/** @endcond */ /* DOXYGEN_INTERNAL_DOC */

/** Maximum channel pages number according to the Zigbee revision 23 specification */
#define ZB_CHANNEL_PAGES_MAX_NUM 11u

/**
   Size of channel list structure
*/
#if defined ZB_SUBGHZ_BAND_ENABLED
#define ZB_CHANNEL_PAGES_NUM 10U
#else
#define ZB_CHANNEL_PAGES_NUM 1u
#endif  /* !ZB_SUBGHZ_BAND_ENABLED */
/** @endcond */

/*! @cond DOXYGEN_INTERNAL_DOC */
/**
The minimum value of the
backoff exponent (BE) in the
CSMA-CA algorithm. See
7.5.1.4 for a detailed
explanation of the backoff
exponent.
 */
/* As defined in D.6 Zigbee/r22 spec */
#define ZB_MAC_MIN_BE 5U

 /**
The maximum value of the
backoff exponent, BE, in the
CSMA-CA algorithm. See
7.5.1.4 for a detailed
explanation of the backoff
exponent.
 */
/* As defined in D.6 Zigbee/r22 spec */
#define ZB_MAC_MAX_BE 8U

/*! @endcond */ /* DOXYGEN_INTERNAL_DOC */

#ifdef ZB_MAC_POLL_INDICATION_CALLS_REDUCED
/**
    The shortest timeout according to the spec is 10 sec, and the spec recommends to send
    keepalive message thrice during timeout period. 3.6.10.3 Zigbee/r22 spec
 */
#define MAC_POLL_TIMEOUT_THRESHOLD (3U * ZB_TIME_ONE_SECOND)
#endif /* ZB_MAC_POLL_INDICATION_CALLS_REDUCED */

/** @cond DOXYGEN_INTERNAL_DOC */
#ifndef ZB_NWK_NEIGHBOUR_PATH_COST_RSSI_BASED
/**
    Neighbor path cost calculation method.
    By default, calculate neighbor path cost from LQI value as described in ZB
    spec(section 3.6.3.1). But for some special cases (e.g. LCGW) we need to calculate path cost
    from RSSI value.
 */
#define ZB_NWK_NEIGHBOUR_PATH_COST_LQI_BASED
#endif /* ZB_NWK_NEIGHBOUR_PATH_COST_RSSI_BASED */

/*! Reserved space for routing on a parent when a device in ZED role.
 *
 * According to R22 specification 3.6.3.3 and 3.6.3.3.1:
 * Source route info is added when a data frame is received from the NEXT HIGHER LAYER
 * Since Source Route is only added on ZC, this case only happens when ZC is the one
 * creating the frame.
 * When a ZED sends a packet that is routed through ZC, Source Route is not added
 * to the packet, thus we do not have to reserve space for that in ZED.
*/
#define ZB_NWK_RESERVED_SPACE_FOR_PARENT_ROUTING 0U
/** @endcond */ /* DOXYGEN_INTERNAL_DOC */

/***********************************************************************/
/***************************ZBOSS FEATURES SECTION**********************/
/***********************************************************************/

/***************************STACK FEATURES**********************/

/** @cond DOXYGEN_INTERNAL_DOC *//* Current stack profile */
#if defined ZB_PRO_STACK
#define ZB_STACK_PROFILE        STACK_PRO
#else
#define ZB_STACK_PROFILE        STACK_2007
#endif

/**
   Protocol version selection: see table 1.1(pro-specification)
*/
#if ZB_STACK_PROFILE == STACK_PRO || ZB_STACK_PROFILE == STACK_2007
#define ZB_PROTOCOL_VERSION 0x02U
#else
#define ZB_PROTOCOL_VERSION 0x01U
#endif
/** @endcond */ /* DOXYGEN_INTERNAL_DOC ZB_STACK_PROFILE */


#ifndef ZB_BUF_Q_SIZE
/* @note To prevent deadlocks ZB_BUF_Q_SIZE must be < ZB_IOBUF_POOL_SIZE/2 */
/**
   Size of queue for wait for free packet buffer
*/
#define ZB_BUF_Q_SIZE 8U
#endif /*ZB_BUF_Q_SIZE*/

/**
   Size, in bytes, of the packet buffer

   @internal Be sure keep it multiple of 4 to exclude alignment problems at ARM
*/
#ifndef ZB_IO_BUF_SIZE

/* Set the ZBOSS buffer size according to the set of enabled MAC features. */
#ifdef ZB_MAC_SECURITY
#define ZB_IO_BUF_SIZE 164U
#else /* ZB_MAC_SECURITY */
#define ZB_IO_BUF_SIZE 152U
#endif /* ZB_MAC_SECURITY */
#endif  /* ZB_IO_BUF_SIZE */

/**
   Buffer tail portion alignment - 4.

   Note: not sizeof(zb_size_t) because at 64-bit build it is 8 which we don't want.
 */
#define ZB_BUF_ALLOC_ALIGN (4U)

#if (ZB_IO_BUF_SIZE % ZB_BUF_ALLOC_ALIGN) > 0U
#error ZB_IO_BUF_SIZE must be multiple of ZB_BUF_ALLOC_ALIGN
#endif

/**
   Number of fragmented packets which ZBOSS can receive in parallel
 */
#define ZB_APS_MAX_IN_FRAGMENT_TRANSMISSIONS 3U

/**
 *   Number of packet buffers. More buffers - more memory. Less buffers - risk to be blocked due to buffer absence.
 *
 *   @note This is a default value of the define. This value can be changed by user.
*/
#ifndef ZB_IOBUF_POOL_SIZE
#if defined ZB_MEMORY_COMPACT && defined ZB_ED_ROLE
#define ZB_IOBUF_POOL_SIZE 20U
#else
#define ZB_IOBUF_POOL_SIZE 26U
#endif
#endif

/** @cond DOXYGEN_INTERNAL_DOC */
/*
  If enabled, real int24 and uint48 types will work. Else, int24 and uint48 is mapped to
  int32 and uint32.
  See include/zb_uint48.h.
*/
/** Enable support for int24 and uint48 data types */
#ifndef ZB_NO_UINT24_48_SUPPORT
#define ZB_UINT24_48_SUPPORT
#endif /* !ZB_NO_UINT24_48_SUPPORT */
/** @endcond */ /* DOXYGEN_INTERNAL_DOC */

/** Should expire in this number of attempts if failure*/
#define ZB_NWK_ROUTING_FAILURE_ATTEMPTS_NUM 1U

/** Calculate routing expiry step interval based on timer initiation value and number of attempts*/
#define ZB_NWK_ROUTING_FAILURE_EXPIRY_STEP (ZB_NWK_ROUTING_TABLE_EXPIRY / ZB_NWK_ROUTING_FAILURE_ATTEMPTS_NUM)

#ifndef ZB_ZDO_KEY_NEGOTIATIONS_NUM

/**
 * ZDO: Maximum number of parallel Key Negotiation procedures on the TC side
 */
#ifndef ZB_ED_ROLE
#define ZB_ZDO_KEY_NEGOTIATIONS_NUM 10U
#else
#define ZB_ZDO_KEY_NEGOTIATIONS_NUM 1U
#endif /* ZB_ED_ROLE */

#endif /* ZB_ZDO_KEY_NEGOTIATIONS_NUM */

/**
   Number of times device fails to send packet to the parent before rejoin
*/
#define ZB_ZDO_PARENT_LINK_FAILURE_CNT 12U

/** @cond DOXYGEN_INTERNAL_DOC */
//#define ZB_ZDO_CHECK_FAILS_NWK_UPDATE_NOTIFY_LIMIT 4
#define ZB_ZDO_CHECK_FAILS_CLEAR_TIMEOUT (30U * ZB_TIME_ONE_SECOND)

#define ZB_PREDEFINED_ROUTER_ADDR 0x3344U
#define ZB_PREDEFINED_ED_ADDR     0x3344U
/** @endcond */ /* DOXYGEN_INTERNAL_DOC */

#if defined ZB_LITTLE_ENDIAN && defined ZB_BIG_ENDIAN
#error  Enable only 1 profile support: ZB_LITTLE_ENDIAN or ZB_BIG_ENDIAN
#endif /* defined ZB_LITTLE_ENDIAN && defined ZB_BIG_ENDIAN */

/** @cond DOXYGEN_INTERNAL_DOC */

/* DA: network status with OUT_OF_MEMORY custom value */
#if !defined ZB_CHECK_OOM_STATUS && !defined xZB_CHECK_OOM_STATUS && !defined ZB_MACSPLIT_DEVICE && !defined ZB_LITE_NO_OOM_DETECTION && !defined ZB_MAC_ONLY_STACK
/** Enable check whether the ZBOSS stack is out of memory */
#define ZB_CHECK_OOM_STATUS
#endif
//#define ZB_SEND_OOM_STATUS

#ifdef ZB_CHECK_OOM_STATUS
/** If bufpool is in out of memory state for a period, specified by ZB_OOM_THRESHOLD,
 * then assertion is triggered. */
#define ZB_OOM_THRESHOLD (120U * ZB_TIME_ONE_SECOND)
#ifdef ZB_SEND_OOM_STATUS
#define ZB_SEND_OOM_DELAY (5U * ZB_TIME_ONE_SECOND)
#endif /* ZB_SEND_OOM_STATUS */
#endif /* ZB_CHECK_OOM_STATUS */
/** @endcond */ /* DOXYGEN_INTERNAL_DOC */

#if defined ZB_JOINING_LIST_SUPPORT
/** @cond DOXYGEN_JOINING_LIST_SECTION */
#define ZB_JOINING_LIST_Q_SIZE 5U
#define ZB_JOINING_LIST_RESP_ITEMS_LIMIT 9U
#define ZB_JOINING_LIST_DELAY_STEP ZB_TIME_ONE_SECOND
/* default value for mibIeeeExpiryInterval, in minutes */
#define ZB_JOINING_LIST_DEFAULT_EXPIRY_INTERVAL 5U
/** @endcond */ /* DOXYGEN_JOINING_LIST_SECTION */
#endif /* ZB_JOINING_LIST_SUPPORT */

/** @cond DOXYGEN_INTERNAL_DOC */
/** The necessity of radio interrupt disabling/enabling when MAC gets RX/TX interrupt statuses is platform-dependent.
 * This protection is not needed only if the platform guarantees that getting a 4-byte aligned variable is an atomic operation.
 * If platform allows do it without this protection, ZB_GET_RADIO_FLAG_UNPROTECTED macro should be defined for this feature in platform.
 * Otherwise, radio interrupts disabling/enabling for the case will be switched on.
 */
#ifndef ZB_GET_RADIO_FLAG_UNPROTECTED
#define ZB_GET_RADIO_FLAG_INT_DISABLE() ZB_RADIO_INT_DISABLE()
#define ZB_GET_RADIO_FLAG_INT_ENABLE() ZB_RADIO_INT_ENABLE()
#else
#define ZB_GET_RADIO_FLAG_INT_DISABLE()
#define ZB_GET_RADIO_FLAG_INT_ENABLE()
#endif
/** @endcond */ /* DOXYGEN_INTERNAL_DOC */

/***************************HA and ZLL FEATURES**********************/
/** @cond DOXYGEN_INTERNAL_DOC */
#if defined ZB_ENABLE_HA || defined ZB_ENABLE_ZLL

#ifndef ZB_ENABLE_ZCL
#define ZB_ENABLE_ZCL
#endif

#if defined  ZB_ZCL_SUPPORT_CLUSTER_DIAGNOSTICS

#ifndef ZB_MAC_DIAGNOSTICS
#define ZB_MAC_DIAGNOSTICS
#endif

#ifndef ZDO_DIAGNOSTICS
#define ZDO_DIAGNOSTICS
#endif

#endif /* ZB_ZCL_SUPPORT_CLUSTER_DIAGNOSTICS */

#endif /* defined ZB_ENABLE_HA || ZB_ENABLE_ZLL */
/** @endcond */ /* DOXYGEN_INTERNAL_DOC */

/* Enable only 1 profile support: ZLL or HA */
/** @cond DOXYGEN_TOUCHLINK_FEATURE */
#if defined ZB_ENABLE_ZLL || defined DOXYGEN
/** @brief Controls inter-PAN exchange feature */
#define ZB_ENABLE_INTER_PAN_EXCHANGE
/* only ZLL uses AES128 decoding */
#define ZB_NEED_AES128_DEC
#define ZB_ZLL_ENABLE_COMMISSIONING_CLIENT
#define ZB_ZLL_ENABLE_COMMISSIONING_SERVER
#ifdef ZB_ZLL_ENABLE_COMMISSIONING_CLIENT
/* Client device should be address assignment capable */
#define ZB_ZLL_ADDR_ASSIGN_CAPABLE
#endif
#define ZB_ZLL_PRIMARY_CHANNELS {11, 15, 20, 25}
#endif /* defined ZB_ENABLE_ZLL || defined DOXYGEN */
/** @endcond */ /* DOXYGEN_TOUCHLINK_FEATURE */

#ifdef ZB_BINARY_AND_TEXT_TRACE_MODE
#ifndef ZB_BINARY_TRACE
#define ZB_BINARY_TRACE
#endif
#endif  /* ZB_BINARY_AND_TEXT_TRACE_MODE*/

#ifdef ZB_MEMTRACE
#ifndef ZB_BINARY_TRACE
#define ZB_BINARY_TRACE
#endif
#endif  /* ZB_MEMTRACE */

#ifdef ZB_TRACE_TO_PORT
#ifndef ZB_BINARY_TRACE
#define ZB_BINARY_TRACE
#endif
#endif  /* ZB_TRACE_TO_PORT */

/* If trace baudrate isn't set, set it to 115200 by default */
#ifndef ZB_TRACE_SERIAL_BAUDRATE
#define ZB_TRACE_SERIAL_BAUDRATE 115200U
#endif /* ZB_TRACE_SERIAL_BAUDRATE */

/** @cond DOXYGEN_INTERNAL_DOC */
#ifdef ZB_PLATFORM_LINUX

/* NS runs in multi-threaded mode only if it has been compiled with `ZB_NCP_TRANSPORT_TYPE_NSNG`. */
#if (defined ZB_NSNG && defined ZB_NCP_TRANSPORT_TYPE_NSNG) || (!defined ZB_NSNG)
#define ZB_THREADS
#endif
#ifndef ZB_INIT_HAS_ARGS
#define ZB_INIT_HAS_ARGS
#endif
#ifndef ZB_HAVE_FILE
#define ZB_HAVE_FILE
#endif
#ifndef ZB_TRACE_TO_FILE
#define ZB_TRACE_TO_FILE
#endif
#ifndef ZB_TMP_FILE_PATH_PREFIX
#define ZB_TMP_FILE_PATH_PREFIX ""
#endif
#ifndef ZB_BINARY_FILE_PATH_PREFIX
#define ZB_BINARY_FILE_PATH_PREFIX ""
#endif
#ifndef ZB_USERDATA_FILE_PATH_PREFIX
#define ZB_USERDATA_FILE_PATH_PREFIX ""
#endif
#ifndef ZB_LOG_FILE_PATH_PREFIX
#define ZB_LOG_FILE_PATH_PREFIX ZB_TMP_FILE_PATH_PREFIX
#endif

#ifdef ZB_USE_LOGFILE_ROTATE
#ifndef LOG_ROTATE_1K
#define LOG_ROTATE_1K 1024
#endif
#ifndef ZB_DEFAULT_MAX_LOGFILE_SIZE
#define ZB_DEFAULT_MAX_LOGFILE_SIZE   (720 * LOG_ROTATE_1K)
#endif
#ifndef ZB_DEFAULT_TOTAL_LOGS_SIZE
#define ZB_DEFAULT_TOTAL_LOGS_SIZE    (2160 * LOG_ROTATE_1K)
#endif
#ifndef ZB_DEFAULT_MAX_LOGFILE_CNT
#define ZB_DEFAULT_MAX_LOGFILE_CNT  (ZB_DEFAULT_TOTAL_LOGS_SIZE / ZB_DEFAULT_MAX_LOGFILE_SIZE)
#endif
#endif  /* ZB_USE_LOGFILE_ROTATE */

/* #  define ZB_BINARY_TRACE */
/* #  define ZB_MEMTRACE */
/* #  define ZB_TRAFFIC_DUMP_ON */
#if (ZB_STACK_SPEC_VERSION < 23U)
#define ZB_TRAFFIC_DUMP_V3
#endif
#endif

#ifndef ZB_MEMTRACE_BUF_SIZE
#define ZB_MEMTRACE_BUF_SIZE 4080U
#endif


/**
   If defined, transport calls traffic dump by itself, generic MAC not need to do it
*/
//#define ZB_TRANSPORT_OWN_TRAFFIC_DUMP_ON

//#define ZB_DUMP_TRAF

/**
   Name for trace off switch file

   If file of this name exists in the current directory, switch off both trace
   and traffic dump.
*/
#define ZB_TRACE_SWITCH_OFF_FILE_NAME "trace_off"
/** @endcond */ /* DOXYGEN_INTERNAL_DOC */

/************************Hardware watchdog******************/


#ifndef ZB_WATCHDOG_SCHED_QUANT
/**
 *Check watchdogs once per 20 sec.
 *The hardware watchdog timer is set to 30 seconds,
 *it should be initiated even if there is no job for it
*/
#define ZB_WATCHDOG_SCHED_QUANT (20U * ZB_TIME_ONE_SECOND)
#endif


/** @cond DOXYGEN_INTERNAL_DOC */
/* membuffers debug: */
/* extra buffers trace and debug */
/* WARNING: Disabled by default. It costs too many ROM size! */
#if ZB_TRACE_LEVEL && ZB_TRACE_MASK
/* #define ZB_DEBUG_BUFFERS */
#endif

/* Assert when already freed memory buffer is accessed. Useful for debugging */
#ifdef ZB_DEBUG_BUFFERS
#define ZB_BUF_SHIELD
/* extended membuffers debug*/
#ifdef ZB_DEBUG_BUFFERS_EXT
#ifndef ZB_DEBUG_BUFFERS_EXT_USAGES_COUNT
#define ZB_DEBUG_BUFFERS_EXT_USAGES_COUNT 1U
#endif
#endif
#endif /*ZB_DEBUG_BUFFERS*/
/** @endcond */ /* DOXYGEN_INTERNAL_DOC */

/************************Special modes for testing*******************/

#if defined ZB_CERTIFICATION_HACKS

/**
 * This define turns on/off test profile
 */
#if !defined ZB_TEST_PROFILE
#define ZB_TEST_PROFILE
#endif

#if defined(ZB_DIAGNOSTIC_DUT_MODIFIERS_ENABLED) || defined(ZB_DIAGNOSTIC_TH_MODIFIERS_ENABLED)
#error Please, disable ZB_CERTIFICATION_HACKS from your vendor file!
#endif /* ZB_DIAGNOSTIC_DUT_MODIFIERS_ENABLED || ZB_DIAGNOSTIC_TH_MODIFIERS_ENABLED */

#define ZB_DIAGNOSTIC_DUT_MODIFIERS_ENABLED
#define ZB_DIAGNOSTIC_TH_MODIFIERS_ENABLED

#endif /* ZB_CERTIFICATION_HACKS */


/* Testing mode for some pro certification tests */
/** @cond DOXYGEN_INTERNAL_DOC */
#ifdef ZB_PRO_STACK

/* See: certification test TP_PRO_BV-11 */
#ifdef ZB_CERTIFICATION_HACKS
#if !defined ZB_LIMIT_VISIBILITY && !defined ZB_MEMORY_COMPACT
#define ZB_LIMIT_VISIBILITY
#endif /*!ZB_LIMIT_VISIBILITY && !ZB_MEMORY_COMPACT */
#endif /* ZB_CERTIFICATION_HACKS */

#ifdef ZB_LIMIT_VISIBILITY
/**
   Maximum number of addresses in the visibility limit arrays
*/
#define ZB_N_VISIBLE_ADDRESSES 6U
#endif

#if defined ZB_ROUTER_ROLE
/* See: certification test 13.66_Commissioning_the_short_address */
#define ZB_PRO_ADDRESS_ASSIGNMENT_CB
#endif /*defined ZB_COORDINATOR_ROLE || defined ZB_ROUTER_ROLE*/

/* Compatibility tests (with Ember Zigbee platform ISA3)*/

/* Ember + ZBOSS stack with ZLL Profile*/
#ifdef ZB_ENABLE_ZLL
#define ZLL_TEST_WITH_EMBER
#endif /*ZB_ENABLE_ZLL*/

/* Ember + ZBOSS Core Pro stack */
//#define ZB_EMBER_TESTS
#ifdef ZB_EMBER_TESTS
/* Used with compatibility tests (ember data secured by preconfigured global key, if pair key in
   ember side absent -> use preconfigured key) */
/* hash2 */
//#define ZB_EMBER_SEC_DATA_PRECONF_HASH2
/* hash1*/
//#define ZB_EMBER_SEC_DATA_PRECONF_HASH0
/* non-hashed; see: EMBER_TRUST_CENTER_USES_ HASHED_LINK_KEY */
#define ZB_EMBER_SEC_DATA_PRECONF_NONHASH

/* Use hashed data link key(pair key) for compatibility tests with Ember, by default used
   non-hashed plain key, it is Only for testing purpose */

#if 0
/* Currently isn't used, by default non-hashed key */
#define ZB_EMBER_SEC_DATA_LINK_HASH0
#define ZB_EMBER_SEC_DATA_LINK_HASH2
#define ZB_EMBER_SEC_DATA_LINK_NONHASH
#endif

/* Used with compatibility tests (ember data secured by preconfigured global key) */
#define ZB_EMBER_SEC_TRANSPORT_KEY_UNIQ_APS

/* Accept APS unencrypted Transport Key from Ember */
#define ZB_EMBER_SEC_ACCEPT_APS_UNSECURED_TRANSPORT_KEY

/* Disable waiting ack for key request */
//#define ZB_EMBER_DISABLE_APS_ACK_REQ_FOR_REQUEST_KEY_CMD

/* Disable waiting ack for transport key */
//#define ZB_EMBER_DISABLE_APS_ACK_REQ_FOR_TRANSPORT_KEY_CMD

/* Disable waiting ack for tunnel command */
//#define ZB_EMBER_DISABLE_APS_ACK_REQ_FOR_TUNNEL_CMD

/* Check frame counters from Aux security header */
#define ZB_CHECK_INCOMING_SECURE_APS_FRAME_COUNTERS

#endif  /* ZB_EMBER_TESTS */

/* Send messages with empty payload without APS-security */
#define ZB_SEND_EMPTY_DATA_WITHOUT_APS_ENCRYPTION

#endif /* ZB_PRO_STACK */

//* Definitions for 802.15.4 certification hacks */

//#define MAC_CERT_TEST_HACKS

//*
//   This define turns on/off channel error mode (set errors while data sending)
//*/
//#define ZB_CHANNEL_ERROR_TEST

//#define TP_PRO_BV_31

//#define TP_PRO_BV_38

/* Put radio into RX mode before transmitting. */
#ifndef ZB_TRANSCEIVER_ON_BEFORE_TX
#define ZB_TRANSCEIVER_ON_BEFORE_TX  1
#endif /* ZB_TRANSCEIVER_ON_BEFORE_TX */

/* Put radio into RX mode before starting Energy Detection. */
#ifndef ZB_TRANSCEIVER_ON_BEFORE_ED
#define ZB_TRANSCEIVER_ON_BEFORE_ED  1
#endif /* ZB_TRANSCEIVER_ON_BEFORE_ED */
/** @endcond */ /* DOXYGEN_INTERNAL_DOC */

/* Certification defines */

#if 0
/**
   Disabling of processing of bind_req and end_device_bind_req for certification purposes
*/
#define ZB_DISABLE_BIND_REQ
#endif


#if 0
/**
   Disabling of processing of end device bind requests
*/
#define ZB_DISABLE_ED_BIND_REQ
#endif

/*PRO STACK COMPATIBILITY, it is better to turn it on only when needed */
/* #AT disable compatible mode with 2007 stack version */
#if 0
#define ZB_PRO_COMPATIBLE
#endif

/**
   Default value for mac frame version subfield
*/
#define MAC_FRAME_VERSION MAC_FRAME_IEEE_802_15_4_2003
/** @cond DOXYGEN_INTERNAL_DOC */
/**
   Block sleepy end devices (devices with rx-on-when-idle == false) from receiving broadcasts (drop it at MAC level)
*/
#define ZB_BLOCK_BROADCASTS_SLEEPY_ED
/** @endcond */ /* DOXYGEN_INTERNAL_DOC */
/* MAC */
/* TODO: add MAC properties here */

#if defined ZB_JOINING_LIST_SUPPORT
/** @cond DOXYGEN_JOINING_LIST_SECTION */
#ifndef MAC_JOINING_LIST_SIZE_LIMIT
#define MAC_JOINING_LIST_SIZE_LIMIT 16U
#endif
/** @endcond */ /* DOXYGEN_JOINING_LIST_SECTION */
#endif /* ZB_JOINING_LIST_SUPPORT */

/***** GREEN POWER *****/

#ifdef ZB_ZGPD_ROLE
#define ZB_MAC_ONLY_STACK
#undef ZB_CHECK_OOM_STATUS
#undef APS_FRAME_SECURITY
#undef ZB_ENABLE_ZCL
#undef ZB_ENABLE_ZLL
#undef ZB_ENABLE_HA
#undef ZB_USE_NVRAM
/* Temporarily disabled for ZGPD MAC library build. */
/* #undef ZB_DIRECT_MODE_WITH_ZGPD */
#define ZB_ENABLE_ZGPD_ATTR_REPORTING
/*
 * The OperationalChannel sub-field can take the following values: 0b0000: channel 11,
 * 0b0001: channel 12, , 0b1111: channel 26.
 * 26-11+1 = 12. Let's use 3 series of 4 channels each.
 * @note that channelsdiapason must be multiple of series.
 */
#define ZB_ZGPD_CH_SERIES       3U

#define ZB_GPD_COMMISSIONING_RETRY_INTERVAL ZB_MILLISECONDS_TO_BEACON_INTERVAL(500)
#endif /* ZB_ZGPD_ROLE */

/** The maximum number of reports that GPD can send in the Application Description. */
#ifndef ZB_ZGP_APP_DESCR_REPORTS_NUM
#define ZB_ZGP_APP_DESCR_REPORTS_NUM 3U
#endif /* ZB_ZGP_APP_DESCR_REPORTS_NUM */

/** The maximum report descriptor length that GPD can send in the Application Description. */
#ifndef ZB_ZGP_APP_DESCR_REPORT_DATA_SIZE
#define ZB_ZGP_APP_DESCR_REPORT_DATA_SIZE 32U
#endif /* ZB_ZGP_APP_DESCR_REPORT_DATA_SIZE */

#ifdef ZB_ENABLE_ZGP_DIRECT

#ifndef ZB_ALIEN_MAC
/* Now all our MAC implementations have an ability to send GPD frame at predefined time, so no need for a delay in GP stub in zb_zgp_try_bidir_tx().
   Some alien MAC can have that feature too, so define MAC_AUTO_DELAY_IN_MAC_GP_SEND for them in a vendor file.
 */
#define MAC_AUTO_DELAY_IN_MAC_GP_SEND
#endif

/* Old GP GPD sensors (until May, 2014) use
 * 5 ms offset. New sensors use 20 ms offset.*/
//#define ZB_GPD_RX_OFFSET_MS 5
#define ZB_GPD_RX_OFFSET_MS 20U

/* Old platforms require gpTxOffset calibration. It put into zb_config_platform.h. At new DSR platforms DSR MAC has a call "tx at specified time" so GP TX delay calibrating is not required.  */
#ifndef ZB_GPD_TX_OFFSET_US
#define ZB_GPD_TX_OFFSET_US                                   \
  (ZB_MILLISECONDS_TO_USEC(ZB_GPD_RX_OFFSET_MS))
#endif

/**
   gpdMinRxWindow
   The gpdMinRxWindow is minimal duration of the reception window of an Rx-capable GPD.
   It has the value of 0.576 ms that corresponds to the Channel Configuration GPDF of 18B.
   GPD vendors shall implement reception window duration that corresponds to the actual GPD frame
   size to be received by this GPD, which may never be shorter than
   gpdMinRxWindow.

   A.1.6.3.2 gpdMinRxWindow
*/
#define ZB_GPD_MIN_RX_WINDOW_MS 50U
#endif  /* ZB_ENABLE_ZGP_DIRECT */
/** @} */ /* ZB_CONFIG */
/************************NVRAM SUPPORT*******************/

#if defined ZB_USE_NVRAM

/**
   Interval in which counter is stored
*/
#ifndef ZB_LAZY_COUNTER_INTERVAL
#define ZB_LAZY_COUNTER_INTERVAL 1023U
#endif
#endif /*ZB_USE_NVRAM*/

/**
   Migration datasets when page overflow in NVRAM
*/
#define ZB_NVRAM_DATASET_MIGRATION

/** Save address map in the NVRAM */
#define ZB_STORE_ADDR_MAP

/** Save neighbor table in the NVRAM */
#define ZB_STORE_NEIGHBOR_TBL


/* Check for old GP definitions and produce a error */
#if defined ENABLE_ZGP_TARGET_PLUS || defined ZB_ENABLE_ZGP_EP || defined ZB_DIRECT_MODE_WITH_ZGPD
#error Old ZGP define detected!
#endif


/* ZBOSS Lite defines */

/*
  If defined maximum possible features cut
 */

#ifdef ZB_ZBOSS_LITE_MAX
#ifndef ZB_LITE_NO_SOURCE_ROUTING
/**
   Disable source routing
 */
#define ZB_LITE_NO_SOURCE_ROUTING
#endif

#ifndef ZB_LITE_NO_NLME_ROUTE_DISCOVERY
/**
   Disable route discovery API (but keep implicit route discovery)
 */
#define ZB_LITE_NO_NLME_ROUTE_DISCOVERY
#endif

#ifndef ZB_NO_NWK_MULTICAST
/**
   Disable NWK multicast. Use APS groups and NWK broadcast instead.
 */
#define ZB_NO_NWK_MULTICAST
#endif

#ifndef ZB_LITE_NO_PANID_CONFLICT_DETECTION
/**
   Disable Pan ID conflict detection
 */
#define ZB_LITE_NO_PANID_CONFLICT_DETECTION
#endif

#ifndef ZB_LITE_NO_PANID_CONFLICT_RECEIVING
/**
   Disable Pan ID conflict command receiving
 */
#define ZB_LITE_NO_PANID_CONFLICT_RECEIVING
#endif


#ifdef ZB_LITE_NO_LINK_COST
/**
   Disable nwk link cost based on lqi

   See 3.6.3.1 Routing Cost
 */
///not sure this is good idea #define ZB_LITE_NO_LINK_COST
#endif

#ifndef ZB_LITE_NO_ORPHAN_SCAN
//#define ZB_LITE_NO_ORPHAN_SCAN
#endif


#ifndef ZB_LITE_NO_APS_DATA_ENCRYPTION
/**
   Do not encrypt data at APS level
 */
#define ZB_LITE_NO_APS_DATA_ENCRYPTION
#endif

#ifndef ZB_LITE_NO_STORE_APS_COUNTERS
/**
  Do not store APS security frame counters in nvram
 */
#define ZB_LITE_NO_STORE_APS_COUNTERS
#endif

#ifndef SNCP_MODE
/**
   Do not check for APS security counters inconsistency at unsecure
 */
#ifndef ZB_NO_CHECK_INCOMING_SECURE_APS_FRAME_COUNTERS
#define ZB_NO_CHECK_INCOMING_SECURE_APS_FRAME_COUNTERS
#endif
#endif

#ifdef ZB_DISTRIBUTED_SECURITY_ON
#undef ZB_DISTRIBUTED_SECURITY_ON
#endif

#ifdef ZB_SECURITY_INSTALLCODES
#undef ZB_SECURITY_INSTALLCODES
#endif

#ifdef ZB_CERTIFICATION_HACKS
#undef ZB_CERTIFICATION_HACKS
#endif


#ifndef ZB_LITE_NO_UNICAST_SWITCH_KEY
/**
   Do not send switch key unicast
 */
#define ZB_LITE_NO_UNICAST_SWITCH_KEY
#endif

#ifndef ZB_LITE_NO_TRUST_CENTER_REQUIRE_KEY_EXCHANGE
/**
   Never require unique keys exchange on join
 */
#define ZB_LITE_NO_TRUST_CENTER_REQUIRE_KEY_EXCHANGE
#endif

#ifndef ZB_LITE_NO_ZDO_SYSTEM_SERVER_DISCOVERY
/**
   Exclude ZDO System Server Discovery
 */
#define ZB_LITE_NO_ZDO_SYSTEM_SERVER_DISCOVERY
#endif

#ifndef ZB_LITE_NO_ZDO_MGMT_RTG
#define ZB_LITE_NO_ZDO_MGMT_RTG
#endif

#ifndef ZB_LITE_NO_FULL_FUNCLIONAL_MGMT_NWK_UPDATE
#define ZB_LITE_NO_FULL_FUNCLIONAL_MGMT_NWK_UPDATE
#endif

/**
   Do not try to inject LEAVE on data request from ZED which we already timed out.

   That define removes some r21 feature which requires from us to always set
   pending bit in any our real devices (just because we are a) not so fast to check
   _absence_ of device in the neighbor table and replay with MAC ACK and b) want
   to use auto-ack feature of radio which support it - like TI devices).
 */
#ifndef ZB_LITE_NO_LEAVE_INJECTION
#define ZB_LITE_NO_LEAVE_INJECTION
#endif
#ifdef ZB_LITE_NO_LEAVE_INJECTION
#ifdef ZB_MAC_STICKY_PENDING_BIT
#undef ZB_MAC_STICKY_PENDING_BIT
#endif
#endif

#ifndef ZB_LITE_NO_CONFIGURABLE_LINK_STATUS
#define ZB_LITE_NO_CONFIGURABLE_LINK_STATUS
#endif

#ifdef ZB_COORDINATOR_ONLY
#ifdef ZB_DISTRIBUTED_SECURITY_ON
#undef ZB_DISTRIBUTED_SECURITY_ON
#endif
#endif

#ifndef ZB_LITE_NO_INDIRECT_MGMT_LEAVE
/**
   Disable mgmt leave with requires sending leave to third device.
 */
#define ZB_LITE_NO_INDIRECT_MGMT_LEAVE
/* Need to store only one entry - about leave myself */
#ifdef ZB_ZDO_PENDING_LEAVE_SIZE
#undef ZB_ZDO_PENDING_LEAVE_SIZE
#define ZB_ZDO_PENDING_LEAVE_SIZE 1U
#endif
#endif

#ifndef ZB_LITE_APS_DONT_TX_PACKET_TO_MYSELF
/**
   Don't pass from APS up packet which is sent to myself - either directly or
   via group.
 */
#define ZB_LITE_APS_DONT_TX_PACKET_TO_MYSELF
#endif


#ifndef ZB_LITE_BDB_ONLY_COMMISSIONING
/**
   Allow only BDB commissioning and disallow old ZBOSS start sequence
 */
#define ZB_LITE_BDB_ONLY_COMMISSIONING
#endif
#if defined ZB_LITE_BDB_ONLY_COMMISSIONING && !defined ZB_BDB_MODE
#define ZB_BDB_MODE
#endif


#ifndef ZB_LITE_LIMIT_PIB_ACCESS
/**
   Limit access to PIB to values really used by the stack
 */
#define ZB_LITE_LIMIT_PIB_ACCESS
#endif

#ifndef ZB_LITE_ALWAYS_SECURE
/**
   No ability to switch off security
 */
#define ZB_LITE_ALWAYS_SECURE
#endif

#ifndef ZB_LITE_DONT_STORE_RSSI
/**
   Do not store rssi in the neighbor
 */
//#define ZB_LITE_DONT_STORE_RSSI
//#define ZB_LITE_DONT_STORE_RSSI
#endif

/**
   Disable end device bind
 */
#ifndef ZB_LITE_NO_END_DEVICE_BIND
#define ZB_LITE_NO_END_DEVICE_BIND
#endif

#ifdef ZB_TEST_PROFILE
#undef ZB_TEST_PROFILE
#endif

#endif  /* ZB_ZBOSS_LITE_MAX */

#ifdef ZB_LITE_FOR_GW
#define ZB_COORDINATOR_ONLY
#define ZB_LITE_BDB_ONLY_COMMISSIONING
#define ZB_LITE_ALWAYS_SECURE
#define ZB_LITE_NO_TRUST_CENTER_REQUIRE_KEY_EXCHANGE
//#define ZB_LITE_NO_SOURCE_ROUTING
#define ZB_LITE_NO_NLME_ROUTE_DISCOVERY
//#define ZB_NO_NWK_MULTICAST
#define ZB_LITE_NO_ORPHAN_SCAN
#define ZB_LITE_NO_STORE_APS_COUNTERS
//#define ZB_LITE_NO_FULL_FUNCLIONAL_MGMT_NWK_UPDATE
#define ZB_LITE_NO_ZDO_SYSTEM_SERVER_DISCOVERY
#define ZB_LITE_NO_ZDO_MGMT_RTG
#define ZB_LITE_APS_DONT_TX_PACKET_TO_MYSELF

#ifdef ZB_SECURITY_INSTALLCODES
#undef ZB_SECURITY_INSTALLCODES
#endif

#ifdef ZB_CERTIFICATION_HACKS
#undef ZB_CERTIFICATION_HACKS
#endif

#ifdef ZB_TEST_PROFILE
#undef ZB_TEST_PROFILE
#endif

#ifndef ZB_LITE_NO_INDIRECT_MGMT_LEAVE
/**
   Disable mgmt leave with requires sending leave to third device.
 */
#define ZB_LITE_NO_INDIRECT_MGMT_LEAVE
/* Need to store only one entry - about leave myself */
#ifdef ZB_ZDO_PENDING_LEAVE_SIZE
#undef ZB_ZDO_PENDING_LEAVE_SIZE
#define ZB_ZDO_PENDING_LEAVE_SIZE 1U
#endif
#endif

#ifndef ZB_LITE_LIMIT_PIB_ACCESS
/**
   Limit access to PIB to values really used by the stack
 */
#define ZB_LITE_LIMIT_PIB_ACCESS
#endif


#ifndef ZB_LITE_NO_END_DEVICE_BIND
/**
   Disable end device bind
 */
#define ZB_LITE_NO_END_DEVICE_BIND
#endif

#endif  /* ZB_LITE_FOR_GW */

#ifdef ZB_COORDINATOR_ONLY
#undef ZB_DISTRIBUTED_SECURITY_ON
#endif

#if defined ZB_TRAFFIC_DUMP_OFF && defined ZB_TRAFFIC_DUMP_ON
#undef ZB_TRAFFIC_DUMP_ON
#endif


#ifndef ZB_NO_NWK_MULTICAST
/**
   Disable NWK multicast. Deprecated in R21.
   Use APS groups and NWK broadcast instead.
 */
#define ZB_NO_NWK_MULTICAST
#endif


#ifdef ZB_CONFIGURABLE_MEM

/*
  Huge feature if configuring RAM usage without ZBOSS library recompiling.
  Instead of normal static declarations use pointers.
  At init time set pointers to be used instead of static arrays used normally.
  Keep possibility to compile in a normal way; also keep code mergeable.
  Undefine here array size constants and define it to be variables. See zb_g_context.h for details.
*/
#ifdef ZB_IOBUF_POOL_SIZE
#undef ZB_IOBUF_POOL_SIZE
#endif
#ifdef ZB_SCHEDULER_Q_SIZE
#undef ZB_SCHEDULER_Q_SIZE
#endif
#ifdef ZB_N_APS_KEY_PAIR_ARR_MAX_SIZE
#undef ZB_N_APS_KEY_PAIR_ARR_MAX_SIZE
#endif
#ifdef ZB_IEEE_ADDR_TABLE_SIZE
#undef ZB_IEEE_ADDR_TABLE_SIZE
#endif
#ifdef ZB_NEIGHBOR_TABLE_SIZE
#undef ZB_NEIGHBOR_TABLE_SIZE
#endif
#ifdef ZB_NWK_ROUTING_TABLE_SIZE
#undef ZB_NWK_ROUTING_TABLE_SIZE
#endif
#ifdef ZB_APS_DUPS_TABLE_SIZE
#undef ZB_APS_DUPS_TABLE_SIZE
#endif
#ifdef ZB_APS_SRC_BINDING_TABLE_SIZE
#undef ZB_APS_SRC_BINDING_TABLE_SIZE
#endif
#ifdef ZB_APS_DST_BINDING_TABLE_SIZE
#undef ZB_APS_DST_BINDING_TABLE_SIZE
#endif
#ifdef ZB_APS_BIND_TRANS_TABLE_SIZE
#undef ZB_APS_BIND_TRANS_TABLE_SIZE
#endif
#ifdef ZB_SINGLE_TRANS_INDEX_SIZE
#undef ZB_SINGLE_TRANS_INDEX_SIZE
#endif
/* 10/21/2019 EE CR:MINOR There was #undef ZB_SCHEDULER_Q_SIZE_PROTECTED_STACK_POOL. Was its removal intended? */
#ifdef ZB_NWK_MAX_SRC_ROUTES
#undef ZB_NWK_MAX_SRC_ROUTES
#endif
#ifdef ZB_ZDO_KEY_NEGOTIATIONS_NUM
#undef ZB_ZDO_KEY_NEGOTIATIONS_NUM
#endif

#else
/**
   The purpose of the define. Ret code handling implementation on the application side
   (via ZB_SCHEDULE_USER_APP_ALARM and ZB_SCHEDULE_USER_APP_CALLBACK) implies that we have some part
   of the callback and alarm queues which can not be used from the user app and always should be reserved
   for stack schedule purposes. So, let's define this part as 10 (for both immediate callbacks and alarms)
   for all configurations.
 */

#define ZB_SCHEDULER_Q_SIZE_PROTECTED_STACK_POOL 10U
#if (ZB_SCHEDULER_Q_SIZE - ZB_SCHEDULER_Q_SIZE_PROTECTED_STACK_POOL) < 6U
#error The size of application scheduler queue is very small! Please, change ZB_SCHEDULER_Q_SIZE_PROTECTED_STACK_POOL, ZB_SCHEDULER_Q_SIZE to set it at least 6
#endif
#endif  /* ZB_CONFIGURABLE_MEMORY */

/* pending bit source matching intended for ZB_ROUTER_ROLE only */
#ifndef ZB_ROUTER_ROLE
#ifdef ZB_MAC_PENDING_BIT_SOURCE_MATCHING
#undef ZB_MAC_PENDING_BIT_SOURCE_MATCHING
#endif
#ifdef ZB_MAC_SOFTWARE_PB_MATCHING
#undef ZB_MAC_SOFTWARE_PB_MATCHING
#endif
#ifdef ZB_MAC_HARDWARE_PB_MATCHING
#undef ZB_MAC_HARDWARE_PB_MATCHING
#endif
#ifdef ZB_MAC_SWITCHABLE_PB_MATCHING
#undef ZB_MAC_SWITCHABLE_PB_MATCHING
#endif
#endif

#ifdef ZB_COORDINATOR_ONLY
/* ZLL/Touchlink can be only ZR and ZED */
#ifdef ZB_BDB_TOUCHLINK
#undef ZB_BDB_TOUCHLINK
#endif
#ifdef ZB_ENABLE_ZLL
#undef ZB_ENABLE_ZLL
#endif
#ifdef ZB_ENABLE_INTER_PAN_EXCHANGE
#undef ZB_ENABLE_INTER_PAN_EXCHANGE
#endif
#ifdef ZB_REJOIN_BACKOFF
#undef ZB_REJOIN_BACKOFF
#endif
#ifdef ZB_DISTRIBUTED_SECURITY_ON
#undef ZB_DISTRIBUTED_SECURITY_ON
#endif
#endif

#ifdef ZB_ED_ROLE
#ifndef ZB_MACSPLIT_HOST
#define ZB_USE_SLEEP
#endif
#endif

#ifdef ZB_ENABLE_INTER_PAN_NON_DEFAULT_CHANNEL
/* Lock queues size to temporarily store packets when inter-pan procedure is in progress */
#define NWK_INTRP_LOCK_QUEUE_SIZE 5U
#define APS_LOCK_QUEUE_SIZE 5U
#endif

/*! \addtogroup ZB_CONFIG */
/*! @{ */
/** Maximum buffer index. Buffer indexing starts from one. */
#define ZB_N_BUF_IDS (ZB_IOBUF_POOL_SIZE + 1U)

#ifdef ZB_PRODUCTION_CONFIG
#define ZB_PRODUCTION_CONFIG_MAX_SIZE 128

/**
 * @name Production configuration version
 * @anchor production_config_version
 *
 * Note: These values were members of `enum zb_production_config_version_e` type but were converted
 * to a set of macros due to MISRA violations.
 *
 * Versions description:
 * v1:
 *    stack compatibility: R21
 *    supported channels: only 2.4Ghz 11-26
 *    features: R21 compatible, its own crc `zb_crc32_next_v2`, supports tx_power settings for 2.4GHz
 * v2:
 *    stack compatibility: R22
 *    supported channels:
 *      1. 2.4 GHz 11-26
 *      2. Subghz page 28 channels 0-26
 *      2. Subghz page 29 channels 27-34, 62
 *      2. Subghz page 30 channels 35-61
 *      2. Subghz page 31 channels 0-26
 *    features: not compatible with R21, normal crc, less memory consumed,
 *              most devices in fields support it, supports tx_power settings for 2.4GHz and 4 subghz pages
 *
 * v3:
 *    stack compatibility: R22
 *    supported channels:
 *      1. 2.4 GHz 11-26
 *      2. Subghz page 23 channels 0-24
 *      2. Subghz page 24 channels 56-76
 *      2. Subghz page 25 channels 0-26
 *      2. Subghz page 26 channels 27-34
 *      2. Subghz page 27 channels 35-55
 *      2. Subghz page 28 channels 0-26
 *      2. Subghz page 29 channels 27-34, 62
 *      2. Subghz page 30 channels 35-61
 *      2. Subghz page 31 channels 0-26
 *    features: not compatible with R21, normal crc, supports tx_power for 2.4 GHz and 9 subghz pages.
 *
 * v4 (based on v3):
 *    stack compatibility: R23
 *    features: passcode.
 */
/** @{ */
#define ZB_PRODUCTION_CONFIG_VERSION_1_0 0x01U
#define ZB_PRODUCTION_CONFIG_VERSION_2_0 0x02U
#define ZB_PRODUCTION_CONFIG_VERSION_3_0 0x03U
#define ZB_PRODUCTION_CONFIG_VERSION_4_0 0x04U
/** @} */

#define ZB_PRODUCTION_CONFIG_CURRENT_VERSION   ZB_PRODUCTION_CONFIG_VERSION_2_0
#endif /*ZB_PRODUCTION_CONFIG*/
/*! @} */

/* Note: MAC-Split SoC doesn't sleep on hardware, but can sleep on Linux platform */
#if defined USE_ZB_WATCHDOG || (defined(ZB_MACSPLIT_DEVICE) && !defined(ZB_PLATFORM_LINUX))
#define ZB_NEVER_STOP_TIMER
#endif

#ifdef ZB_DISABLE_BIN_TRACE_DUMP_EXPOSE_KEYS

#ifndef ZB_USE_ERROR_INDICATION
#define ZB_USE_ERROR_INDICATION
#endif /* !ZB_USE_ERROR_INDICATION */

#ifdef ZB_BINARY_TRACE
#warning undefining ZB_BINARY_TRACE for release build
#undef ZB_BINARY_TRACE
#endif

#ifdef ZB_TRAFFIC_DUMP_ON
#warning undefining ZB_TRAFFIC_DUMP_ON for release build
#undef ZB_TRAFFIC_DUMP_ON
#define ZB_TRAFFIC_DUMP_OFF
#endif

#endif /* ZB_DISABLE_BIN_TRACE_DUMP_EXPOSE_KEYS */

#if defined NCP_MODE_HOST && !defined SNCP_MODE
#define HAVE_TOP_LEVEL_ERROR_HANDLER
#endif /* NCP_MODE_HOST && !SNCP_MODE */

#ifndef ZB_APS_USER_PAYLOAD
#define ZB_APS_USER_PAYLOAD
#endif

/* Values required for calculating LQA (see "Link Quality Assessment", r23 spec) */
#ifndef ZB_LQI_MIN
#define ZB_LQI_MIN 0
#endif

#ifndef ZB_LQI_MAX
#define ZB_LQI_MAX 255
#endif

#ifndef ZB_RSSI_MIN
#define ZB_RSSI_MIN -120
#endif

#ifndef ZB_RSSI_MAX
#define ZB_RSSI_MAX 20
#endif

#ifndef ZB_DEPRECATED_API
/* Note: we don't use deprecated API in SNCP */
#ifndef SNCP_MODE
#define ZB_DEPRECATED_API
#endif
#endif

#ifndef ZB_SIGNAL_HANDLERS_MAX
#define ZB_SIGNAL_HANDLERS_MAX 5U
#endif

#ifdef ZB_DIRECT_ENABLED
#define ZB_ECDHE_P256_ENABLED
#endif


#ifndef ZB_NWK_ADDR_REQ_PENDING_LIMIT
#define ZB_NWK_ADDR_REQ_PENDING_LIMIT 3U
#endif

/* By default keep counting children: it covered by ZOI CI, don't want to update it.. */
#if !defined ZB_NO_COUNT_CHILDREN && !defined ZB_COUNT_CHILDREN
#define ZB_COUNT_CHILDREN
#endif

#if defined ZB_ENABLE_SE && defined ZB_BDB_MODE
/* No need to define mixed mode in a vendor file - do it here */
#define ZB_SE_BDB_MIXED
#endif

#if !defined(ZB_DIAG_CORE_WATCHDOG_TMO_MS)
#define ZB_DIAG_CORE_WATCHDOG_TMO_MS 1000U
#endif /* !ZB_DIAG_CORE_WATCHDOG_TMO_MS */

#endif /* ZB_CONFIG_H */
