/*
 * Copyright (c) 2012-2022 DSR Corporation, Denver CO, USA
 * Copyright (c) 2021-2022 Espressif Systems (Shanghai) PTE LTD
 * All rights reserved.
 *
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form, except as embedded into a Espressif Systems
 *    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.
 *
 * 3. Neither the name of the copyright holder nor the names of its contributors
 *    may be used to endorse or promote products derived from this software without
 *    specific prior written permission.
 *
 * 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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: WWAH cluster definitions
*/

#ifndef ZB_ZCL_WWAH_H
#define ZB_ZCL_WWAH_H 1

#include "zcl/zb_zcl_common.h"
#include "zcl/zb_zcl_commands.h"

/** @cond DOXYGEN_ZCL_SECTION */

/* Cluster ZB_ZCL_CLUSTER_ID_WWAH */

/** @addtogroup ZB_ZCL_WWAH
 *  @{
 *     @details
 *     This cluster provides an opportunity to use various features
 *     of the Work With All Hubs cluster.
 *
 *     The WWAH cluster shall exist on only 1 endpoint of the Zigbee node,
 *     it should be identified using cluster ID 0xfc57 and manufacturer ID 0x1217.
 *
 *     All configurations/command settings in this cluster shall be persisted across power cycles
 *     and rejoins. Only a device factory reset can reset this cluster and put it back to default
 *     settings.
 *
 *     For more information see Zigbee WWAH Cluster definition (document number in Zigbee Alliance
 *     17-01067-022).
 *
 */


/*! @defgroup ZB_ZCL_WWAH_ATTR WWAH cluster attributes
    @{
*/

/* Amazon Lab 126 manufacturer code */
#define WWAH_MANUFACTURER_CODE 0x1217

/*! @brief WWAH cluster attribute identifiers
    @see WWAH spec, subclause 6.3.2.2
*/
enum zb_zcl_wwah_attr_e
{
  /** If set to TRUE, the device SHALL disallow downgrades of it's firmware. */
  ZB_ZCL_ATTR_WWAH_DISABLE_OTA_DOWNGRADES_ID                   = 0x0002,
  /** If set to FALSE, the node SHALL ignore MGMT Leave Without Rejoin commands. */
  ZB_ZCL_ATTR_WWAH_MGMT_LEAVE_WITHOUT_REJOIN_ENABLED_ID        = 0x0003,
  /** This attribute is a fixed value containing the number of Network Level Retries
   *  the device performs when sending a unicast command, not including APS retries. */
  ZB_ZCL_ATTR_WWAH_NWK_RETRY_COUNT_ID                          = 0x0004,
  /** This attribute is a fixed value containing the number of MAC Level Retries the
   *  device performs when sending a unicast command, not including APS retries. */
  ZB_ZCL_ATTR_WWAH_MAC_RETRY_COUNT_ID                          = 0x0005,
  /** This attribute is set to TRUE if the router's check-in algorithm has been enabled
   *  through the 'Enable Periodic Router Check-Ins' command detailed below. */
  ZB_ZCL_ATTR_WWAH_ROUTER_CHECK_IN_ENABLED_ID                  = 0x0006,
  /** This attribute is set to FALSE if support for Touchlink Interpan messages has been
   *  disabled on the device. */
  ZB_ZCL_ATTR_WWAH_TOUCHLINK_INTERPAN_ENABLED_ID               = 0x0007,
  /** If set to TRUE, the device SHALL enable the WWAH Parent Classification
   *  Advertisements feature. */
  ZB_ZCL_ATTR_WWAH_WWAH_PARENT_CLASSIFICATION_ENABLED_ID       = 0x0008,
  /** This attribute is TRUE if the WWAH Application Event Retry Algorithm is enabled. */
  ZB_ZCL_ATTR_WWAH_WWAH_APP_EVENT_RETRY_ENABLED_ID             = 0x0009,
  /** This attribute is the queue size for re-delivery attempts in the WWAH Application
   *  Event Retry Algorithm. */
  ZB_ZCL_ATTR_WWAH_WWAH_APP_EVENT_RETRY_QUEUE_SIZE_ID          = 0x000A,
  /** This attribute is set to TRUE if the WWAH Rejoin Algorithm is enabled. */
  ZB_ZCL_ATTR_WWAH_WWAH_REJOIN_ENABLED_ID                      = 0x000B,
  /** This attribute is the time in seconds the device waits before retrying a data poll
   *  when a MAC level data poll fails for any reason. */
  ZB_ZCL_ATTR_WWAH_MAC_POLL_FAILURE_WAIT_TIME_ID               = 0x000C,
  /** This attribute indicates whether the device is able to be configured using ZDO
   *  commands that are not encrypted using the Trust Center Link Key. */
  ZB_ZCL_ATTR_WWAH_CONFIGURATION_MODE_ENABLED_ID               = 0x000D,
  /** This attribute contains the ID of the current debug report stored on the node. */
  ZB_ZCL_ATTR_WWAH_CURRENT_DEBUG_REPORT_ID_ID                  = 0x000E,
  /** If this attribute is set to TRUE, the node SHALL only process network
   *  key rotation commands which are sent via unicast and are encrypted by
   *  the Trust Center Link Key. */
  ZB_ZCL_ATTR_WWAH_TC_SECURITY_ON_NWK_KEY_ROTATION_ENABLED_ID  = 0x000F,
  /** If this attribute is set to TRUE, the endpoint device SHALL enable
   *  the WWAH Bad Parent Recovery feature. */
  ZB_ZCL_ATTR_WWAH_WWAH_BAD_PARENT_RECOVERY_ENABLED_ID         = 0x0010,
  /** This attribute contains the channel number of the only channel the device
   *  SHALL accept in a ZDO Mgmt Network Update command. */
  ZB_ZCL_ATTR_WWAH_PENDING_NETWORK_UPDATE_CHANNEL_ID           = 0x0011,
  /** This attribute contains the only short PAN ID the device SHALL accept in
   *  a NLME Network Update command. */
  ZB_ZCL_ATTR_WWAH_PENDING_NETWORK_UPDATE_PANID_ID             = 0x0012,
  /** This attribute contains the maximum time in seconds the device may be unavailable
   *  after completing its OTA download (while restarting, etc). */
  ZB_ZCL_ATTR_WWAH_OTA_MAX_OFFLINE_DURATION_ID                 = 0x0013,
};

/** @brief Minimum value for Cluster Revision attribute */
#define ZB_ZCL_WWAH_CLUSTER_REVISION_MIN_VALUE 0x0001

/** @brief Default value for WWAH cluster revision global attribute */
#define ZB_ZCL_WWAH_CLUSTER_REVISION_DEFAULT ZB_ZCL_WWAH_CLUSTER_REVISION_MIN_VALUE

/** @brief Default value for MGMTLeaveWithoutRejoinEnabled attribute */
#define ZB_ZCL_WWAH_MGMT_LEAVE_WITHOUT_REJOIN_ENABLED_DEFAULT_VALUE ZB_TRUE

/** @brief Minimum value for NWKRetryCount attribute */
#define ZB_ZCL_WWAH_NWK_RETRY_COUNT_MIN_VALUE 0x03

/** @brief Maximum value for NWKRetryCount attribute */
#define ZB_ZCL_WWAH_NWK_RETRY_COUNT_MAX_VALUE 0xFF

/** @brief Minimum value for MACRetryCount attribute */
#define ZB_ZCL_WWAH_MAC_RETRY_COUNT_MIN_VALUE 0x03

/** @brief Maximum value for MACRetryCount attribute */
#define ZB_ZCL_WWAH_MAC_RETRY_COUNT_MAX_VALUE 0xFF

/** @brief Default value for RouterCheckInEnabled attribute */
#define ZB_ZCL_WWAH_ROUTER_CHECK_IN_ENABLED_DEFAULT_VALUE ZB_FALSE

/** @brief Default value for WWAHParentClassificationEnabled attribute */
#define ZB_ZCL_WWAH_WWAH_PARENT_CLASSIFICATION_ENABLED_DEFAULT_VALUE ZB_FALSE

/** @brief Default value for WWAHAppEventRetryEnabled attribute */
#define ZB_ZCL_WWAH_WWAH_APP_EVENT_RETRY_ENABLED_DEFAULT_VALUE ZB_TRUE

/** @brief Minimum value for WWAHAppEventRetryQueueSize attribute */
#define ZB_ZCL_WWAH_WWAH_APP_EVENT_RETRY_QUEUE_SIZE_MIN_VALUE 10

/** @brief Maximum value for WWAHAppEventRetryQueueSize attribute */
#define ZB_ZCL_WWAH_WWAH_APP_EVENT_RETRY_QUEUE_SIZE_MAX_VALUE 0xFF

/** @brief Default value for WWAHAppEventRetryQueueSize attribute */
#define ZB_ZCL_WWAH_WWAH_APP_EVENT_RETRY_QUEUE_SIZE_DEFAULT_VALUE 10

/** @brief Default value for WWAHRejoinEnabled attribute */
#define ZB_ZCL_WWAH_WWAH_REJOIN_ENABLED_DEFAULT_VALUE ZB_FALSE

/** @brief Minimum value for MACPollFailureWaitTime attribute */
#define ZB_ZCL_WWAH_MAC_POLL_FAILURE_WAIT_TIME_MIN_VALUE 0x00

/** @brief Maximum value for MACPollFailureWaitTime attribute */
#define ZB_ZCL_WWAH_MAC_POLL_FAILURE_WAIT_TIME_MAX_VALUE 0xFF

/** @brief Default value for MACPollFailureWaitTime attribute */
#define ZB_ZCL_WWAH_MAC_POLL_FAILURE_WAIT_TIME_DEFAULT_VALUE 3

/** @brief Default value for ConfigurationModeEnabled attribute */
#define ZB_ZCL_WWAH_CONFIGURATION_MODE_ENABLED_DEFAULT_VALUE ZB_TRUE

/** @brief Minimum value for CurrentDebugReportID attribute */
#define ZB_ZCL_WWAH_CURRENT_DEBUG_REPORT_ID_MIN_VALUE 0x00

/** @brief Maximum value for CurrentDebugReportID attribute */
#define ZB_ZCL_WWAH_CURRENT_DEBUG_REPORT_ID_MAX_VALUE 0xFF

/** @brief Default value for TCSecurityOnNwkKeyRotationEnabled attribute */
#define ZB_ZCL_WWAH_TC_SECURITY_ON_NWK_KEY_ROTATION_ENABLED_DEFAULT_VALUE ZB_FALSE

/** @brief Default value for WWAHBadParentRecoveryEnabled attribute */
#define ZB_ZCL_WWAH_WWAH_BAD_PARENT_RECOVERY_ENABLED_DEFAULT_VALUE ZB_FALSE

/** @brief Minimum value for PendingNetworkUpdateChannel attribute */
#define ZB_ZCL_WWAH_PENDING_NETWORK_UPDATE_CHANNEL_MIN_VALUE 0x00

/** @brief Maximum value for PendingNetworkUpdateChannel attribute */
#define ZB_ZCL_WWAH_PENDING_NETWORK_UPDATE_CHANNEL_MAX_VALUE 0xFF

/** @brief Default value for PendingNetworkUpdateChannel attribute */
#define ZB_ZCL_WWAH_PENDING_NETWORK_UPDATE_CHANNEL_DEFAULT_VALUE 0xFF

/** @brief Minimum value for PendingNetworkUpdatePANID attribute */
#define ZB_ZCL_WWAH_PENDING_NETWORK_UPDATE_PANID_MIN_VALUE 0x0000

/** @brief Maximum value for PendingNetworkUpdatePANID attribute */
#define ZB_ZCL_WWAH_PENDING_NETWORK_UPDATE_PANID_MAX_VALUE 0xFFFF

/** @brief Default value for PendingNetworkUpdatePANID attribute */
#define ZB_ZCL_WWAH_PENDING_NETWORK_UPDATE_PANID_DEFAULT_VALUE 0xFFFF

/** @brief Minimum value for OTAMaxOfflineDuration attribute */
#define ZB_ZCL_WWAH_OTA_MAX_OFFLINE_DURATION_MIN_VALUE 0x0000

/** @brief Maximum value for OTAMaxOfflineDuration attribute */
#define ZB_ZCL_WWAH_OTA_MAX_OFFLINE_DURATION_MAX_VALUE 0xFFFF

/** @brief Additional MAC Poll retry count */
#define ZB_ZCL_WWAH_MAC_POLL_RETRY_COUNT 2

/*! @} */ /* WWAH cluster attributes */

/*! @defgroup ZB_ZCL_WWAH_COMMANDS WWAH cluster commands
    @{
*/

/*! @brief WWAH cluster command identifiers
    @see WWAH spec
*/
enum zb_zcl_wwah_cmd_e
{
  /** Enable APS Link Key Authorization command */
  ZB_ZCL_CMD_WWAH_ENABLE_APS_LINK_KEY_AUTHORIZATION_ID = 0x00,
  /** Disable APS Link Key Authorization command */
  ZB_ZCL_CMD_WWAH_DISABLE_APS_LINK_KEY_AUTHORIZATION_ID = 0x01,
  /** APS Link Key Authorization Query command */
  ZB_ZCL_CMD_WWAH_APS_LINK_KEY_AUTHORIZATION_QUERY_ID = 0x02,
  /** Request New APS Link Key command */
  ZB_ZCL_CMD_WWAH_REQUEST_NEW_APS_LINK_KEY_ID = 0x03,
  /** Enable WWAH App Event Retry Algorithm command */
  ZB_ZCL_CMD_WWAH_ENABLE_WWAH_APP_EVENT_RETRY_ALGORITHM_ID = 0x04,
  /** Disable WWAH App Event Retry Algorithm command */
  ZB_ZCL_CMD_WWAH_DISABLE_WWAH_APP_EVENT_RETRY_ALGORITHM_ID = 0x05,
  /** Request Time command */
  ZB_ZCL_CMD_WWAH_REQUEST_TIME_ID = 0x06,
  /** Enable WWAH Rejoin Algorithm command */
  ZB_ZCL_CMD_WWAH_ENABLE_WWAH_REJOIN_ALGORITHM_ID = 0x07,
  /** Disable WWAH Rejoin Algorithm command */
  ZB_ZCL_CMD_WWAH_DISABLE_WWAH_REJOIN_ALGORITHM_ID = 0x08,
  /** Set IAS Zone Enrollment Method command */
  ZB_ZCL_CMD_WWAH_SET_IAS_ZONE_ENROLLMENT_METHOD_ID = 0x09,
  /** Clear Binding Table command */
  ZB_ZCL_CMD_WWAH_CLEAR_BINDING_TABLE_ID = 0x0A,
  /** Enable Periodic Router Check Ins command */
  ZB_ZCL_CMD_WWAH_ENABLE_PERIODIC_ROUTER_CHECK_INS_ID = 0x0B,
  /** Disable Periodic Router Check Ins command */
  ZB_ZCL_CMD_WWAH_DISABLE_PERIODIC_ROUTER_CHECK_INS_ID = 0x0C,
  /** Set MAC Poll CCA Wait Time command */
  ZB_ZCL_CMD_WWAH_SET_MAC_POLL_CCA_WAIT_TIME_ID = 0x0D,
  /** Set Pending Network Update command */
  ZB_ZCL_CMD_WWAH_SET_PENDING_NETWORK_UPDATE_ID = 0x0E,
  /** Require APS ACKs on Unicasts command */
  ZB_ZCL_CMD_WWAH_REQUIRE_APS_ACKS_ON_UNICASTS_ID = 0x0F,
  /** Remove APS ACKs on Unicasts Requirement command */
  ZB_ZCL_CMD_WWAH_REMOVE_APS_ACKS_ON_UNICASTS_REQUIREMENT_ID = 0x10,
  /** APS ACK Requirement Query command */
  ZB_ZCL_CMD_WWAH_APS_ACK_REQUIREMENT_QUERY_ID = 0x11,
  /** Debug Report Query command */
  ZB_ZCL_CMD_WWAH_DEBUG_REPORT_QUERY_ID = 0x12,
  /** Survey Beacons command */
  ZB_ZCL_CMD_WWAH_SURVEY_BEACONS_ID = 0x13,
  /** Disable OTA Downgrades command */
  ZB_ZCL_CMD_WWAH_DISABLE_OTA_DOWNGRADES_ID = 0x14,
  /** Disable MGMT Leave Without Rejoin command */
  ZB_ZCL_CMD_WWAH_DISABLE_MGMT_LEAVE_WITHOUT_REJOIN_ID = 0x15,
  /** Disable Touchlink Interpan Message Support command */
  ZB_ZCL_CMD_WWAH_DISABLE_TOUCHLINK_INTERPAN_MESSAGE_SUPPORT_ID = 0x16,
  /** Enable WWAH Parent Classification command */
  ZB_ZCL_CMD_WWAH_ENABLE_WWAH_PARENT_CLASSIFICATION_ID = 0x17,
  /** Disable WWAH Parent Classification command */
  ZB_ZCL_CMD_WWAH_DISABLE_WWAH_PARENT_CLASSIFICATION_ID = 0x18,
  /** Enable TC Security On Nwk Key Rotation command */
  ZB_ZCL_CMD_WWAH_ENABLE_TC_SECURITY_ON_NWK_KEY_ROTATION_ID = 0x19,
  /** Enable WWAH Bad Parent Recovery command */
  ZB_ZCL_CMD_WWAH_ENABLE_WWAH_BAD_PARENT_RECOVERY_ID = 0x1A,
  /** Disable WWAH Bad Parent Recovery command */
  ZB_ZCL_CMD_WWAH_DISABLE_WWAH_BAD_PARENT_RECOVERY_ID = 0x1B,
  /** Enable Configuration Mode command */
  ZB_ZCL_CMD_WWAH_ENABLE_CONFIGURATION_MODE_ID = 0x1C,
  /** Disable Configuration Mode command */
  ZB_ZCL_CMD_WWAH_DISABLE_CONFIGURATION_MODE_ID = 0x1D,
  /** Use Trust Center for Cluster command */
  ZB_ZCL_CMD_WWAH_USE_TRUST_CENTER_FOR_CLUSTER_ID = 0x1E,
  /** Trust Center for Cluster Server Query command */
  ZB_ZCL_CMD_WWAH_TRUST_CENTER_FOR_CLUSTER_SERVER_QUERY_ID = 0x1F,
};

enum zb_zcl_wwah_cmd_resp_e
{
  /** APS Link Key Authorization Query Response command */
  ZB_ZCL_CMD_WWAH_APS_LINK_KEY_AUTHORIZATION_QUERY_RESPONSE_ID = 0x00,
  /** Powering Off Notification command */
  ZB_ZCL_CMD_WWAH_POWERING_OFF_NOTIFICATION_ID = 0x01,
  /** Powering On Notification command */
  ZB_ZCL_CMD_WWAH_POWERING_ON_NOTIFICATION_ID = 0x02,
  /** Short Address Change command */
  ZB_ZCL_CMD_WWAH_SHORT_ADDRESS_CHANGE_ID = 0x03,
  /** APS ACK Requirement Query Response command */
  ZB_ZCL_CMD_WWAH_APS_ACK_REQUIREMENT_QUERY_RESPONSE_ID = 0x04,
  /** Power Descriptor Change command */
  ZB_ZCL_CMD_WWAH_POWER_DESCRIPTOR_CHANGE_ID = 0x05,
  /** New Debug Report Notification command */
  ZB_ZCL_CMD_WWAH_NEW_DEBUG_REPORT_NOTIFICATION_ID = 0x06,
  /** Debug Report Query Response command */
  ZB_ZCL_CMD_WWAH_DEBUG_REPORT_QUERY_RESPONSE_ID = 0x07,
  /** Trust Center for Cluster Server Query Response command */
  ZB_ZCL_CMD_WWAH_TRUST_CENTER_FOR_CLUSTER_SERVER_QUERY_RESPONSE_ID = 0x08,
  /** Survey Beacons Response command */
  ZB_ZCL_CMD_WWAH_SURVEY_BEACONS_RESPONSE_ID = 0x09,
};


/* WWAH control cluster commands list : only for information - do not modify */
#define ZB_ZCL_CLUSTER_ID_WWAH_SERVER_ROLE_GENERATED_CMD_LIST        \
  ZB_ZCL_CMD_WWAH_APS_LINK_KEY_AUTHORIZATION_QUERY_RESPONSE_ID,      \
  ZB_ZCL_CMD_WWAH_POWERING_OFF_NOTIFICATION_ID,                      \
  ZB_ZCL_CMD_WWAH_POWERING_ON_NOTIFICATION_ID,                       \
  ZB_ZCL_CMD_WWAH_SHORT_ADDRESS_CHANGE_ID,                           \
  ZB_ZCL_CMD_WWAH_APS_ACK_REQUIREMENT_QUERY_RESPONSE_ID,             \
  ZB_ZCL_CMD_WWAH_POWER_DESCRIPTOR_CHANGE_ID,                        \
  ZB_ZCL_CMD_WWAH_NEW_DEBUG_REPORT_NOTIFICATION_ID,                  \
  ZB_ZCL_CMD_WWAH_DEBUG_REPORT_QUERY_RESPONSE_ID,                    \
  ZB_ZCL_CMD_WWAH_TRUST_CENTER_FOR_CLUSTER_SERVER_QUERY_RESPONSE_ID, \
  ZB_ZCL_CMD_WWAH_SURVEY_BEACONS_RESPONSE_ID

#define ZB_ZCL_CLUSTER_ID_WWAH_CLIENT_ROLE_RECEIVED_CMD_LIST ZB_ZCL_CLUSTER_ID_WWAH_SERVER_ROLE_GENERATED_CMD_LIST

#define ZB_ZCL_CLUSTER_ID_WWAH_CLIENT_ROLE_GENERATED_CMD_LIST        \
  ZB_ZCL_CMD_WWAH_ENABLE_APS_LINK_KEY_AUTHORIZATION_ID,              \
  ZB_ZCL_CMD_WWAH_DISABLE_APS_LINK_KEY_AUTHORIZATION_ID,             \
  ZB_ZCL_CMD_WWAH_APS_LINK_KEY_AUTHORIZATION_QUERY_ID,               \
  ZB_ZCL_CMD_WWAH_REQUEST_NEW_APS_LINK_KEY_ID,                       \
  ZB_ZCL_CMD_WWAH_ENABLE_WWAH_APP_EVENT_RETRY_ALGORITHM_ID,          \
  ZB_ZCL_CMD_WWAH_DISABLE_WWAH_APP_EVENT_RETRY_ALGORITHM_ID,         \
  ZB_ZCL_CMD_WWAH_REQUEST_TIME_ID,                                   \
  ZB_ZCL_CMD_WWAH_ENABLE_WWAH_REJOIN_ALGORITHM_ID,                   \
  ZB_ZCL_CMD_WWAH_DISABLE_WWAH_REJOIN_ALGORITHM_ID,                  \
  ZB_ZCL_CMD_WWAH_SET_IAS_ZONE_ENROLLMENT_METHOD_ID,                 \
  ZB_ZCL_CMD_WWAH_CLEAR_BINDING_TABLE_ID,                            \
  ZB_ZCL_CMD_WWAH_ENABLE_PERIODIC_ROUTER_CHECK_INS_ID,               \
  ZB_ZCL_CMD_WWAH_DISABLE_PERIODIC_ROUTER_CHECK_INS_ID,              \
  ZB_ZCL_CMD_WWAH_SET_MAC_POLL_CCA_WAIT_TIME_ID,                     \
  ZB_ZCL_CMD_WWAH_SET_PENDING_NETWORK_UPDATE_ID,                     \
  ZB_ZCL_CMD_WWAH_REQUIRE_APS_ACKS_ON_UNICASTS_ID,                   \
  ZB_ZCL_CMD_WWAH_REMOVE_APS_ACKS_ON_UNICASTS_REQUIREMENT_ID,        \
  ZB_ZCL_CMD_WWAH_APS_ACK_REQUIREMENT_QUERY_ID,                      \
  ZB_ZCL_CMD_WWAH_DEBUG_REPORT_QUERY_ID,                             \
  ZB_ZCL_CMD_WWAH_SURVEY_BEACONS_ID,                                 \
  ZB_ZCL_CMD_WWAH_DISABLE_OTA_DOWNGRADES_ID,                         \
  ZB_ZCL_CMD_WWAH_DISABLE_MGMT_LEAVE_WITHOUT_REJOIN_ID,              \
  ZB_ZCL_CMD_WWAH_DISABLE_TOUCHLINK_INTERPAN_MESSAGE_SUPPORT_ID,     \
  ZB_ZCL_CMD_WWAH_ENABLE_WWAH_PARENT_CLASSIFICATION_ID,              \
  ZB_ZCL_CMD_WWAH_DISABLE_WWAH_PARENT_CLASSIFICATION_ID,             \
  ZB_ZCL_CMD_WWAH_ENABLE_TC_SECURITY_ON_NWK_KEY_ROTATION_ID,         \
  ZB_ZCL_CMD_WWAH_ENABLE_WWAH_BAD_PARENT_RECOVERY_ID,                \
  ZB_ZCL_CMD_WWAH_DISABLE_WWAH_BAD_PARENT_RECOVERY_ID,               \
  ZB_ZCL_CMD_WWAH_ENABLE_CONFIGURATION_MODE_ID,                      \
  ZB_ZCL_CMD_WWAH_DISABLE_CONFIGURATION_MODE_ID,                     \
  ZB_ZCL_CMD_WWAH_USE_TRUST_CENTER_FOR_CLUSTER_ID,                   \
  ZB_ZCL_CMD_WWAH_TRUST_CENTER_FOR_CLUSTER_SERVER_QUERY_ID

#define ZB_ZCL_CLUSTER_ID_WWAH_SERVER_ROLE_RECEIVED_CMD_LIST ZB_ZCL_CLUSTER_ID_WWAH_CLIENT_ROLE_GENERATED_CMD_LIST


/** @brief Size of APS ACK Exempt Table */
#define ZB_ZCL_WWAH_APS_ACK_EXEMPT_TABLE_SIZE 10
ZB_ASSERT_VALUE_ALIGNED_TO_4(ZB_ZCL_WWAH_APS_ACK_EXEMPT_TABLE_SIZE * sizeof(zb_uint16_t));

/** @brief Size of APS Link Key Authorization Table */
#define ZB_ZCL_WWAH_APS_LINK_KEY_AUTHORIZATION_TABLE_SIZE 10
ZB_ASSERT_VALUE_ALIGNED_TO_4(ZB_ZCL_WWAH_APS_LINK_KEY_AUTHORIZATION_TABLE_SIZE * sizeof(zb_uint16_t));

/** @brief Size of Use Trust Center for Cluster Table */
#define ZB_ZCL_WWAH_USE_TRUST_CENTER_FOR_CLUSTER_TABLE_SIZE 4
ZB_ASSERT_VALUE_ALIGNED_TO_4(ZB_ZCL_WWAH_USE_TRUST_CENTER_FOR_CLUSTER_TABLE_SIZE * sizeof(zb_uint16_t));

/** @brief WWAH Cluster arrays "record is free" flag */
#define ZB_ZCL_WWAH_CLUSTER_ID_FREE_RECORD 0xFFFF

/** @brief Debug Report ID field reserved value
 * The value 0x00 is reserved to indicate that there are no debug reports and SHALL not be used
 * as IDs of a debug report.*/
#define ZB_ZCL_WWAH_RESERVED_DEBUG_REPORT_ID 0x00

#define ZB_ZCL_WWAH_DEBUG_REPORT_FREE_RECORD (zb_zcl_wwah_debug_report_t){ZB_ZCL_WWAH_RESERVED_DEBUG_REPORT_ID, 0, NULL}

/** @brief Context WWAH cluster  */

typedef ZB_PACKED_PRE struct zb_zcl_wwah_debug_report_s
{
  zb_uint8_t report_id;   /**< Report ID. 0x00 means lack of report */
  zb_uint32_t report_size; /**< Report size */
  zb_char_t *report;     /**< Pointer to report data*/
}
ZB_PACKED_STRUCT zb_zcl_wwah_debug_report_t;

typedef ZB_PACKED_PRE struct zb_zcl_wwah_classification_mask_s
{
  zb_bitfield_t tc_connectivity  :1; /**< TC Connectivity value */
  zb_bitfield_t long_uptime :1; /**< Long Uptime value */
  zb_bitfield_t reserved :6; /**< Reserved */
}
ZB_PACKED_STRUCT
zb_zcl_wwah_classification_mask_t;

#define ZB_ZCL_WWAH_PERIODIC_CHECKINS_CLUSTER_MATCH_DESC_TIME (ZB_TIME_ONE_SECOND * 20)
#define ZB_ZCL_WWAH_PERIODIC_CHECKINS_MAX_FAILURE_CNT 3

#define ZB_ZCL_WWAH_PERIODIC_CHECKINS_READ_KEEPALIVE 0
#define ZB_ZCL_WWAH_PERIODIC_CHECKINS_READ_CLUSTER_REVISION 1
#define ZB_ZCL_WWAH_PERIODIC_CHECKINS_NOT_SUPPORTED 2

typedef ZB_PACKED_PRE struct zb_zcl_wwah_periodic_checkins_data_s
{
  zb_uint8_t poll_method;
  zb_uint8_t tsn;
  zb_uint8_t endpoint;
  zb_uint8_t failure_cnt;
  zb_uint32_t countdown;
  zb_uint16_t keepalive_base; /* Base timeout in seconds*/
  zb_uint16_t keepalive_jitter;
} ZB_PACKED_STRUCT zb_zcl_wwah_periodic_checkins_data_t;

typedef enum zb_zcl_wwah_bad_parent_recovery_signal_e
{
  ZB_ZCL_WWAH_BAD_PARENT_RECOVERY_RSSI_WITH_PARENT_BAD = 0,
  ZB_ZCL_WWAH_BAD_PARENT_RECOVERY_RSSI_WITH_PARENT_OK,

  ZB_ZCL_WWAH_BAD_PARENT_RECOVERY_APS_ACK_FAILED,
  ZB_ZCL_WWAH_BAD_PARENT_RECOVERY_APS_ACK_OK,

  ZB_ZCL_WWAH_BAD_PARENT_RECOVERY_POLL_CONTROL_CHECK_IN_FAILED,
  ZB_ZCL_WWAH_BAD_PARENT_RECOVERY_POLL_CONTROL_CHECK_IN_OK,

  ZB_ZCL_WWAH_BAD_PARENT_RECOVERY_RESERVED
} zb_zcl_wwah_bad_parent_recovery_signal_t;

typedef ZB_PACKED_PRE struct zb_zcl_wwah_bad_parent_recovery_data_s
{
  zb_bitfield_t started:1;
  zb_bitfield_t poll_control_checkin_failed_cnt:2;
  zb_bitfield_t reserved:5;
} ZB_PACKED_STRUCT zb_zcl_wwah_bad_parent_recovery_data_t;

typedef enum zb_zcl_wwah_behavior_e
{
  ZB_ZCL_WWAH_BEHAVIOR_OFF = 0,
  ZB_ZCL_WWAH_BEHAVIOR_CLIENT,
  ZB_ZCL_WWAH_BEHAVIOR_SERVER,

  ZB_ZCL_WWAH_BEHAVIOR_RESERVED
} zb_zcl_wwah_behavior_t;

/*! @} */ /* WWAH cluster commands */

/*!
    @cond internals_doc
    @internal @name WWAH cluster internals
    Internal structures for attribute representation in cluster definitions.
    @{
*/

#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_WWAH_DISABLE_OTA_DOWNGRADES_ID(data_ptr)                  \
{                                                                                                    \
  ZB_ZCL_ATTR_WWAH_DISABLE_OTA_DOWNGRADES_ID,                                                        \
  ZB_ZCL_ATTR_TYPE_BOOL,                                                                             \
  ZB_ZCL_ATTR_ACCESS_READ_ONLY,                                                                      \
  (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),                                                                \
  (void*) data_ptr                                                                                   \
}

#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_WWAH_MGMT_LEAVE_WITHOUT_REJOIN_ENABLED_ID(data_ptr)       \
{                                                                                                    \
  ZB_ZCL_ATTR_WWAH_MGMT_LEAVE_WITHOUT_REJOIN_ENABLED_ID,                                             \
  ZB_ZCL_ATTR_TYPE_BOOL,                                                                             \
  ZB_ZCL_ATTR_ACCESS_READ_ONLY,                                                                      \
  (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),                                                                \
  (void*) data_ptr                                                                                   \
}

#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_WWAH_NWK_RETRY_COUNT_ID(data_ptr)                         \
{                                                                                                    \
  ZB_ZCL_ATTR_WWAH_NWK_RETRY_COUNT_ID,                                                               \
  ZB_ZCL_ATTR_TYPE_U8,                                                                               \
  ZB_ZCL_ATTR_ACCESS_READ_ONLY,                                                                      \
  (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),                                                                \
  (void*) data_ptr                                                                                   \
}

#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_WWAH_MAC_RETRY_COUNT_ID(data_ptr)                         \
{                                                                                                    \
  ZB_ZCL_ATTR_WWAH_MAC_RETRY_COUNT_ID,                                                               \
  ZB_ZCL_ATTR_TYPE_U8,                                                                               \
  ZB_ZCL_ATTR_ACCESS_READ_ONLY,                                                                      \
  (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),                                                                \
  (void*) data_ptr                                                                                   \
}

#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_WWAH_ROUTER_CHECK_IN_ENABLED_ID(data_ptr)                 \
{                                                                                                    \
  ZB_ZCL_ATTR_WWAH_ROUTER_CHECK_IN_ENABLED_ID,                                                       \
  ZB_ZCL_ATTR_TYPE_BOOL,                                                                             \
  ZB_ZCL_ATTR_ACCESS_READ_ONLY,                                                                      \
  (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),                                                                \
  (void*) data_ptr                                                                                   \
}

#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_WWAH_TOUCHLINK_INTERPAN_ENABLED_ID(data_ptr)              \
{                                                                                                    \
  ZB_ZCL_ATTR_WWAH_TOUCHLINK_INTERPAN_ENABLED_ID,                                                    \
  ZB_ZCL_ATTR_TYPE_BOOL,                                                                             \
  ZB_ZCL_ATTR_ACCESS_READ_ONLY,                                                                      \
  (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),                                                                \
  (void*) data_ptr                                                                                   \
}

#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_WWAH_WWAH_PARENT_CLASSIFICATION_ENABLED_ID(data_ptr)      \
{                                                                                                    \
  ZB_ZCL_ATTR_WWAH_WWAH_PARENT_CLASSIFICATION_ENABLED_ID,                                            \
  ZB_ZCL_ATTR_TYPE_BOOL,                                                                             \
  ZB_ZCL_ATTR_ACCESS_READ_ONLY,                                                                      \
  (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),                                                                \
  (void*) data_ptr                                                                                   \
}

#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_WWAH_WWAH_APP_EVENT_RETRY_ENABLED_ID(data_ptr)            \
{                                                                                                    \
  ZB_ZCL_ATTR_WWAH_WWAH_APP_EVENT_RETRY_ENABLED_ID,                                                  \
  ZB_ZCL_ATTR_TYPE_BOOL,                                                                             \
  ZB_ZCL_ATTR_ACCESS_READ_ONLY,                                                                      \
  (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),                                                                \
  (void*) data_ptr                                                                                   \
}

#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_WWAH_WWAH_APP_EVENT_RETRY_QUEUE_SIZE_ID(data_ptr)         \
{                                                                                                    \
  ZB_ZCL_ATTR_WWAH_WWAH_APP_EVENT_RETRY_QUEUE_SIZE_ID,                                               \
  ZB_ZCL_ATTR_TYPE_U8,                                                                               \
  ZB_ZCL_ATTR_ACCESS_READ_ONLY,                                                                      \
  (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),                                                                \
  (void*) data_ptr                                                                                   \
}

#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_WWAH_WWAH_REJOIN_ENABLED_ID(data_ptr)                     \
{                                                                                                    \
  ZB_ZCL_ATTR_WWAH_WWAH_REJOIN_ENABLED_ID,                                                           \
  ZB_ZCL_ATTR_TYPE_BOOL,                                                                             \
  ZB_ZCL_ATTR_ACCESS_READ_ONLY,                                                                      \
  (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),                                                                \
  (void*) data_ptr                                                                                   \
}

#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_WWAH_MAC_POLL_FAILURE_WAIT_TIME_ID(data_ptr)              \
{                                                                                                    \
  ZB_ZCL_ATTR_WWAH_MAC_POLL_FAILURE_WAIT_TIME_ID,                                                    \
  ZB_ZCL_ATTR_TYPE_U8,                                                                               \
  ZB_ZCL_ATTR_ACCESS_READ_ONLY,                                                                      \
  (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),                                                                \
  (void*) data_ptr                                                                                   \
}

#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_WWAH_CONFIGURATION_MODE_ENABLED_ID(data_ptr)              \
{                                                                                                    \
  ZB_ZCL_ATTR_WWAH_CONFIGURATION_MODE_ENABLED_ID,                                                    \
  ZB_ZCL_ATTR_TYPE_BOOL,                                                                             \
  ZB_ZCL_ATTR_ACCESS_READ_ONLY,                                                                      \
  (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),                                                                \
  (void*) data_ptr                                                                                   \
}

#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_WWAH_CURRENT_DEBUG_REPORT_ID_ID(data_ptr)                 \
{                                                                                                    \
  ZB_ZCL_ATTR_WWAH_CURRENT_DEBUG_REPORT_ID_ID,                                                       \
  ZB_ZCL_ATTR_TYPE_U8,                                                                               \
  ZB_ZCL_ATTR_ACCESS_READ_ONLY,                                                                      \
  (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),                                                                \
  (void*) data_ptr                                                                                   \
}

#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_WWAH_TC_SECURITY_ON_NWK_KEY_ROTATION_ENABLED_ID(data_ptr)\
{                                                                                                    \
  ZB_ZCL_ATTR_WWAH_TC_SECURITY_ON_NWK_KEY_ROTATION_ENABLED_ID,                                       \
  ZB_ZCL_ATTR_TYPE_BOOL,                                                                             \
  ZB_ZCL_ATTR_ACCESS_READ_ONLY,                                                                      \
  (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),                                                                \
  (void*) data_ptr                                                                                   \
}

#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_WWAH_WWAH_BAD_PARENT_RECOVERY_ENABLED_ID(data_ptr)        \
{                                                                                                    \
  ZB_ZCL_ATTR_WWAH_WWAH_BAD_PARENT_RECOVERY_ENABLED_ID,                                              \
  ZB_ZCL_ATTR_TYPE_BOOL,                                                                             \
  ZB_ZCL_ATTR_ACCESS_READ_ONLY,                                                                      \
  (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),                                                                \
  (void*) data_ptr                                                                                   \
}

#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_WWAH_PENDING_NETWORK_UPDATE_CHANNEL_ID(data_ptr)          \
{                                                                                                    \
  ZB_ZCL_ATTR_WWAH_PENDING_NETWORK_UPDATE_CHANNEL_ID,                                                \
  ZB_ZCL_ATTR_TYPE_U8,                                                                               \
  ZB_ZCL_ATTR_ACCESS_READ_ONLY,                                                                      \
  (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),                                                                \
  (void*) data_ptr                                                                                   \
}

#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_WWAH_PENDING_NETWORK_UPDATE_PANID_ID(data_ptr)            \
{                                                                                                    \
  ZB_ZCL_ATTR_WWAH_PENDING_NETWORK_UPDATE_PANID_ID,                                                  \
  ZB_ZCL_ATTR_TYPE_U16,                                                                              \
  ZB_ZCL_ATTR_ACCESS_READ_ONLY,                                                                      \
  (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),                                                                \
  (void*) data_ptr                                                                                   \
}

#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_WWAH_OTA_MAX_OFFLINE_DURATION_ID(data_ptr)                \
{                                                                                                    \
  ZB_ZCL_ATTR_WWAH_OTA_MAX_OFFLINE_DURATION_ID,                                                      \
  ZB_ZCL_ATTR_TYPE_U16,                                                                              \
  ZB_ZCL_ATTR_ACCESS_READ_ONLY,                                                                      \
  (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),                                                                \
  (void*) data_ptr                                                                                   \
}

typedef ZB_PACKED_PRE struct zb_zcl_wwah_cluster_list_s
{
  zb_uint8_t number_of_clusters; /**< Number of Clusters */
  zb_uint16_t *cluster_id;       /**< Cluster ID */
}
ZB_PACKED_STRUCT zb_zcl_wwah_cluster_list_t;

/*!
  @brief Parses various commands with cluster list variable length payload and fills data request structure.
  @param data_buf - pointer to zb_buf_t buffer containing command request data
  @param req - variable to save command request
  @param status - success or not read parameters - ZB_TRUE or ZB_FALSE
  @note data_buf buffer should contain command request payload without ZCL header.
*/

#define ZB_ZCL_WWAH_GET_CLUSTER_LIST_CMD(data_buf, req, status)                                \
{                                                                                              \
  zb_zcl_wwah_cluster_list_t *src_ptr = (zb_zcl_wwah_cluster_list_t*)zb_buf_begin((data_buf)); \
  (status) = ZB_ZCL_PARSE_STATUS_FAILURE;                                                      \
  if (zb_buf_len((data_buf)) >= sizeof(zb_uint8_t))                                            \
  {                                                                                            \
    (req)->number_of_clusters = src_ptr->number_of_clusters;                                   \
    if (src_ptr->number_of_clusters)                                                           \
    {                                                                                          \
      if (zb_buf_len((data_buf)) >= sizeof(zb_uint8_t) +                                       \
          src_ptr->number_of_clusters * sizeof(zb_uint16_t))                                   \
      {                                                                                        \
        (req)->cluster_id = (zb_uint16_t*)(&(src_ptr->cluster_id));                            \
        (status) = ZB_ZCL_PARSE_STATUS_SUCCESS;                                                \
      }                                                                                        \
    }                                                                                          \
    else                                                                                       \
    {                                                                                          \
      (status) = ZB_ZCL_PARSE_STATUS_SUCCESS;                                                  \
    }                                                                                          \
  }                                                                                            \
}

#define ZB_ZCL_WWAH_APS_LINK_KEY_AUTHORIZATION_QUERY_PAYLOAD_LEN (sizeof(zb_uint16_t))

/*!
  @brief Parses APS Link Key Authorization Query command and fills data request structure.
  @param data_buf - pointer to zb_buf_t buffer containing command request data
  @param req - variable to save command request
  @param status - success or not read parameters - ZB_TRUE or ZB_FALSE
  @note data_buf buffer should contain command request payload without ZCL header.
*/
#define ZB_ZCL_WWAH_GET_APS_LINK_KEY_AUTHORIZATION_QUERY(data_buf, req, status)           \
{                                                                                         \
  zb_uint16_t *req_ptr =                                                                  \
     zb_buf_len(data_buf) >= ZB_ZCL_WWAH_APS_LINK_KEY_AUTHORIZATION_QUERY_PAYLOAD_LEN ?   \
         (zb_uint16_t*)zb_buf_begin(data_buf) : NULL;                                     \
  if (req_ptr)                                                                            \
  {                                                                                       \
    ZB_MEMCPY(&(req), req_ptr, ZB_ZCL_WWAH_APS_LINK_KEY_AUTHORIZATION_QUERY_PAYLOAD_LEN); \
    status = ((req) == ZB_ZCL_WWAH_CLUSTER_ID_FREE_RECORD) ?                              \
      ZB_ZCL_PARSE_STATUS_FAILURE : ZB_ZCL_PARSE_STATUS_SUCCESS;                          \
                                                                                          \
  }                                                                                       \
  else                                                                                    \
  {                                                                                       \
    status = ZB_ZCL_PARSE_STATUS_FAILURE;                                                 \
  }                                                                                       \
}

/** @brief Enable WWAH App Event Retry Algorithm command structure */
typedef ZB_PACKED_PRE struct zb_zcl_wwah_enable_wwah_app_event_retry_algorithm_s
{
  zb_uint8_t first_backoff_time_in_seconds;          /**< First Backoff Time In Seconds */
  zb_uint8_t backoff_sequence_common_ratio;          /**< Backoff Sequence Common Ratio */
  zb_uint32_t max_backoff_time_in_seconds;           /**< Max Backoff Time In Seconds */
  zb_uint8_t max_re_delivery_attempts;               /**< Max Re-Delivery Attempts */
}
ZB_PACKED_STRUCT
zb_zcl_wwah_enable_wwah_app_event_retry_algorithm_t;

#define ZB_ZCL_WWAH_ENABLE_WWAH_APP_EVENT_RETRY_ALGORITHM_PAYLOAD_LEN (sizeof(zb_zcl_wwah_enable_wwah_app_event_retry_algorithm_t))
/*!
  @brief Parses Enable WWAH App Event Retry Algorithm command and fills data request structure.
  @param data_buf - pointer to zb_buf_t buffer containing command request data
  @param req - variable to save command request
  @param status - success or not read parameters - ZB_TRUE or ZB_FALSE
  @note data_buf buffer should contain command request payload without ZCL header.
*/
#define ZB_ZCL_WWAH_GET_ENABLE_WWAH_APP_EVENT_RETRY_ALGORITHM(data_buf, req, status)           \
{                                                                                              \
  zb_zcl_wwah_enable_wwah_app_event_retry_algorithm_t *req_ptr =                               \
     zb_buf_len(data_buf) >= ZB_ZCL_WWAH_ENABLE_WWAH_APP_EVENT_RETRY_ALGORITHM_PAYLOAD_LEN ?   \
         (zb_zcl_wwah_enable_wwah_app_event_retry_algorithm_t*)zb_buf_begin(data_buf) : NULL;  \
  if (req_ptr)                                                                                 \
  {                                                                                            \
    ZB_MEMCPY(&(req), req_ptr, ZB_ZCL_WWAH_ENABLE_WWAH_APP_EVENT_RETRY_ALGORITHM_PAYLOAD_LEN); \
    (status) = ZB_ZCL_PARSE_STATUS_SUCCESS;                                                    \
  }                                                                                            \
  else                                                                                         \
  {                                                                                            \
    (status) = ZB_ZCL_PARSE_STATUS_FAILURE;                                                    \
  }                                                                                            \
}

/** @brief Enable WWAH Rejoin Algorithm command structure */
typedef ZB_PACKED_PRE struct zb_zcl_wwah_enable_wwah_rejoin_algorithm_s
{
  zb_uint16_t fast_rejoin_timeout_in_seconds;           /**< Fast Rejoin Timeout In Seconds */
  zb_uint16_t duration_between_each_rejoin_in_seconds;  /**< Duration Between Each Rejoin In Seconds */
  zb_uint16_t fast_rejoin_first_backoff_in_seconds;     /**< Fast Rejoin First Backoff In Seconds */
  zb_uint16_t rejoin_max_backoff_time_in_seconds;       /**< Max Backoff Time In Seconds */
  zb_uint16_t max_backoff_iterations;                   /**< Max Backoff Iterations */
}
ZB_PACKED_STRUCT
zb_zcl_wwah_enable_wwah_rejoin_algorithm_t;

#define ZB_ZCL_WWAH_ENABLE_WWAH_REJOIN_ALGORITHM_PAYLOAD_LEN (sizeof(zb_zcl_wwah_enable_wwah_rejoin_algorithm_t))

/*!
  @brief Parses Enable WWAH Rejoin Algorithm command and fills data request structure.
  @param data_buf - pointer to zb_buf_t buffer containing command request data
  @param req - variable to save command request
  @param status - success or not read parameters - ZB_TRUE or ZB_FALSE
   @note data_buf buffer should contain command request payload without ZCL header.
*/
#define ZB_ZCL_WWAH_GET_ENABLE_WWAH_REJOIN_ALGORITHM(data_buf, req, status)           \
{                                                                                     \
  zb_zcl_wwah_enable_wwah_rejoin_algorithm_t *req_ptr =                               \
     zb_buf_len(data_buf) >= ZB_ZCL_WWAH_ENABLE_WWAH_REJOIN_ALGORITHM_PAYLOAD_LEN ?   \
         (zb_zcl_wwah_enable_wwah_rejoin_algorithm_t*)zb_buf_begin(data_buf) : NULL;  \
  if (req_ptr)                                                                        \
  {                                                                                   \
    ZB_MEMCPY(&(req), req_ptr, ZB_ZCL_WWAH_ENABLE_WWAH_REJOIN_ALGORITHM_PAYLOAD_LEN); \
    (status) = ZB_ZCL_PARSE_STATUS_SUCCESS;                                           \
  }                                                                                   \
  else                                                                                \
  {                                                                                   \
    (status) = ZB_ZCL_PARSE_STATUS_FAILURE;                                           \
  }                                                                                   \
}

#define ZB_ZCL_WWAH_SET_IAS_ZONE_ENROLLMENT_METHOD_PAYLOAD_LEN (sizeof(zb_uint8_t))
/*!
  @brief Parses Set IAS Zone Enrollment Method command and fills data request structure.
  @param data_buf - pointer to zb_buf_t buffer containing command request data
  @param req - variable to save command request
  @param status - success or not read parameters - ZB_TRUE or ZB_FALSE
  @note data_buf buffer should contain command request payload without ZCL header.
*/
#define ZB_ZCL_WWAH_GET_SET_IAS_ZONE_ENROLLMENT_METHOD(data_buf, req, status)           \
{                                                                                       \
  zb_uint8_t *req_ptr =                                                                 \
     zb_buf_len(data_buf) >= ZB_ZCL_WWAH_SET_IAS_ZONE_ENROLLMENT_METHOD_PAYLOAD_LEN ?   \
         (zb_uint8_t*)zb_buf_begin(data_buf) : NULL;                                    \
  if (req_ptr)                                                                          \
  {                                                                                     \
    ZB_MEMCPY(&(req), req_ptr, ZB_ZCL_WWAH_SET_IAS_ZONE_ENROLLMENT_METHOD_PAYLOAD_LEN); \
    switch(*(zb_uint8_t*)req_ptr)                                                       \
    {                                                                                   \
      case ZB_ZCL_WWAH_ENROLLMENT_MODE_TRIP_TO_PAIR:                                    \
      case ZB_ZCL_WWAH_ENROLLMENT_MODE_AUTO_ENROLL_RESPONSE:                            \
      case ZB_ZCL_WWAH_ENROLLMENT_MODE_AUTO_ENROLL_REQUEST:                             \
      {                                                                                 \
        status = ZB_ZCL_PARSE_STATUS_SUCCESS;                                           \
        break;                                                                          \
      }                                                                                 \
      default:                                                                          \
      {                                                                                 \
        status = ZB_ZCL_PARSE_STATUS_FAILURE;                                           \
        break;                                                                          \
      }                                                                                 \
    }                                                                                   \
  }                                                                                     \
  else                                                                                  \
  {                                                                                     \
    status = ZB_ZCL_PARSE_STATUS_FAILURE;                                               \
  }                                                                                     \
}

#define ZB_ZCL_WWAH_ENABLE_PERIODIC_ROUTER_CHECK_INS_PAYLOAD_LEN (sizeof(zb_uint16_t))

/*!
  @brief Parses Enable Periodic Router Check-Ins command and fills data request structure.
  @param data_buf - pointer to zb_buf_t buffer containing command request data
  @param req - variable to save command request
  @param status - success or not read parameters - ZB_TRUE or ZB_FALSE
  @note data_buf buffer should contain command request payload without ZCL header.
*/
#define ZB_ZCL_WWAH_GET_ENABLE_PERIODIC_ROUTER_CHECK_INS(data_buf, req, status)           \
{                                                                                         \
  zb_uint16_t *req_ptr =                                                                  \
     zb_buf_len(data_buf) >= ZB_ZCL_WWAH_ENABLE_PERIODIC_ROUTER_CHECK_INS_PAYLOAD_LEN ?   \
         (zb_uint16_t*)zb_buf_begin(data_buf) : NULL;                                     \
  if (req_ptr)                                                                            \
  {                                                                                       \
    ZB_MEMCPY(&(req), req_ptr, ZB_ZCL_WWAH_ENABLE_PERIODIC_ROUTER_CHECK_INS_PAYLOAD_LEN); \
    status = ZB_ZCL_PARSE_STATUS_SUCCESS;                                                 \
  }                                                                                       \
  else                                                                                    \
  {                                                                                       \
    status = ZB_ZCL_PARSE_STATUS_FAILURE;                                                 \
  }                                                                                       \
}

#define ZB_ZCL_WWAH_SET_MAC_POLL_CCA_WAIT_TIME_PAYLOAD_LEN (sizeof(zb_uint8_t))

/*!
  @brief Parses Set MAC Poll CCA Wait Time command and fills data request structure.
  @param data_buf - pointer to zb_buf_t buffer containing command request data
  @param req - variable to save command request
  @param status - success or not read parameters - ZB_TRUE or ZB_FALSE
  @note data_buf buffer should contain command request payload without ZCL header.
*/
#define ZB_ZCL_WWAH_GET_SET_MAC_POLL_CCA_WAIT_TIME(data_buf, req, status)           \
{                                                                                   \
  zb_uint8_t *req_ptr =                                                             \
     zb_buf_len(data_buf) >= ZB_ZCL_WWAH_SET_MAC_POLL_CCA_WAIT_TIME_PAYLOAD_LEN ?   \
         (zb_uint8_t*)zb_buf_begin(data_buf) : NULL;                                \
  if (req_ptr)                                                                      \
  {                                                                                 \
    ZB_MEMCPY(&(req), req_ptr, ZB_ZCL_WWAH_SET_MAC_POLL_CCA_WAIT_TIME_PAYLOAD_LEN); \
    status = ZB_ZCL_PARSE_STATUS_SUCCESS;                                           \
  }                                                                                 \
  else                                                                              \
  {                                                                                 \
    status = ZB_ZCL_PARSE_STATUS_FAILURE;                                           \
  }                                                                                 \
}

/** @brief Set Pending Network Update command structure */
typedef ZB_PACKED_PRE struct zb_zcl_wwah_set_pending_network_update_s
{
  zb_uint8_t channel;  /**< Channel */
  zb_uint16_t pan_id;  /**< PAN ID */
}
ZB_PACKED_STRUCT
zb_zcl_wwah_set_pending_network_update_t;

#define ZB_ZCL_WWAH_SET_PENDING_NETWORK_UPDATE_PAYLOAD_LEN (sizeof(zb_zcl_wwah_set_pending_network_update_t))
/*!
  @brief Parses Set Pending Network Update command and fills data request structure.
  @param data_buf - pointer to zb_buf_t buffer containing command request data
  @param req - variable to save command request
  @param status - success or not read parameters - ZB_TRUE or ZB_FALSE
  @note data_buf buffer should contain command request payload without ZCL header.
*/
#define ZB_ZCL_WWAH_GET_SET_PENDING_NETWORK_UPDATE(data_buf, req, status)           \
{                                                                                   \
  zb_zcl_wwah_set_pending_network_update_t *req_ptr =                               \
     zb_buf_len(data_buf) >= ZB_ZCL_WWAH_SET_PENDING_NETWORK_UPDATE_PAYLOAD_LEN ?   \
         (zb_zcl_wwah_set_pending_network_update_t*)zb_buf_begin(data_buf) : NULL;  \
  if (req_ptr)                                                                      \
  {                                                                                 \
    ZB_MEMCPY(&(req), req_ptr, ZB_ZCL_WWAH_SET_PENDING_NETWORK_UPDATE_PAYLOAD_LEN); \
    status = ZB_ZCL_PARSE_STATUS_SUCCESS;                                           \
  }                                                                                 \
  else                                                                              \
  {                                                                                 \
    status = ZB_ZCL_PARSE_STATUS_FAILURE;                                           \
  }                                                                                 \
}

#define ZB_ZCL_WWAH_DEBUG_REPORT_QUERY_PAYLOAD_LEN (sizeof(zb_uint8_t))
/*!
  @brief Parses Debug Report Query command and fills data request structure.
  @param data_buf - pointer to zb_buf_t buffer containing command request data
  @param req - variable to save command request
  @param status - success or not read parameters - ZB_TRUE or ZB_FALSE
  @note data_buf buffer should contain command request payload without ZCL header.
*/
#define ZB_ZCL_WWAH_GET_DEBUG_REPORT_QUERY(data_buf, req, status)           \
{                                                                           \
  zb_uint8_t *req_ptr =                                                     \
     zb_buf_len(data_buf) >= ZB_ZCL_WWAH_DEBUG_REPORT_QUERY_PAYLOAD_LEN ?   \
         (zb_uint8_t*)zb_buf_begin(data_buf) : NULL;                        \
  if (req_ptr)                                                              \
  {                                                                         \
    ZB_MEMCPY(&(req), req_ptr, ZB_ZCL_WWAH_DEBUG_REPORT_QUERY_PAYLOAD_LEN); \
    status = ZB_ZCL_PARSE_STATUS_SUCCESS;                                   \
  }                                                                         \
  else                                                                      \
  {                                                                         \
    status = ZB_ZCL_PARSE_STATUS_FAILURE;                                   \
  }                                                                         \
}

#define ZB_ZCL_WWAH_SURVEY_BEACONS_PAYLOAD_LEN (sizeof(zb_uint8_t))
/*!
  @brief Parses Survey Beacons command and fills data request structure.
  @param data_buf - pointer to zb_buf_t buffer containing command request data
  @param req - variable to save command request
  @param status - success or not read parameters - ZB_TRUE or ZB_FALSE
  @note data_buf buffer should contain command request payload without ZCL header.
*/
#define ZB_ZCL_WWAH_GET_SURVEY_BEACONS(data_buf, req, status)           \
{                                                                       \
  zb_uint8_t *req_ptr =                                                 \
     zb_buf_len(data_buf) >= ZB_ZCL_WWAH_SURVEY_BEACONS_PAYLOAD_LEN ?   \
         (zb_uint8_t*)zb_buf_begin(data_buf) : NULL;                    \
  if (req_ptr)                                                          \
  {                                                                     \
    ZB_MEMCPY(&(req), req_ptr, ZB_ZCL_WWAH_SURVEY_BEACONS_PAYLOAD_LEN); \
    status = ZB_ZCL_PARSE_STATUS_SUCCESS;                               \
  }                                                                     \
  else                                                                  \
  {                                                                     \
    status = ZB_ZCL_PARSE_STATUS_FAILURE;                               \
  }                                                                     \
}

/** @brief APS Link Key Authorization Query Response command structure */
typedef ZB_PACKED_PRE struct zb_zcl_wwah_aps_link_key_authorization_query_response_s
{
  zb_uint16_t cluster_id;                        /**< Cluster ID */
  zb_uint8_t aps_link_key_authorization_status;  /**< APS Link Key Authorization Status  */
}
ZB_PACKED_STRUCT
zb_zcl_wwah_aps_link_key_authorization_query_response_t;

#define ZB_ZCL_WWAH_APS_LINK_KEY_AUTHORIZATION_QUERY_RESPONSE_PAYLOAD_LEN (sizeof(zb_zcl_wwah_aps_link_key_authorization_query_response_t))
/*!
  @brief Parses APS Link Key Authorization Query Response command and fills data request structure.
  @param data_buf - pointer to zb_buf_t buffer containing command request data
  @param req - variable to save command request
  @param status - success or not read parameters - ZB_TRUE or ZB_FALSE
  @note data_buf buffer should contain command request payload without ZCL header.
*/
#define ZB_ZCL_WWAH_GET_APS_LINK_KEY_AUTHORIZATION_QUERY_RESPONSE(data_buf, req, status)           \
{                                                                                                  \
  zb_zcl_wwah_aps_link_key_authorization_query_response_t *req_ptr =                               \
     zb_buf_len(data_buf) >= ZB_ZCL_WWAH_APS_LINK_KEY_AUTHORIZATION_QUERY_RESPONSE_PAYLOAD_LEN ?   \
         (zb_zcl_wwah_aps_link_key_authorization_query_response_t*)zb_buf_begin(data_buf) : NULL;  \
  if (req_ptr)                                                                                     \
  {                                                                                                \
    ZB_MEMCPY(&(req), req_ptr, ZB_ZCL_WWAH_APS_LINK_KEY_AUTHORIZATION_QUERY_RESPONSE_PAYLOAD_LEN); \
    status = ZB_ZCL_PARSE_STATUS_SUCCESS;                                                          \
  }                                                                                                \
  else                                                                                             \
  {                                                                                                \
    status = ZB_ZCL_PARSE_STATUS_FAILURE;                                                          \
  }                                                                                                \
}

/** @brief Short Address Change command structure */
typedef ZB_PACKED_PRE struct zb_zcl_wwah_short_address_change_s
{
  zb_ieee_addr_t device_eui64;  /**< DeviceEUI64 */
  zb_uint16_t device_short;     /**< DeviceShort */
}
ZB_PACKED_STRUCT
zb_zcl_wwah_short_address_change_t;

#define ZB_ZCL_WWAH_SHORT_ADDRESS_CHANGE_PAYLOAD_LEN (sizeof(zb_zcl_wwah_short_address_change_t))
/*!
  @brief Parses Short Address Change command and fills data request structure.
  @param data_buf - pointer to zb_buf_t buffer containing command request data
  @param req - variable to save command request
  @param status - success or not read parameters - ZB_TRUE or ZB_FALSE
  @note data_buf buffer should contain command request payload without ZCL header.
*/
#define ZB_ZCL_WWAH_GET_SHORT_ADDRESS_CHANGE(data_buf, req, status)           \
{                                                                             \
  zb_zcl_wwah_short_address_change_t *req_ptr =                               \
     zb_buf_len(data_buf) >= ZB_ZCL_WWAH_SHORT_ADDRESS_CHANGE_PAYLOAD_LEN ?   \
         (zb_zcl_wwah_short_address_change_t*)zb_buf_begin(data_buf) : NULL;  \
  if (req_ptr)                                                                \
  {                                                                           \
    ZB_MEMCPY(&(req), req_ptr, ZB_ZCL_WWAH_SHORT_ADDRESS_CHANGE_PAYLOAD_LEN); \
    status = ZB_ZCL_PARSE_STATUS_SUCCESS;                                     \
  }                                                                           \
  else                                                                        \
  {                                                                           \
    status = ZB_ZCL_PARSE_STATUS_FAILURE;                                     \
  }                                                                           \
}

/** @brief Power Descriptor Change command structure */
typedef ZB_PACKED_PRE struct zb_zcl_wwah_power_descriptor_change_s
{
  zb_uint32_t current_power_mode;         /**< Current power mode */
  zb_uint32_t available_power_sources;    /**< Available power sources */
  zb_uint32_t current_power_source;       /**< Current power source */
  zb_uint32_t current_power_source_level; /**< Current power source level */
}
ZB_PACKED_STRUCT
zb_zcl_wwah_power_descriptor_change_t;


/*!
  @brief Parses Power Descriptor Change command and fills data request structure.
  @param data_buf - pointer to zb_buf_t buffer containing command request data
  @param req - variable to save command request
  @param status - success or not read parameters - ZB_TRUE or ZB_FALSE
  @note data_buf buffer should contain command request payload without ZCL header.
*/
#define ZB_ZCL_WWAH_GET_POWER_DESCRIPTOR_CHANGE(data_buf, req, status)           \
{                                                                                       \
  zb_zcl_wwah_power_descriptor_change_t *req_ptr =                               \
     zb_buf_len(data_buf) >= ZB_ZCL_WWAH_POWER_DESCRIPTOR_CHANGE_PAYLOAD_LEN ?   \
         (zb_zcl_wwah_power_descriptor_change_t*)zb_buf_begin(data_buf) : NULL;  \
  if (req_ptr)                                                                          \
  {                                                                                     \
    ZB_MEMCPY(&(req), req_ptr, sizeof(zb_zcl_wwah_power_descriptor_change_t));   \
    status = ZB_ZCL_PARSE_STATUS_SUCCESS;                                               \
  }                                                                                     \
  else                                                                                  \
  {                                                                                     \
    status = ZB_ZCL_PARSE_STATUS_FAILURE;                                               \
  }                                                                                     \
}

/** @brief Powering On/Off Notification command structure */
typedef ZB_PACKED_PRE struct zb_zcl_wwah_powering_on_off_notification_s
{
  zb_uint8_t power_notification_reason;  /**< PowerNotificationReason */
  zb_uint16_t manufacturer_id;  /**< Manufacturer ID */
  zb_uint8_t manufacturer_power_notification_reason_length;  /**< Manufacturer Power Notification Reason Length */
  zb_uint8_t *manufacturer_power_notification_reason;  /**< Manufacturer Power Notification Reason */
}
ZB_PACKED_STRUCT
zb_zcl_wwah_powering_on_off_notification_t;

#define ZB_ZCL_WWAH_POWERING_ON_OFF_NOTIFICATION_PAYLOAD_LEN (sizeof(zb_uint8_t) + sizeof(zb_uint16_t)+ sizeof(zb_uint8_t))
/*!
  @brief Parses Powering On/Off Notification command and fills data request structure.
  @param data_buf - pointer to zb_buf_t buffer containing command request data
  @param req - variable to save command request
  @param status - success or not read parameters - ZB_TRUE or ZB_FALSE
  @note data_buf buffer should contain command request payload without ZCL header.
*/
#define ZB_ZCL_WWAH_GET_POWERING_ON_OFF_NOTIFICATION(data_buf, req, status)                    \
{                                                                                              \
  zb_zcl_wwah_powering_on_off_notification_t *src_ptr =                                        \
    (zb_zcl_wwah_powering_on_off_notification_t*)zb_buf_begin((data_buf));                     \
  (status) = ZB_ZCL_PARSE_STATUS_FAILURE;                                                      \
  if (zb_buf_len((data_buf)) >= ZB_ZCL_WWAH_POWERING_ON_OFF_NOTIFICATION_PAYLOAD_LEN)          \
  {                                                                                            \
    ZB_MEMCPY(&(req), req_ptr, ZB_ZCL_WWAH_POWERING_ON_OFF_NOTIFICATION_PAYLOAD_LEN);          \
    if (src_ptr->manufacturer_power_notification_reason_length)                                \
    {                                                                                          \
      if (zb_buf_len((data_buf)) >= ZB_ZCL_WWAH_POWERING_ON_OFF_NOTIFICATION_PAYLOAD_LEN +     \
          src_ptr->manufacturer_power_notification_reason_length * sizeof(zb_uint8_t))         \
      {                                                                                        \
        (req)->manufacturer_power_notification_reason =                                        \
          (zb_uint8_t*)(&(src_ptr->manufacturer_power_notification_reason));                   \
        (status) = ZB_ZCL_PARSE_STATUS_SUCCESS;                                                \
      }                                                                                        \
    }                                                                                          \
    else                                                                                       \
    {                                                                                          \
      (status) = ZB_ZCL_PARSE_STATUS_SUCCESS;                                                  \
    }                                                                                          \
  }                                                                                            \
}

/** @brief New Debug Report Notification command structure */
typedef ZB_PACKED_PRE struct zb_zcl_wwah_new_debug_report_notification_s
{
  zb_uint8_t debug_report_id;  /**< Debug Report ID */
  zb_uint32_t size_of_report;  /**< Size of Report */
}
ZB_PACKED_STRUCT
zb_zcl_wwah_new_debug_report_notification_t;

#define ZB_ZCL_WWAH_NEW_DEBUG_REPORT_NOTIFICATION_PAYLOAD_LEN (sizeof(zb_zcl_wwah_new_debug_report_notification_t))
/*!
  @brief Parses New Debug Report Notification command and fills data request structure.
  @param data_buf - pointer to zb_buf_t buffer containing command request data
  @param req - variable to save command request
  @param status - success or not read parameters - ZB_TRUE or ZB_FALSE
  @note data_buf buffer should contain command request payload without ZCL header.
*/
#define ZB_ZCL_WWAH_GET_NEW_DEBUG_REPORT_NOTIFICATION(data_buf, req, status)            \
{                                                                                       \
  zb_zcl_wwah_new_debug_report_notification_t *req_ptr =                                \
     zb_buf_len(data_buf) >= ZB_ZCL_WWAH_NEW_DEBUG_REPORT_NOTIFICATION_PAYLOAD_LEN ?    \
         (zb_zcl_wwah_new_debug_report_notification_t*)zb_buf_begin(data_buf) : NULL;   \
  if (req_ptr)                                                                          \
  {                                                                                     \
    ZB_MEMCPY(&(req), req_ptr, ZB_ZCL_WWAH_NEW_DEBUG_REPORT_NOTIFICATION_PAYLOAD_LEN);  \
    status = ZB_ZCL_PARSE_STATUS_SUCCESS;                                               \
  }                                                                                     \
  else                                                                                  \
  {                                                                                     \
    status = ZB_ZCL_PARSE_STATUS_FAILURE;                                               \
  }                                                                                     \
}

/** @brief Debug Report Query Response command structure */
typedef ZB_PACKED_PRE struct zb_zcl_wwah_debug_report_query_response_s
{
  zb_uint8_t debug_report_id;  /**< Debug Report ID */
  zb_uint8_t *report_data;  /**< Report data */
}
ZB_PACKED_STRUCT
zb_zcl_wwah_debug_report_query_response_t;

/*!
  @brief Parses Debug Report Query Response command and fills data request structure.
  @param data_buf - pointer to zb_buf_t buffer containing command request data
  @param req - variable to save command request
  @param status - success or not read parameters - ZB_TRUE or ZB_FALSE
  @note data_buf buffer should contain command request payload without ZCL header.
*/
#define ZB_ZCL_WWAH_GET_DEBUG_REPORT_QUERY_RESPONSE(data_buf, req, status)                     \
{                                                                                              \
  zb_zcl_wwah_debug_report_query_response_t *src_ptr =                                         \
    (zb_zcl_wwah_debug_report_query_response_t*)zb_buf_begin((data_buf));                      \
  (status) = ZB_ZCL_PARSE_STATUS_FAILURE;                                                      \
  if (zb_buf_len((data_buf)) > sizeof(zb_uint8_t))                                             \
  {                                                                                            \
    (req)->debug_report_id = src_ptr->debug_report_id;                                         \
    (req)->report_data = (zb_uint8_t*)(&(src_ptr->report_data));                               \
    (status) = ZB_ZCL_PARSE_STATUS_SUCCESS;                                                    \
  }                                                                                            \
}

/*! @brief Structure saved all WWAH attributes */
typedef struct zb_zcl_wwah_attr_s
{
  zb_uint16_t cluster_revision;
  zb_bool_t disable_ota_downgrades;
  zb_bool_t mgmt_leave_without_rejoin_enabled;
  zb_uint8_t nwk_retry_count;
  zb_uint8_t mac_retry_count;
  zb_bool_t router_check_in_enabled;
  zb_bool_t touchlink_interpan_enabled;
  zb_bool_t wwah_parent_classification_enabled;
  zb_bool_t wwah_app_event_retry_enabled;
  zb_uint8_t wwah_app_event_retry_queue_size;
  zb_bool_t wwah_rejoin_enabled;
  zb_uint8_t mac_poll_failure_wait_time;
  zb_bool_t configuration_mode_enabled;
  zb_uint8_t current_debug_report_id;
  zb_bool_t tc_security_on_nwk_key_rotation_enabled;
  zb_bool_t wwah_bad_parent_recovery_enabled;
  zb_uint8_t pending_network_update_channel;
  zb_uint16_t pending_network_update_panid;
  zb_uint16_t ota_max_offline_duration;
} zb_zcl_wwah_attr_t;

extern zb_zcl_wwah_attr_t wwah_attr;

/** @internal @brief Declare attribute list for WWAH cluster
    @param attr_list - attribute list name
*/

#define ZB_ZCL_DECLARE_WWAH_ATTRIB_LIST(attr_list)  \
  zb_zcl_attr_t attr_list [] = {                    \
  {                                                 \
    ZB_ZCL_ATTR_GLOBAL_CLUSTER_REVISION_ID,         \
    ZB_ZCL_ATTR_TYPE_U16,                           \
    ZB_ZCL_ATTR_ACCESS_READ_ONLY,                   \
    (ZB_ZCL_NON_MANUFACTURER_SPECIFIC),             \
    (void*) &(wwah_attr.cluster_revision)           \
  },                                                \
  ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_WWAH_DISABLE_OTA_DOWNGRADES_ID, &(wwah_attr.disable_ota_downgrades)) \
  ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_WWAH_MGMT_LEAVE_WITHOUT_REJOIN_ENABLED_ID, &(wwah_attr.mgmt_leave_without_rejoin_enabled)) \
  ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_WWAH_NWK_RETRY_COUNT_ID, &(wwah_attr.nwk_retry_count)) \
  ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_WWAH_MAC_RETRY_COUNT_ID, &(wwah_attr.mac_retry_count)) \
  ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_WWAH_ROUTER_CHECK_IN_ENABLED_ID, &(wwah_attr.router_check_in_enabled)) \
  ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_WWAH_TOUCHLINK_INTERPAN_ENABLED_ID, &(wwah_attr.touchlink_interpan_enabled)) \
  ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_WWAH_WWAH_PARENT_CLASSIFICATION_ENABLED_ID, &(wwah_attr.wwah_parent_classification_enabled)) \
  ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_WWAH_WWAH_APP_EVENT_RETRY_ENABLED_ID, &(wwah_attr.wwah_app_event_retry_enabled)) \
  ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_WWAH_WWAH_APP_EVENT_RETRY_QUEUE_SIZE_ID, &(wwah_attr.wwah_app_event_retry_queue_size)) \
  ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_WWAH_WWAH_REJOIN_ENABLED_ID, &(wwah_attr.wwah_rejoin_enabled)) \
  ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_WWAH_MAC_POLL_FAILURE_WAIT_TIME_ID, &(wwah_attr.mac_poll_failure_wait_time)) \
  ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_WWAH_CONFIGURATION_MODE_ENABLED_ID, &(wwah_attr.configuration_mode_enabled)) \
  ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_WWAH_CURRENT_DEBUG_REPORT_ID_ID, &(wwah_attr.current_debug_report_id)) \
  ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_WWAH_TC_SECURITY_ON_NWK_KEY_ROTATION_ENABLED_ID, &(wwah_attr.tc_security_on_nwk_key_rotation_enabled)) \
  ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_WWAH_WWAH_BAD_PARENT_RECOVERY_ENABLED_ID, &(wwah_attr.wwah_bad_parent_recovery_enabled)) \
  ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_WWAH_PENDING_NETWORK_UPDATE_CHANNEL_ID, &(wwah_attr.pending_network_update_channel)) \
  ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_WWAH_PENDING_NETWORK_UPDATE_PANID_ID, &(wwah_attr.pending_network_update_panid)) \
  ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_WWAH_OTA_MAX_OFFLINE_DURATION_ID, &(wwah_attr.ota_max_offline_duration)) \
  ZB_ZCL_FINISH_DECLARE_ATTRIB_LIST

  /* Declare Cluster Revision Attribute */
#define ZB_ZCL_DECLARE_WWAH_CLIENT_ATTRIB_LIST(attr_list) \
  ZB_ZCL_START_DECLARE_ATTRIB_LIST_CLUSTER_REVISION(attr_list, ZB_ZCL_WWAH)      \
  ZB_ZCL_FINISH_DECLARE_ATTRIB_LIST                \

/*! @internal Number of attributes mandatory for reporting in WWAH cluster */
#define ZB_ZCL_WWAH_REPORT_ATTR_COUNT 0

/***************************** commands *****************************/

/** @internal Structure for beaconSurvey data type
 */

/**
 *  @brief Determine a parent choose priority (WWAH-Requirements C-20)
 *
 *  End Devices examine all beacons in the Good Link Quality group
 *  (if received beacon with an RSSI above @see minRssiForReceivingPackets
 *  +30 dbm) and choose the parent with highest parent priority, as shown below.
 *  If no suitable parents exist in the Good Link Quality group, then the End
 *  Device shall examine all beacons in the Marginal Link Quality group.
 */
typedef enum zb_zcl_wwah_parent_priority_e
{
  /*! Invalid value for parent priority */
  ZB_ZCL_WWAH_PARENT_PRIORITY_INVALID   = 0,

  /*! 0b00 - no TC connectivity and Short Uptime or no WWAH parent */
  ZB_ZCL_WWAH_PARENT_PRIORITY_VERY_LOW  = 1,

  /*! 0b01 - no TC connectivity and Long Uptime */
  ZB_ZCL_WWAH_PARENT_PRIORITY_LOW       = 2,

  /*! 0b10 - TC connectivity and Short Uptime */
  ZB_ZCL_WWAH_PARENT_PRIORITY_HIGH      = 3,

  /*! 0b11 - TC connectivity and Long Uptime */
  ZB_ZCL_WWAH_PARENT_PRIORITY_VERY_HIGH = 4
}
zb_zcl_wwah_parent_priority_t;

typedef ZB_PACKED_PRE struct zb_zcl_wwah_beacon_survey_s
{
  /*! The DeviceShort field contains the 16 bit short address of the beaconing device. */
  zb_uint16_t device_short;
  /*! This is the RSSI of the beacon, expressed in dBm. */
  zb_int8_t rssi;
  /*! This is the parent classification mask. */
  zb_uint8_t classification_mask;
} ZB_PACKED_STRUCT zb_zcl_wwah_beacon_survey_t;

/*! @brief The PowerNotificationReason field is an enum containing all possible reasons for the power notification.
 */
enum zb_zcl_wwah_power_notification_reason_e
{
  /*! Unknown value */
  ZB_ZCL_WWAH_POWER_NOTIFICATION_REASON_UNKNOWN                 = 0x00,
  /*! Battery value */
  ZB_ZCL_WWAH_POWER_NOTIFICATION_REASON_BATTERY                 = 0x01,
  /*! Brownout value */
  ZB_ZCL_WWAH_POWER_NOTIFICATION_REASON_BROWNOUT                = 0x02,
  /*! Watchdog value */
  ZB_ZCL_WWAH_POWER_NOTIFICATION_REASON_WATCHDOG                = 0x03,
  /*! Reset Pin value */
  ZB_ZCL_WWAH_POWER_NOTIFICATION_REASON_RESET_PIN               = 0x04,
  /*! Memory/HW Fault value */
  ZB_ZCL_WWAH_POWER_NOTIFICATION_REASON_MEMORY_OR_HW_FAULT      = 0x05,
  /*! Software Exception value */
  ZB_ZCL_WWAH_POWER_NOTIFICATION_REASON_SOFTWARE_EXCEPTION      = 0x06,
  /*! OTA / Bootload Success value */
  ZB_ZCL_WWAH_POWER_NOTIFICATION_REASON_OTA_OR_BOOTLOAD_SUCCESS = 0x07,
  /*! Software Reset value */
  ZB_ZCL_WWAH_POWER_NOTIFICATION_REASON_SOFTWARE_RESET          = 0x08,
  /*! Power Button value */
  ZB_ZCL_WWAH_POWER_NOTIFICATION_REASON_POWER_BUTTON            = 0x09,
  /*! Temperature value */
  ZB_ZCL_WWAH_POWER_NOTIFICATION_REASON_TEMPERATURE             = 0x0A,
  /*! Bootload Failure value */
  ZB_ZCL_WWAH_POWER_NOTIFICATION_REASON_BOOTLOAD_FAILURE        = 0x0B,
};

/*! @brief The Enrollment Mode field is an enum containing the possible enrollment methods for an IAS Zone server.
 */


enum zb_zcl_wwah_enrollment_mode_e
{
  /*! Trip-to-pair value */
  ZB_ZCL_WWAH_ENROLLMENT_MODE_TRIP_TO_PAIR         = 0x00,
  /*! Auto-Enroll-Response value */
  ZB_ZCL_WWAH_ENROLLMENT_MODE_AUTO_ENROLL_RESPONSE = 0x01,
  /*! Auto-Enroll-Request value */
  ZB_ZCL_WWAH_ENROLLMENT_MODE_AUTO_ENROLL_REQUEST  = 0x02
};

/*! @}
    @endcond */ /* WWAH cluster internals */

/*! @} */ /* ZCL WWAH cluster definitions */

/*! @brief Add cluster_id to Enable APS Link Key Authorization command
    @param ptr - [in/out] (zb_uint8_t*) current position
    @param cluster_id - Cluster ID value
*/
#define ZB_ZCL_WWAH_SEND_ENABLE_APS_LINK_KEY_AUTHORIZATION_ADD(ptr, cluster_id)       \
{                                                                                     \
   ZB_ZCL_PACKET_PUT_DATA16(ptr, (cluster_id));                                       \
}

/*! @brief Start Enable APS Link Key Authorization command
    @param buffer - to put packet to
    @param def_resp - enable/disable default response
    @param number_of_clusters_to_exempt - Number of Clusters To Exempt value
    @param ptr - [out] (zb_uint8_t*) current position for ZB_ZCL_WWAH_SEND_ENABLE_APS_LINK_KEY_AUTHORIZATION_ADD
*/
#define ZB_ZCL_WWAH_SEND_ENABLE_APS_LINK_KEY_AUTHORIZATION_START(                     \
  buffer, def_resp, number_of_clusters_to_exempt, ptr)                                \
{                                                                                     \
  ptr = ZB_ZCL_START_PACKET(buffer);                                                  \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_ENABLE_APS_LINK_KEY_AUTHORIZATION_ID);                            \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (number_of_clusters_to_exempt));                       \
}

/*! @brief End form Enable APS Link Key Authorization command
    @param ptr - (zb_uint8_t*) current position
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_ENABLE_APS_LINK_KEY_AUTHORIZATION_END(                       \
  ptr, buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, cb)                          \
{                                                                                     \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Start Disable APS Link Key Authorization command
    @param buffer - to put packet to
    @param def_resp - enable/disable default response
    @param number_of_clusters_to_exempt - Number of Clusters To Exempt value
    @param ptr - [out] (zb_uint8_t*) current position for ZB_ZCL_WWAH_SEND_DISABLE_APS_LINK_KEY_AUTHORIZATION_ADD
*/
#define ZB_ZCL_WWAH_SEND_DISABLE_APS_LINK_KEY_AUTHORIZATION_START(                    \
  buffer, def_resp, number_of_clusters_to_exempt, ptr)                                \
{                                                                                     \
  ptr = ZB_ZCL_START_PACKET(buffer);                                                  \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_DISABLE_APS_LINK_KEY_AUTHORIZATION_ID);                           \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (number_of_clusters_to_exempt));                       \
}

/*! @brief Add cluster_id to Disable APS Link Key Authorization command
    @param ptr - [in/out] (zb_uint8_t*) current position
    @param cluster_id - Cluster ID value
*/
#define ZB_ZCL_WWAH_SEND_DISABLE_APS_LINK_KEY_AUTHORIZATION_ADD(ptr, cluster_id)      \
{                                                                                     \
   ZB_ZCL_PACKET_PUT_DATA16(ptr, (cluster_id));                                       \
}

/*! @brief End form Disable APS Link Key Authorization command
    @param ptr - (zb_uint8_t*) current position
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_DISABLE_APS_LINK_KEY_AUTHORIZATION_END(                      \
  ptr, buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, cb)                          \
{                                                                                     \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send APS Link Key Authorization Query command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
    @param cluster_id - Cluster ID value*/
#define ZB_ZCL_WWAH_SEND_APS_LINK_KEY_AUTHORIZATION_QUERY(                            \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb, cluster_id)         \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_APS_LINK_KEY_AUTHORIZATION_QUERY_ID);                             \
  ZB_ZCL_PACKET_PUT_DATA16(ptr, (cluster_id));                                        \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Request New APS Link Key command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_REQUEST_NEW_APS_LINK_KEY(                                    \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_REQUEST_NEW_APS_LINK_KEY_ID);                                     \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Enable WWAH App Event Retry Algorithm command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
    @param first_backoff_time_in_seconds - First Backoff Time In Seconds value
    @param backoff_sequence_common_ratio - Backoff Sequence Common Ratio value
    @param max_backoff_time_in_seconds - Max Backoff Time In Seconds value
    @param max_re_delivery_attempts - Max Re_Delivery Attempts value*/
#define ZB_ZCL_WWAH_SEND_ENABLE_WWAH_APP_EVENT_RETRY_ALGORITHM(                       \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb,                     \
  first_backoff_time_in_seconds, backoff_sequence_common_ratio,                       \
  max_backoff_time_in_seconds, max_re_delivery_attempts)                              \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_ENABLE_WWAH_APP_EVENT_RETRY_ALGORITHM_ID);                        \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (first_backoff_time_in_seconds));                      \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (backoff_sequence_common_ratio));                      \
  ZB_ZCL_PACKET_PUT_DATA32(ptr, (max_backoff_time_in_seconds));                       \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (max_re_delivery_attempts));                           \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Disable WWAH App Event Retry Algorithm command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_DISABLE_WWAH_APP_EVENT_RETRY_ALGORITHM(                      \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_DISABLE_WWAH_APP_EVENT_RETRY_ALGORITHM_ID);                       \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Request Time command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_REQUEST_TIME(                                                \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_REQUEST_TIME_ID);                                                 \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Enable WWAH Rejoin Algorithm command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
    @param fast_rejoin_timeout_in_seconds - Fast Rejoin Timeout In Seconds value
    @param duration_between_each_rejoin_in_seconds - Duration Between Each Rejoin In Seconds value
    @param fast_rejoin_first_backoff_in_seconds - Fast Rejoin First Backoff In Seconds value
    @param max_backoff_time_in_seconds - Max Backoff Time In Seconds value
    @param max_backoff_iterations - max backoff iterations*/
#define ZB_ZCL_WWAH_SEND_ENABLE_WWAH_REJOIN_ALGORITHM(                                \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb,                     \
  fast_rejoin_timeout_in_seconds, duration_between_each_rejoin_in_seconds,            \
  fast_rejoin_first_backoff_in_seconds, max_backoff_time_in_seconds,                  \
  max_backoff_iterations)                                                             \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_ENABLE_WWAH_REJOIN_ALGORITHM_ID);                                 \
  ZB_ZCL_PACKET_PUT_DATA16(ptr, (fast_rejoin_timeout_in_seconds));                    \
  ZB_ZCL_PACKET_PUT_DATA16(ptr, (duration_between_each_rejoin_in_seconds));           \
  ZB_ZCL_PACKET_PUT_DATA16(ptr, (fast_rejoin_first_backoff_in_seconds));              \
  ZB_ZCL_PACKET_PUT_DATA16(ptr, (max_backoff_time_in_seconds));                       \
  ZB_ZCL_PACKET_PUT_DATA16(ptr, (max_backoff_iterations));                            \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Disable WWAH Rejoin Algorithm command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_DISABLE_WWAH_REJOIN_ALGORITHM(                               \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_DISABLE_WWAH_REJOIN_ALGORITHM_ID);                                \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Set IAS Zone Enrollment Method command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
    @param enrollment_mode - Enrollment Mode value*/
#define ZB_ZCL_WWAH_SEND_SET_IAS_ZONE_ENROLLMENT_METHOD(                              \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb, enrollment_mode)    \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_SET_IAS_ZONE_ENROLLMENT_METHOD_ID);                               \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (enrollment_mode));                                    \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Clear Binding Table command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_CLEAR_BINDING_TABLE(                                         \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_CLEAR_BINDING_TABLE_ID);                                          \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Enable Periodic Router Check Ins command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
    @param check_in_interval - Check_In Interval value*/
#define ZB_ZCL_WWAH_SEND_ENABLE_PERIODIC_ROUTER_CHECK_INS(                            \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb, check_in_interval)  \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_ENABLE_PERIODIC_ROUTER_CHECK_INS_ID);                             \
  ZB_ZCL_PACKET_PUT_DATA16(ptr, (check_in_interval));                                 \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Disable Periodic Router Check Ins command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_DISABLE_PERIODIC_ROUTER_CHECK_INS(                           \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_DISABLE_PERIODIC_ROUTER_CHECK_INS_ID);                            \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Set MAC Poll CCA Wait Time command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
    @param wait_time - Wait Time value*/
#define ZB_ZCL_WWAH_SEND_SET_MAC_POLL_CCA_WAIT_TIME(                                  \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb, wait_time)          \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_SET_MAC_POLL_CCA_WAIT_TIME_ID);                                   \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (wait_time));                                          \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Set Pending Network Update command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
    @param channel - Channel value
    @param pan_id - PAN ID value*/
#define ZB_ZCL_WWAH_SEND_SET_PENDING_NETWORK_UPDATE(                                  \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb, channel, pan_id)    \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_SET_PENDING_NETWORK_UPDATE_ID);                                   \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (channel));                                            \
  ZB_ZCL_PACKET_PUT_DATA16(ptr, (pan_id));                                            \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Add cluster_id to Require APS ACKs on Unicasts command
    @param ptr - [in/out] (zb_uint8_t*) current position
    @param cluster_id - Cluster ID value
*/
#define ZB_ZCL_WWAH_SEND_REQUIRE_APS_ACKS_ON_UNICASTS_ADD(ptr, cluster_id)            \
{                                                                                     \
   ZB_ZCL_PACKET_PUT_DATA16(ptr, (cluster_id));                                       \
}

/*! @brief Start Require APS ACKs on Unicasts command
    @param buffer - to put packet to
    @param def_resp - enable/disable default response
    @param number_of_clusters_to_exempt - Number of Clusters to Exempt value
    @param ptr - [out] (zb_uint8_t*) current position for ZB_ZCL_WWAH_SEND_REQUIRE_APS_ACKS_ON_UNICASTS_ADD
*/
#define ZB_ZCL_WWAH_SEND_REQUIRE_APS_ACKS_ON_UNICASTS_START(                          \
  buffer, def_resp, number_of_clusters_to_exempt, ptr)                                \
{                                                                                     \
  ptr = ZB_ZCL_START_PACKET(buffer);                                                  \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_REQUIRE_APS_ACKS_ON_UNICASTS_ID);                                 \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (number_of_clusters_to_exempt));                       \
}

/*! @brief End form Require APS ACKs on Unicasts command
    @param ptr - (zb_uint8_t*) current position
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_REQUIRE_APS_ACKS_ON_UNICASTS_END(                            \
  ptr, buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, cb)                          \
{                                                                                     \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Remove APS ACKs on Unicasts Requirement command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_REMOVE_APS_ACKS_ON_UNICASTS_REQUIREMENT(                     \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_REMOVE_APS_ACKS_ON_UNICASTS_REQUIREMENT_ID);                      \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send APS ACK Requirement Query command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_APS_ACK_REQUIREMENT_QUERY(                                   \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_APS_ACK_REQUIREMENT_QUERY_ID);                                    \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Debug Report Query command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
    @param debug_report_id - Debug Report ID value*/
#define ZB_ZCL_WWAH_SEND_DEBUG_REPORT_QUERY(                                          \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb, debug_report_id)    \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_DEBUG_REPORT_QUERY_ID);                                           \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (debug_report_id));                                    \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Survey Beacons command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
    @param standard_beacons - Standard Beacons value*/
#define ZB_ZCL_WWAH_SEND_SURVEY_BEACONS(                                              \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb, standard_beacons)   \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_SURVEY_BEACONS_ID);                                               \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (standard_beacons));                                   \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Disable OTA Downgrades command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_DISABLE_OTA_DOWNGRADES(                                      \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_DISABLE_OTA_DOWNGRADES_ID);                                       \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Disable MGMT Leave Without Rejoin command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_DISABLE_MGMT_LEAVE_WITHOUT_REJOIN(                           \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_DISABLE_MGMT_LEAVE_WITHOUT_REJOIN_ID);                            \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Disable Touchlink Interpan Message Support command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_DISABLE_TOUCHLINK_INTERPAN_MESSAGE_SUPPORT(                  \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_DISABLE_TOUCHLINK_INTERPAN_MESSAGE_SUPPORT_ID);                   \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Enable WWAH Parent Classification command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_ENABLE_WWAH_PARENT_CLASSIFICATION(                           \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_ENABLE_WWAH_PARENT_CLASSIFICATION_ID);                            \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}
/*! @brief Send Disable WWAH Parent Classification command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_DISABLE_WWAH_PARENT_CLASSIFICATION(                          \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_DISABLE_WWAH_PARENT_CLASSIFICATION_ID);                           \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Enable TC Security On NWK Key Rotation command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_ENABLE_TC_SECURITY_ON_NWK_KEY_ROTATION(                      \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_ENABLE_TC_SECURITY_ON_NWK_KEY_ROTATION_ID);                       \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}
/*! @brief Send Enable WWAH Bad Parent Recovery command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_ENABLE_WWAH_BAD_PARENT_RECOVERY(                             \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_ENABLE_WWAH_BAD_PARENT_RECOVERY_ID);                              \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Disable WWAH Bad Parent Recovery command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_DISABLE_WWAH_BAD_PARENT_RECOVERY(                            \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_DISABLE_WWAH_BAD_PARENT_RECOVERY_ID);                             \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Enable Configuration Mode command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_ENABLE_CONFIGURATION_MODE(                                   \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_ENABLE_CONFIGURATION_MODE_ID);                                    \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Disable Configuration Mode command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_DISABLE_CONFIGURATION_MODE(                                  \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_DISABLE_CONFIGURATION_MODE_ID);                                   \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Add cluster_id to Use Trust Center for Cluster command
    @param ptr - [in/out] (zb_uint8_t*) current position
    @param cluster_id - Cluster ID value
*/
#define ZB_ZCL_WWAH_SEND_USE_TRUST_CENTER_FOR_CLUSTER_ADD(ptr, cluster_id)            \
{                                                                                     \
   ZB_ZCL_PACKET_PUT_DATA16(ptr, (cluster_id));                                       \
}

/*! @brief Start Use Trust Center for Cluster command
    @param buffer - to put packet to
    @param def_resp - enable/disable default response
    @param number_of_clusters - Number of Clusters value
    @param ptr - [out] (zb_uint8_t*) current position for ZB_ZCL_WWAH_SEND_USE_TRUST_CENTER_FOR_CLUSTER_ADD
*/
#define ZB_ZCL_WWAH_SEND_USE_TRUST_CENTER_FOR_CLUSTER_START(                          \
  buffer, def_resp, number_of_clusters, ptr)                                          \
{                                                                                     \
  ptr = ZB_ZCL_START_PACKET(buffer);                                                  \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_USE_TRUST_CENTER_FOR_CLUSTER_ID);                                 \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (number_of_clusters));                                 \
}

/*! @brief End form Use Trust Center for Cluster command
    @param ptr - (zb_uint8_t*) current position
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_USE_TRUST_CENTER_FOR_CLUSTER_END(                            \
  ptr, buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, cb)                          \
{                                                                                     \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Trust Center for Cluster Server Query command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param def_resp - enable/disable default response
    @param cb - callback for getting command send status
*/
#define ZB_ZCL_WWAH_SEND_TRUST_CENTER_FOR_CLUSTER_SERVER_QUERY(                       \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, def_resp, cb)                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL_A(ptr,                          \
    ZB_ZCL_FRAME_DIRECTION_TO_SRV, ZB_ZCL_MANUFACTURER_SPECIFIC, def_resp);           \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_TRUST_CENTER_FOR_CLUSTER_SERVER_QUERY_ID);                        \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send APS Link Key Authorization Query Response command
    @param buffer - to put packet to
    @param seq - sequence
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param cb - callback for getting command send status
    @param cluster_id - Cluster ID value
    @param aps_link_key_authorization_status - APS Link Key Authorization Status value*/
#define ZB_ZCL_WWAH_SEND_APS_LINK_KEY_AUTHORIZATION_QUERY_RESPONSE(                   \
  buffer, seq, addr, dst_addr_mode, dst_ep, ep, prfl_id, cb, cluster_id,              \
  aps_link_key_authorization_status)                                                  \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_RESP_FRAME_CONTROL_A(ptr,                         \
    ZB_ZCL_FRAME_DIRECTION_TO_CLI, ZB_ZCL_MANUFACTURER_SPECIFIC);                     \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, (seq),                                     \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_APS_LINK_KEY_AUTHORIZATION_QUERY_RESPONSE_ID);                    \
  ZB_ZCL_PACKET_PUT_DATA16(ptr, (cluster_id));                                        \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (aps_link_key_authorization_status));                  \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Powering Off Notification command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param cb - callback for getting command send status
    @param power_notification_reason - PowerNotificationReason value
    @param manufacturer_id - Manufacturer ID value
    @param manufacturer_power_notification_reason_length - Manufacturer Power Notification Reason Length value
    @param manufacturer_power_notification_reason - Manufacturer Power Notification Reason value*/
#define ZB_ZCL_WWAH_SEND_POWERING_OFF_NOTIFICATION(                                   \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, cb,                               \
  power_notification_reason, manufacturer_id,                                         \
  manufacturer_power_notification_reason_length,                                      \
  manufacturer_power_notification_reason)                                             \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_RESP_FRAME_CONTROL_A(ptr,                         \
    ZB_ZCL_FRAME_DIRECTION_TO_CLI, ZB_ZCL_MANUFACTURER_SPECIFIC);                     \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_POWERING_OFF_NOTIFICATION_ID);                                    \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (power_notification_reason));                          \
  ZB_ZCL_PACKET_PUT_DATA16(ptr, (manufacturer_id));                                   \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (manufacturer_power_notification_reason_length));      \
  ZB_ZCL_PACKET_PUT_DATA_N(ptr, (manufacturer_power_notification_reason),             \
    (manufacturer_power_notification_reason_length));                                 \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Powering On Notification command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param cb - callback for getting command send status
    @param power_notification_reason - PowerNotificationReason value
    @param manufacturer_id - Manufacturer ID value
    @param manufacturer_power_notification_reason_length - Manufacturer Power Notification Reason Length value
    @param manufacturer_power_notification_reason - Manufacturer Power Notification Reason value*/
#define ZB_ZCL_WWAH_SEND_POWERING_ON_NOTIFICATION(                                    \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, cb,                               \
  power_notification_reason, manufacturer_id,                                         \
  manufacturer_power_notification_reason_length,                                      \
  manufacturer_power_notification_reason)                                             \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_RESP_FRAME_CONTROL_A(ptr,                         \
    ZB_ZCL_FRAME_DIRECTION_TO_CLI, ZB_ZCL_MANUFACTURER_SPECIFIC);                     \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_POWERING_ON_NOTIFICATION_ID);                                     \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (power_notification_reason));                          \
  ZB_ZCL_PACKET_PUT_DATA16(ptr, (manufacturer_id));                                   \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (manufacturer_power_notification_reason_length));      \
  ZB_ZCL_PACKET_PUT_DATA_N(ptr, (manufacturer_power_notification_reason),             \
    (manufacturer_power_notification_reason_length));                                 \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Short Address Change command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param cb - callback for getting command send status
    @param device_eui64 - DeviceEUI64 value
    @param device_short - DeviceShort value*/
#define ZB_ZCL_WWAH_SEND_SHORT_ADDRESS_CHANGE(                                        \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, cb, device_eui64, device_short)   \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_RESP_FRAME_CONTROL_A(ptr,                         \
    ZB_ZCL_FRAME_DIRECTION_TO_CLI, ZB_ZCL_MANUFACTURER_SPECIFIC);                     \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_SHORT_ADDRESS_CHANGE_ID);                                         \
  ZB_ZCL_PACKET_PUT_DATA64(ptr, (device_eui64));                                      \
  ZB_ZCL_PACKET_PUT_DATA16(ptr, (device_short));                                      \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Add cluster_id to APS ACK Requirement Query Response command
    @param ptr - [in/out] (zb_uint8_t*) current position
    @param cluster_id - Cluster ID value
*/
#define ZB_ZCL_WWAH_SEND_APS_ACK_REQUIREMENT_QUERY_RESPONSE_ADD(ptr, cluster_id)      \
{                                                                                     \
   ZB_ZCL_PACKET_PUT_DATA16(ptr, (cluster_id));                                       \
}

/*! @brief Start APS ACK Requirement Query Response command
    @param buffer - to put packet to
    @param seq - sequence
    @param number_of_clusters_to_exempt - Number of Clusters to Exempt value
    @param ptr - [out] (zb_uint8_t*) current position for ZB_ZCL_WWAH_SEND_APS_ACK_REQUIREMENT_QUERY_RESPONSE_ADD
*/
#define ZB_ZCL_WWAH_SEND_APS_ACK_REQUIREMENT_QUERY_RESPONSE_START(                    \
  buffer, seq, number_of_clusters_to_exempt, ptr)                                     \
{                                                                                     \
  (ptr) = ZB_ZCL_START_PACKET(buffer);                                                \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_RESP_FRAME_CONTROL_A(ptr,                         \
    ZB_ZCL_FRAME_DIRECTION_TO_CLI, ZB_ZCL_MANUFACTURER_SPECIFIC);                     \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, (seq),                                     \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_APS_ACK_REQUIREMENT_QUERY_RESPONSE_ID);                           \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (number_of_clusters_to_exempt));                       \
}

/*! @brief End form APS ACK Requirement Query Response command
    @param ptr - (zb_uint8_t*) current position
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
*/
#define ZB_ZCL_WWAH_SEND_APS_ACK_REQUIREMENT_QUERY_RESPONSE_END(                      \
  ptr, buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id)                              \
{                                                                                     \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, NULL);  \
}

/*! @brief Send Power Descriptor Change command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param cb - callback for getting command send status
    @param node_power_desc - Node Power Descriptor value */
#define ZB_ZCL_WWAH_SEND_POWER_DESCRIPTOR_CHANGE(                                     \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, cb, node_power_desc)              \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_RESP_FRAME_CONTROL_A(ptr,                         \
    ZB_ZCL_FRAME_DIRECTION_TO_CLI, ZB_ZCL_MANUFACTURER_SPECIFIC);                     \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_POWER_DESCRIPTOR_CHANGE_ID);                                      \
  ZB_ZCL_PACKET_PUT_DATA16(ptr, (node_power_desc));                                   \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send New Debug Report Notification command
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param cb - callback for getting command send status
    @param debug_report_id - Debug Report ID value
    @param size_of_report - Size of Report value*/
#define ZB_ZCL_WWAH_SEND_NEW_DEBUG_REPORT_NOTIFICATION(                               \
  buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, cb, debug_report_id,              \
  size_of_report)                                                                     \
{                                                                                     \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                      \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_RESP_FRAME_CONTROL_A(ptr,                         \
    ZB_ZCL_FRAME_DIRECTION_TO_CLI, ZB_ZCL_MANUFACTURER_SPECIFIC);                     \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, ZB_ZCL_GET_SEQ_NUM(),                      \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_NEW_DEBUG_REPORT_NOTIFICATION_ID);                                \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (debug_report_id));                                    \
  ZB_ZCL_PACKET_PUT_DATA32(ptr, (size_of_report));                                    \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);    \
}

/*! @brief Send Debug Report Query Response command
    @param buffer - to put packet to
    @param seq - sequence
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
    @param cb - callback for getting command send status
    @param debug_report_id - Debug Report ID value
    @param report_data - Report data value
    @param size_of_report - Report data size */

#define ZB_ZCL_WWAH_SEND_DEBUG_REPORT_QUERY_RESPONSE(                                      \
  buffer, seq, addr, dst_addr_mode, dst_ep, ep, prfl_id, cb, debug_report_id, report_data, \
  size_of_report)                                                                          \
{                                                                                          \
  zb_uint8_t* ptr = ZB_ZCL_START_PACKET(buffer);                                           \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_RESP_FRAME_CONTROL_A(ptr,                              \
    ZB_ZCL_FRAME_DIRECTION_TO_CLI, ZB_ZCL_MANUFACTURER_SPECIFIC);                          \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, (seq),                                          \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                                  \
    ZB_ZCL_CMD_WWAH_DEBUG_REPORT_QUERY_RESPONSE_ID);                                       \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (debug_report_id));                                         \
  ZB_ZCL_PACKET_PUT_DATA_N(ptr, (report_data), (size_of_report));                          \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                        \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                               \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, cb);         \
}

/*! @brief Add cluster_id to Trust Center for Cluster Server Query Response command
    @param ptr - [in/out] (zb_uint8_t*) current position
    @param cluster_id - Cluster ID value
*/
#define ZB_ZCL_WWAH_SEND_TRUST_CENTER_FOR_CLUSTER_SERVER_QUERY_RESPONSE_ADD(ptr, cluster_id) \
{                                                                                            \
   ZB_ZCL_PACKET_PUT_DATA16(ptr, (cluster_id));                                              \
}

/*! @brief Start Trust Center for Cluster Server Query Response command
    @param buffer - to put packet to
    @param seq - sequence
    @param number_of_clusters - Number of Clusters value
    @param ptr - [out] (zb_uint8_t*) current position for ZB_ZCL_WWAH_SEND_TRUST_CENTER_FOR_CLUSTER_SERVER_QUERY_RESPONSE_ADD
*/
#define ZB_ZCL_WWAH_SEND_TRUST_CENTER_FOR_CLUSTER_SERVER_QUERY_RESPONSE_START(        \
  buffer, seq, number_of_clusters, ptr)                                               \
{                                                                                     \
  (ptr) = ZB_ZCL_START_PACKET(buffer);                                                \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_RESP_FRAME_CONTROL_A(ptr,                         \
    ZB_ZCL_FRAME_DIRECTION_TO_CLI, ZB_ZCL_MANUFACTURER_SPECIFIC);                     \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, (seq),                                     \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_TRUST_CENTER_FOR_CLUSTER_SERVER_QUERY_RESPONSE_ID);               \
  ZB_ZCL_PACKET_PUT_DATA8(ptr, (number_of_clusters));                                 \
}

/*! @brief End form Trust Center for Cluster Server Query Response command
    @param ptr - (zb_uint8_t*) current position
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
*/
#define ZB_ZCL_WWAH_SEND_TRUST_CENTER_FOR_CLUSTER_SERVER_QUERY_RESPONSE_END(          \
  ptr, buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id)                              \
{                                                                                     \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, NULL);  \
}

/*! @brief Start Survey Beacons Response command
    @param buffer - to put packet to
    @param seq - sequence
*/
#define ZB_ZCL_WWAH_SEND_SURVEY_BEACONS_RESPONSE_START(                               \
  buffer, seq)                                                                        \
{                                                                                     \
  zb_uint8_t *ptr = zb_buf_begin(buffer);                                             \
  ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_RESP_FRAME_CONTROL_A(ptr,                         \
    ZB_ZCL_FRAME_DIRECTION_TO_CLI, ZB_ZCL_MANUFACTURER_SPECIFIC);                     \
  ZB_ZCL_CONSTRUCT_COMMAND_HEADER_EXT(ptr, (seq),                                     \
    ZB_ZCL_MANUFACTURER_SPECIFIC, WWAH_MANUFACTURER_CODE,                             \
    ZB_ZCL_CMD_WWAH_SURVEY_BEACONS_RESPONSE_ID);                                      \
}

/*! @brief Add beacons number and beacon survey info to Survey Beacons Response command
    @param ptr - [in/out] (zb_uint8_t*) current position
    @param src - source pointer to the first Beacon value
    @param num - number of beacons
*/
#define ZB_ZCL_WWAH_SEND_SURVEY_BEACONS_RESPONSE_ADD_ALL(ptr, src, num)                   \
{                                                                                         \
  ZB_ZCL_PACKET_PUT_DATA8((ptr), (num));                                                  \
  ZB_MEMMOVE((ptr), (src), ((num) * sizeof(zb_zcl_wwah_beacon_survey_t)));                \
  (ptr) += ((num) * sizeof(zb_zcl_wwah_beacon_survey_t));                                 \
}

/*! @brief End form Survey Beacons Response command
    @param ptr - (zb_uint8_t*) current position
    @param buffer - to put packet to
    @param addr - address to send packet to
    @param dst_addr_mode - addressing mode
    @param dst_ep - destination endpoint
    @param ep - sending endpoint
    @param prfl_id - profile identifier
*/
#define ZB_ZCL_WWAH_SEND_SURVEY_BEACONS_RESPONSE_END(                                 \
  ptr, buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id)                              \
{                                                                                     \
  ZB_ZCL_FINISH_PACKET(buffer, ptr)                                                   \
  ZB_ZCL_SEND_COMMAND_SHORT(                                                          \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, ZB_ZCL_CLUSTER_ID_WWAH, NULL);  \
}
zb_bool_t zb_is_wwah_server(void);
void wwah_post_commissioning_actions(void);
zb_bool_t zb_zcl_wwah_check_new_channel(zb_uint32_t new_channel_mask);
zb_bool_t zb_zcl_wwah_check_new_panid(zb_uint16_t new_panid);
zb_uint8_t zb_zcl_wwah_mac_poll_cca_retry_count(void);
zb_time_t zb_zcl_wwah_mac_poll_failure_wait_time(void);
zb_bool_t zb_zcl_wwah_check_if_forced_to_use_tc(zb_uint16_t cluster_id);
zb_bool_t zb_zcl_wwah_check_zdo_command(zb_apsde_data_indication_t *di);
zb_bool_t zb_zcl_wwah_check_if_aps_ack_needed(zb_uint16_t cluster_id);
zb_bool_t zb_zcl_wwah_check_if_aps_link_key_authorization_needed(zb_uint16_t cluster_id);
zb_bool_t zb_zcl_wwah_check_cluster_permission(zb_uint16_t nwk_addr, zb_uint16_t cluster_id);
zb_bool_t zb_zcl_wwah_check_if_leave_without_rejoin_allowed(void);
zb_bool_t zb_zcl_wwah_check_if_wwah_rejoin_enabled(void);
void zb_zcl_wwah_schedule_send_power_descriptor_change(void);
zb_bool_t zb_zcl_wwah_check_zdo_command(zb_apsde_data_indication_t *di);
zb_bool_t zb_zcl_wwah_check_if_interpan_supported(void);
zb_bool_t zb_zcl_wwah_check_if_downgrade_disabled(void);
zb_bool_t zb_zcl_wwah_periodic_checkin_read_attr_handle(zb_uint8_t param);
zb_bool_t zb_zcl_wwah_periodic_checkin_block_zcl_cmd(zb_zcl_parsed_hdr_t *cmd_info);
void zb_zcl_wwah_periodic_checkin_tc_poll(zb_uint8_t param);
void zb_zcl_wwah_periodic_checkin_match_desc_req(zb_uint8_t param);
void zb_zcl_wwah_periodic_checkin_match_desc_req_delayed(zb_uint8_t param);
void zb_zcl_wwah_stop_periodic_checkin(void);
void zb_zcl_wwah_start_periodic_checkin(void);
zb_bool_t zb_zcl_wwah_check_src_addr_for_cluster(zb_uint16_t short_addr, zb_uint16_t cluster_id);

void zb_zcl_wwah_set_wwah_behavior(zb_uint8_t behavior);
void zb_zcl_wwah_stop_bad_parent_recovery(void);
void zb_zcl_wwah_start_bad_parent_recovery(void);

#ifdef ZB_JOIN_CLIENT
zb_ret_t zb_zcl_wwah_get_rejoin_tmo(zb_uint16_t attempt, zb_time_t *tmo);
#endif

/** @endcond */ /* DOXYGEN_ZCL_SECTION */

#define ZB_ZCL_WWAH_REPORT_ATTR_COUNT 0

#if (defined ZB_ZCL_SUPPORT_CLUSTER_WWAH && (defined ZB_ZCL_ENABLE_WWAH_SERVER || defined ZB_ZCL_ENABLE_WWAH_CLIENT))
typedef ZB_PACKED_PRE struct zb_zcl_wwah_context_s
{
  zb_uint8_t wwah_behavior;
#ifdef ZB_ZCL_ENABLE_WWAH_SERVER
  zb_uint8_t wwah_hub_endpoint;
  zb_uint16_t wwah_hub_address;
  zb_uint16_t time_server_addr;
  zb_uint8_t time_server_endpoint;

  zb_uint8_t aps_ack_exempt_table_cnt;
  /* This is a list of clusters that should be exempt from requiring APS ACKs on unicasts. */
  zb_uint16_t aps_ack_exempt_table[ZB_ZCL_WWAH_APS_ACK_EXEMPT_TABLE_SIZE];

  /* ZB_TRUE - enforces that all cluster commands for the cluster have APS level security
   * except for those in the exemption list*/
  /* ZB_FALSE - enforces that all cluster commands for the cluster doesn't have APS level security
   * except for those in the exemption list. This is default value*/
  zb_bool_t aps_link_key_enabled_by_default;

  zb_uint8_t aps_link_key_authorization_table_cnt;
  /* This is a exemption list of clusters for requiring APS level security */
  zb_uint16_t aps_link_key_authorization_table[ZB_ZCL_WWAH_APS_LINK_KEY_AUTHORIZATION_TABLE_SIZE];

  zb_uint8_t use_trust_center_for_cluster_table_cnt;
  /* This is a list of clusters that should be forced to use the Trust Center. */
  zb_uint16_t use_trust_center_for_cluster_table[ZB_ZCL_WWAH_USE_TRUST_CENTER_FOR_CLUSTER_TABLE_SIZE];

  /* ======= Survey Beacon related context ======= */
  zb_uint8_t survey_beacons_seq_number;
  zb_uint8_t survey_beacons_in_progress;

  zb_zcl_wwah_periodic_checkins_data_t periodic_checkins;

  zb_zcl_wwah_enable_wwah_rejoin_algorithm_t rejoin_alg;
  zb_zcl_wwah_bad_parent_recovery_data_t bad_parent_recovery;
#endif
#if !(defined ZB_ZCL_ENABLE_WWAH_SERVER || defined ZB_ZCL_ENABLE_WWAH_CLIENT)
  zb_uint8_t make_iso_compiler_happy;
#endif
} zb_zcl_wwah_context_t;
#endif

#define ZB_ZCL_WWAH_REJOIN_SLEEPY_ED_TIMEOUT (ZB_TIME_ONE_SECOND * 60 * 15)
#define ZB_ZCL_WWAH_REJOIN_NON_SLEEPY_ED_ROUTER_TIMEOUT (ZB_TIME_ONE_SECOND * 60 * 60 * 24)
/* For debug purpose: #define ZB_ZCL_WWAH_REJOIN_NON_SLEEPY_ED_ROUTER_TIMEOUT (ZB_TIME_ONE_SECOND * 60)*/

#define ZB_ZCL_WWAH_BAD_PARENT_RECOVERY_TIMEOUT (ZB_TIME_ONE_SECOND * 60 * 60 * 24)
/* For debug purpose: #define ZB_ZCL_WWAH_BAD_PARENT_RECOVERY_TIMEOUT (ZB_TIME_ONE_SECOND * 30)*/
#define ZB_ZCL_WWAH_BAD_PARENT_RECOVERY_POLL_CONTROL_CHECK_IN_FAILED_CNT 3
/* FIXME: Is it defined somewhere in WWAH spec? */
#define ZB_ZCL_WWAH_BAD_PARENT_RECOVERY_RSSI_IS_GOOD(rssi) (rssi >= -100)
void zb_zcl_wwah_bad_parent_recovery_signal(zb_bufid_t sig);

zb_ret_t zb_zcl_wwah_request_new_aps_link_key_handler(zb_uint8_t param);
zb_ret_t zb_zcl_wwah_enable_wwah_app_event_retry_algorithm_handler(zb_uint8_t param);
zb_ret_t zb_zcl_wwah_disable_wwah_app_event_retry_algorithm_handler(zb_uint8_t param);
zb_ret_t zb_zcl_wwah_request_time_handler(zb_uint8_t param);
zb_ret_t zb_zcl_wwah_enable_wwah_rejoin_algorithm_handler(zb_uint8_t param);
zb_ret_t zb_zcl_wwah_disable_wwah_rejoin_algorithm_handler(zb_uint8_t param);

void zb_zcl_wwah_init_server(void);
void zb_zcl_wwah_init_server_attr(void);
void zb_zcl_wwah_init_client(void);
zb_ret_t zb_zcl_wwah_update_time(zb_uint8_t param);
#define ZB_ZCL_CLUSTER_ID_WWAH_SERVER_ROLE_INIT zb_zcl_wwah_init_server
#define ZB_ZCL_CLUSTER_ID_WWAH_CLIENT_ROLE_INIT zb_zcl_wwah_init_client

#endif /* ZB_ZCL_WWAH_H */
