MeshTalos-Client/managed_components/espressif__esp-zboss-lib/include/zboss_api_aps.h
2025-12-03 14:20:11 +08:00

627 lines
25 KiB
C

/*
* 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: Public APS layer API
*/
#ifndef ZB_ZBOSS_API_APS_H
#define ZB_ZBOSS_API_APS_H 1
/*! \addtogroup aps_api */
/*! @{ */
/** @addtogroup aps_common_constants APS common constants
* @{
*/
#include "zb_config.h"
#include "zb_address.h"
#include "zboss_api_aps_interpan.h"
/**
* @name APS status constants
* @anchor aps_status
*/
/** @{ */
/** A request has been executed successfully. */
#define ZB_APS_STATUS_SUCCESS 0x00U
/** A transmit request failed since the ASDU is too large and fragmentation is not supported.*/
#define ZB_APS_ASDU_TOO_LONG 0xa0U
/** A received fragmented frame could not be defragmented at the current time. */
#define ZB_APS_DEFRAG_DEFERRED 0xa1U
/** A received fragmented frame could not be defragmented since the device does not support
* fragmentation. */
#define ZB_APS_DEFRAG_UNSUPPORTED 0xa2U
/** A parameter value was out of range. */
#define ZB_APS_STATUS_ILLEGAL_REQUEST 0xa3U
/** An APSME-UNBIND.request failed due to the requested binding link not existing in the binding
* table. */
#define ZB_APS_STATUS_INVALID_BINDING 0xa4U
/** An APSME-REMOVE-GROUP.request has been issued with a group identifier that does not appear in
* the group table. */
#define ZB_APS_STATUS_INVALID_GROUP 0xa5U
/** A parameter value was invalid or out of range. */
#define ZB_APS_STATUS_INVALID_PARAMETER 0xa6U
/** An APSDE-DATA.request requesting acknowledged transmission failed due to no acknowledgement
* being received. */
#define ZB_APS_STATUS_NO_ACK 0xa7U
/** An APSDE-DATA.request with a destination addressing mode set to 0x00 failed due to there being
* no devices bound to this device. */
#define ZB_APS_STATUS_NO_BOUND_DEVICE 0xa8U
/** An APSDE-DATA.request with a destination addressing mode set to 0x03 failed due to no
* corresponding short address found in the address map table. */
#define ZB_APS_STATUS_NO_SHORT_ADDRESS 0xa9U
/** An APSDE-DATA.request with a destination addressing mode set to 0x00 failed due to a binding
* table not being supported on the device. */
#define ZB_APS_STATUS_NOT_SUPPORTED 0xaaU
/** An ASDU was received that was secured using a link key. */
#define ZB_APS_STATUS_SECURED_LINK_KEY 0xabU
/** An ASDU was received that was secured using a network key. */
#define ZB_APS_STATUS_SECURED_NWK_KEY 0xacU
/** An APSDE-DATA.request requesting security has resulted in an error during the corresponding
* security processing. */
#define ZB_APS_STATUS_SECURITY_FAIL 0xadU
/** An APSME-BIND.request or APSME.ADD-GROUP.request issued when the binding or group tables,
* respectively, were full. */
#define ZB_APS_STATUS_TABLE_FULL 0xaeU
/** An ASDU was received without any security. */
#define ZB_APS_STATUS_UNSECURED 0xafU
/** An APSME-GET.request or APSME-SET.request has been issued with an unknown attribute identifier.
*/
#define ZB_APS_STATUS_UNSUPPORTED_ATTRIBUTE 0xb0U
/** @} */
/**
* @brief Type for APS status constants
*
* @deprecated holds one of @ref aps_status. Kept only for backward compatibility as
* @ref aps_status were declared previously as enum. Can be removed in future releases.
*/
typedef zb_uint8_t zb_aps_status_t;
/**
* @name APS addressing mode constants
* @anchor aps_addr_mode
*/
/** @{ */
#define ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT 0x00U /*!< DstAddress and DstEndpoint not present */
#define ZB_APS_ADDR_MODE_16_GROUP_ENDP_NOT_PRESENT 0x01U /*!< 16-bit group address for DstAddress; DstEndpoint not present */
#define ZB_APS_ADDR_MODE_16_ENDP_PRESENT 0x02U /*!< 16-bit address for DstAddress and DstEndpoint present */
#define ZB_APS_ADDR_MODE_64_ENDP_PRESENT 0x03U /*!< 64-bit extended address for DstAddress and DstEndpoint present */
#define ZB_APS_ADDR_MODE_BIND_TBL_ID 0x04U /*!< "destination endpoint" is interpreted as an index in the binding table,
all other destination address information is ignored */
/** @} */
/**
* @brief Type for APS addressing mode constants.
*
* Holds one of @ref aps_addr_mode. Kept only for backward compatibility as
* @ref aps_addr_mode were declared previously as enum.
*/
typedef zb_uint8_t zb_aps_addr_mode_t;
/** @brief Minimum valid endpoint number. */
#define ZB_MIN_ENDPOINT_NUMBER 1U
/** @brief Maximum valid endpoint number. */
#define ZB_MAX_ENDPOINT_NUMBER 240U
/** @brief Broadcast endpoint number. */
#define ZB_APS_BROADCAST_ENDPOINT_NUMBER 255U
/** @} */
/** @} */ /* aps_api */
/** @cond internals_doc */
/*! \addtogroup aps_ib */
/*! @{ */
/**
* @name APS Information Base constants
* @anchor aps_aib_attr_id
*/
/** @{ */
/** The current set of binding table entries in the device (@see subclause 2.2.8.2.1). */
#define ZB_APS_AIB_BINDING 0xc1U
/** TRUE if the device should become the Zigbee Coordinator on startupU FALSE if otherwise. */
#define ZB_APS_AIB_DESIGNATED_COORD 0xc2U
/** The list of masks of allowable channels for this device to use for network operations. */
#define ZB_APS_AIB_CHANNEL_MASK_LIST 0xc3U
/** The 64-bit address of a network to form or to join. */
#define ZB_APS_AIB_USE_EXT_PANID 0xc4U
/** The current set of group table entries (@see Table 2.25). */
#define ZB_APS_AIB_GROUP_TABLE 0xc5U
/** The value to be used for the NonmemberRadius parameter when using NWK layer multicast. */
#define ZB_APS_AIB_NONMEMBER_RADIUS 0xc6U
/** The current set of permission configuration items. */
#define ZB_APS_AIB_PERMISSION_CONFIG 0xc7U
/** A flag controlling the use of insecure join at startup. */
#define ZB_APS_AIB_USE_INSECURE_JOIN 0xc8U
/** Fragmentation parameter - the standard delayU in millisecondsU between sending two blocks of a
* fragmented transmission (@see subclause 2.2.8.4.5). */
#define ZB_APS_AIB_INTERFRAME_DELAY 0xc9U
/** The energy measurement for the channel energy scan performed on the previous channel just before
* a channel change (in accordance with [B1]). */
#define ZB_APS_AIB_LAST_CHANNEL_ENERGY 0xcaU
/** The latest percentage of transmission network transmission failures for the previous channel
* just before a channel change (in percentage of failed transmissions to the total number of
* transmissions attempted) */
#define ZB_APS_AIB_LAST_CHANNEL_FAILURE_RATE 0xcbU
/** A countdown timer (in hours) indicating the time to the next permitted frequency agility channel
* change. A value of NULL indicates the channel has not been changed previously. */
#define ZB_APS_AIB_CHANNEL_TIMER 0xccU
/** A table with the active endpoints and their respective apsMaxWin-dowSize where frag-mentation is
* used (active endpoints not supporting fragmentations shall be omitted from the list). */
#define ZB_APS_AIB_MAX_WINDOW_SIZE 0xcdU
/** The value of the current countdown timer before the next Parent_annce is sent. */
#define ZB_APS_AIB_PARENT_ANNOUNCE_TIMER 0xceU
/** @} */
/**
* @brief Type for APS Information Base constants.
*
* Holds one of @ref aps_aib_attr_id. Kept for backward compatibility as
* @ref aps_aib_attr_id were declared previously as enum.
*/
typedef zb_uint8_t zb_aps_aib_attr_id_t;
/*! @} */ /* aps_ib */
/** @endcond */ /* internals_doc */
/** @addtogroup aps_api
* @{
*/
/** @addtogroup aps_data_service APS data service
* @{
*/
/** @brief Parsed APS header.
*/
typedef ZB_PACKED_PRE struct zb_aps_hdr_s
{
/* TODO: rearrange fields to make that structure packet and exclude "packed" attribute. Don't forget to update NCP side. */
zb_uint8_t fc; /*!< Frame control. */
zb_uint16_t src_addr; /*!< Source address of packet originator. */
zb_uint16_t dst_addr; /*!< The destination address of the packet. */
zb_uint16_t group_addr; /*!< If send to group then group address destination else 0. */
zb_uint8_t dst_endpoint; /*!< The destination endpoint of the packet receiver. */
zb_uint8_t src_endpoint; /*!< The source endpoint from which that packet was send. */
zb_uint16_t clusterid; /*!< The identifier of the cluster on the source device. */
zb_uint16_t profileid; /*!< Profile ID */
zb_uint8_t aps_counter; /*!< APS Counter for check APS dup command. */
zb_uint16_t mac_src_addr; /*!< Source address of device that transmit that packet. */
zb_uint16_t mac_dst_addr; /*!< Next hop address used for frame transmission. */
zb_uint8_t lqi;
zb_int8_t rssi;
/* attributes of the key used to unsecure this frame */
zb_bitfield_t aps_key_source:1; /*!< @if ZB_SECUR
* @ref secur_key_sources
* @endif
*/
zb_bitfield_t aps_key_attrs:2; /*!< @if ZB_SECUR
* @ref secur_key_attributes
* @endif
*/
zb_bitfield_t aps_key_from_tc:1; /* Denotes that packet received from TC and properly
* encrypted with TCLK by any appropriate method:
* 1) BDB Request key (with Key Type: TCLK) ->
* Transport Key -> Verify Key
* 2) BDB+SE Mixed CBKE
* 3) SE CBKE */
zb_bitfield_t extended_fc:2;
zb_bitfield_t reserved:2;
#define FIRST_INTERNAL_APSIND_FIELD tsn
zb_uint8_t tsn; /*!< Transaction sequence number for ZDO/ZCL command. */
zb_uint8_t block_num; /*!< Fragmentation: block number. */
zb_uint8_t block_ack; /*!< Fragmentation: block ack. */
zb_uint8_t radius; /*!< radius from nwk header */
zb_uint8_t align[7];
} ZB_PACKED_STRUCT zb_aps_hdr_t;
/**
Parameters of the APSDE-DATA.indication primitive.
Also used as a parameter in different APS calls.
*/
typedef zb_aps_hdr_t zb_apsde_data_indication_t;
ZB_ASSERT_IF_NOT_ALIGNED_TO_16(zb_apsde_data_indication_t);
/** @} */ /* APS data service */
/** @} */
/** @addtogroup aps_api
* @{
*/
/** @addtogroup aps_management_service APS management service
* @{
*/
/**
* @brief APSME binding structure.
*
* This data structure passed to @ref zb_apsme_bind_request()
* and to @ref zb_apsme_unbind_request().
*
* @deprecated Corresponding function @ref zb_apsme_unbind_request() is deprecated and it will be
* moved to the private header in November 2022. Do not use this structure and corresponding function
* in the applications.
*/
typedef struct zb_apsme_binding_req_s
{
zb_ieee_addr_t src_addr; /*!< The source IEEE address for the binding entry. */
zb_uint8_t src_endpoint; /*!< The source endpoint for the binding entry. */
zb_uint16_t clusterid; /*!< The identifier of the cluster on the source
device that is to be bound to the destination device.*/
zb_uint8_t addr_mode; /*!< The type of destination address supplied by
the DstAddr parameter - see @ref aps_addr_mode */
zb_addr_u dst_addr; /*!< The destination address for the binding entry. */
zb_uint8_t dst_endpoint; /*!< This parameter will be present only if
the DstAddrMode parameter has a value of
0x03 and, if present, will be the
destination endpoint for the binding entry.*/
#ifdef SNCP_MODE
zb_uint8_t remote_bind; /*!< Indication if the bind req is local or remote */
zb_uint8_t id; /*!< unique identifier of the entry for NCP, updated only in
zb_apsme_bind_request and zb_apsme_unbind_request and used to
notify NCP */
/* confirm_cb is not sent in payload by NCP, keep it in the end of this structure */
#endif
zb_callback_t confirm_cb; /*!< The callback to be called when the operation is completed. */
} zb_apsme_binding_req_t;
/**
* This data structure passed to @ref zb_zdo_check_binding_request().
*/
typedef struct zb_aps_check_binding_req_s
{
zb_uint8_t src_endpoint; /* a source endpoint, if ZB_ZCL_BROADCAST_ENDPOINT - any endpoint */
zb_uint16_t cluster_id; /* a source cluster ID */
zb_callback_t response_cb;
} zb_aps_check_binding_req_t;
/**
* This data structure passed to callback passed to @ref zb_zdo_check_binding_request().
*/
typedef struct zb_aps_check_binding_resp_s
{
zb_uint8_t src_endpoint; /* a source endpoint from the corresponding request */
zb_uint16_t cluster_id; /* a source cluster ID from the corresponding request */
zb_bool_t exists; /* whether the binding with specified parameters exists */
} zb_aps_check_binding_resp_t;
/** @brief APSME-ADD-GROUP.request primitive parameters, should be passed to @ref zb_zdo_add_group_req() */
typedef struct zb_apsme_add_group_req_s
{
zb_uint16_t group_address; /*!< The 16-bit address of the group being added. */
zb_uint8_t endpoint; /*!< The endpoint to which the given group is being added. */
zb_callback_t confirm_cb; /*!< The callback to be called when the operation is completed. */
} zb_apsme_add_group_req_t;
/** @brief APSME-ADD-GROUP.confirm primitive parameters. */
typedef struct zb_apsme_add_group_conf_s
{
zb_uint16_t group_address; /*!< The 16-bit address of the group being added. */
zb_uint8_t endpoint; /*!< The endpoint to which the given group is being added. */
zb_ret_t status; /*!< Request send status. */
} zb_apsme_add_group_conf_t;
/** @brief APSME-REMOVE-GROUP.request primitive parameters, should be passed to @ref zb_zdo_add_group_req() */
typedef struct zb_apsme_add_group_req_s zb_apsme_remove_group_req_t;
/** @brief APSME-REMOVE-GROUP.confirm primitive parameters. */
typedef struct zb_apsme_add_group_conf_s zb_apsme_remove_group_conf_t;
/** @brief APSME-REMOVE-ALL-GROUPS.request primitive parameters, should be passed to @ref zb_zdo_remove_all_groups_req(). */
typedef struct zb_apsme_remove_all_groups_req_s
{
zb_uint8_t endpoint; /*!< The endpoint to which the given group is being removed. */
zb_callback_t confirm_cb; /*!< The callback to be called when the operation is completed. */
} zb_apsme_remove_all_groups_req_t;
/** @brief APSME-REMOVE-ALL-GROUPS.confirm primitive parameters. */
typedef struct zb_apsme_remove_all_groups_conf_s
{
zb_uint8_t endpoint; /*!< The endpoint which is to be removed from all groups. */
zb_ret_t status; /*!< The status of the request to remove all groups. */
} zb_apsme_remove_all_groups_conf_t;
zb_bool_t zb_aps_is_endpoint_in_group(
zb_uint16_t group_id,
zb_uint8_t endpoint);
/** @cond DOXYGEN_INTERNAL_DOC */
/** @brief APSME GET request structure. */
typedef struct zb_apsme_get_request_s
{
zb_aps_aib_attr_id_t aib_attr; /*!< The identifier of the AIB attribute to read. */
zb_callback_t confirm_cb; /*!< User's callback to be called as APSME-GET.confirm */
} zb_apsme_get_request_t;
/** @brief APSME GET confirm structure. */
typedef ZB_PACKED_PRE struct zb_apsme_get_confirm_s
{
zb_ret_t status; /*!< The results of the request to read an AIB attribute value. */
zb_aps_aib_attr_id_t aib_attr; /*!< The identifier of the AIB attribute that was read.*/
zb_uint8_t aib_length; /*!< The length, in octets, of the attribute value being returned.*/
/* Various */ /* The value of the AIB attribute that was read.*/
} ZB_PACKED_STRUCT zb_apsme_get_confirm_t;
/** @brief APSME SET request structure. */
typedef ZB_PACKED_PRE struct zb_apsme_set_request_s
{
zb_aps_aib_attr_id_t aib_attr; /*!< The identifier of the AIB attribute to be written. */
zb_uint8_t aib_length; /*!< The length, in octets, of the attribute value being set. */
zb_callback_t confirm_cb; /*!< User's callback to be called as APSME-SET.confirm */
/* Various */ /* The value of the AIB attribute that should be written. */
} ZB_PACKED_STRUCT zb_apsme_set_request_t;
/** @brief APSME SET confirm structure. */
typedef ZB_PACKED_PRE struct zb_apsme_set_confirm_s
{
zb_ret_t status; /*!< The result of the request to write the AIB Attribute. */
zb_aps_aib_attr_id_t aib_attr; /*!< The identifier of the AIB attribute that was written. */
} ZB_PACKED_STRUCT zb_apsme_set_confirm_t;
/** @endcond */ /* DOXYGEN_INTERNAL_DOC */
/**
* @brief APSME-BIND.request primitive.
* @param param - index of buffer containing request data (see @ref
* zb_apsme_binding_req_t).
*
* @deprecated This function will be moved to the private header in November 2022. Use @ref
* zb_zdo_bind_req() instead.
*/
void zb_apsme_bind_request(zb_uint8_t param);
/**
* @brief APSME-UNBIND.request primitive.
* @param param - index of buffer containing request data (see @ref
* zb_apsme_binding_req_t).
*
* @deprecated This function will be moved to the private header in November 2022. Use @ref
* zb_zdo_unbind_req() instead.
*/
void zb_apsme_unbind_request(zb_uint8_t param);
/**
*@brief Perform unbind all entries. This custom function and it is not described
* in Zigbee specification.
* @param param - not used.
*
* @deprecated This function will be moved to the private header in November 2022. Use @ref
* zb_zdo_unbind_all_local() instead.
*/
void zb_apsme_unbind_all(zb_uint8_t param);
/**
* @brief Checks if the binding with specified parameters exists
*
* @deprecated This function will be moved to the private header in November 2022. Use @ref
* zb_zdo_check_binding_request() instead.
*/
void zb_aps_check_binding_request(zb_bufid_t param);
/**
* @brief APSME-ADD-GROUP.request primitive.
*
* @param param - index of buffer with parameter. See @ref zb_apsme_add_group_req_t.
*
* @deprecated This function will be moved to the private header in November 2022. Use @ref
* zb_zdo_add_group_req() instead.
*/
void zb_apsme_add_group_request(zb_uint8_t param);
/**
* @brief APSME-REMOVE-GROUP.request primitive.
*
* @internal
* Use macro @ref ZDO_REGISTER_CALLBACK to register APSME-REMOVE-GROUP.confirm callback.
* @endinternal
* @param param - index of buffer with parameter. See @ref zb_apsme_remove_group_req_t.
*
* @deprecated This function will be moved to the private header in November 2022. Use @ref
* zb_zdo_remove_group_req() instead.
*
*/
void zb_apsme_remove_group_request(zb_uint8_t param);
/**
* @brief APSME-REMOVE-ALL-GROUPS.request primitive.
*
* @internal
* Use macro @ref ZDO_REGISTER_CALLBACK to register APSME-REMOVE-ALL-GROUPS.confirm callback.
* @endinternal
* @param param - index of buffer with parameter. See @ref zb_apsme_remove_all_groups_req_t.
*
* @deprecated This function will be moved to the private header in November 2022. Use @ref
* zb_zdo_remove_all_groups_req() instead.
*
*/
void zb_apsme_remove_all_groups_request(zb_uint8_t param);
/** @} */ /* APS management service data structures and API. */
/*! @} */ /* aps_api */
#ifdef APS_FRAGMENTATION
void zb_aps_add_max_trans_size(zb_uint16_t short_addr, zb_uint16_t max_trans_size, zb_uint8_t max_buffer_size);
zb_uint16_t zb_aps_get_max_trans_size(zb_uint16_t short_addr);
zb_uint8_t zb_aps_get_max_buffer_size(zb_uint16_t short_addr);
#endif
#ifdef ZB_APS_USER_PAYLOAD
/** @addtogroup aps_api
* @{
*/
/** @addtogroup aps_user_payload APS user payload
* @{
*/
/*!
* @brief
* Callback to notify an application of sending an APS user payload status
*
* @param param - index of buffer with an APS user payload
*/
typedef void (*zb_aps_user_payload_callback_t)(zb_uint8_t param);
/**
* @brief NLDE-DATA.indication data callback
*
* @param[in] param index of buffer with an APS indication
*
* @return
* - true: Processed
* - false: Not processed
*/
typedef zb_bool_t (*zb_aps_indication_data_callback_t)(zb_uint8_t param);
/*!
* @brief
* APS user payload transmission status
*
* Stored in the buf->u.hdr.status field
*/
typedef enum zb_aps_user_payload_cb_status_e
{
/*! APS user payload transmission is successful*/
ZB_APS_USER_PAYLOAD_CB_STATUS_SUCCESS = (zb_uint8_t)0x00,
/* Failed to transmit APS user payload - No confirmation from APS*/
ZB_APS_USER_PAYLOAD_CB_STATUS_NO_APS_ACK = (zb_uint8_t)0xbe
} zb_aps_user_payload_cb_status_t;
/*!
* @brief Send user payload using APS
*
* @param param - reference to a buffer
* @param dst_addr - destination address
* @param profile_id - profile ID for which this frame is intended for
* @param cluster_id - object ID for which this frame is intended for
* @param dst_endpoint - either the endpoint ID
* of the entity to which the ASDU is being
* transferred or the broadcast endpoint (0xff)
* @param src_endpoint - the individual endpoint of the entity from
* which the ASDU is being transferred
* @param addr_mode - the type of destination address supplied by
* the dst_addr parameter - see @ref aps_addr_mode
* @param aps_ack_is_enabled - enable (ZB_TRUE) or disable (ZB_FALSE) APS acknowledging
* @param *payload_ptr - pointer to user data
* @param payload_size - size of user data; not more than 82 bytes
*
* @return RET_OK - if transmission was successful scheduled;
* @return RET_INVALID_PARAMETER_1 - if the buffer is invalid
* @return RET_INVALID_PARAMETER_2 - if the payload_ptr parameter is invalid
* @return RET_INVALID_PARAMETER_3 - if the payload_size parameter is too large
*/
zb_ret_t zb_aps_send_user_payload(
zb_uint8_t param,
zb_addr_u dst_addr,
zb_uint16_t profile_id,
zb_uint16_t cluster_id,
zb_uint8_t dst_endpoint,
zb_uint8_t src_endpoint,
zb_uint8_t addr_mode,
zb_bool_t aps_ack_is_enabled,
zb_uint8_t *payload_ptr,
zb_uint8_t payload_size);
/*!
* @brief Get pointer to an APS payload
*
* @param param - reference to a buffer
* @param aps_payload_size - [out] pointer to a variable to store
* an APS payload size
*
* @return Pointer to an APS payload;
* @return NULL if a buffer is invalid or an aps_payload_size pointer is invalid.
*/
zb_uint8_t *zb_aps_get_aps_payload(zb_uint8_t param, zb_uint8_t *aps_payload_size);
/*!
* @brief Set callback to notify results of transmitting
* an APS frame with user payload
*
* @param cb - pointer to a callback
*/
void zb_aps_set_user_data_tx_cb(zb_aps_user_payload_callback_t cb);
/**
* @brief Set callback to notify information of APS frame
*
* @param cb - pointer to a callback
*/
void zb_aps_set_indication_data_rx_cb(zb_aps_indication_data_callback_t cb);
/*!
* @brief Set callback to be called when ZDO command packet is sent.
*
* That callback is to be used when application wants to know the fact that ZDO
* command send is completed.
*
* Callback provided to ZBOSS ZDO request function (second parameter of
* zb_zdo_node_desc_req and similar function) not always can be used for that
* purpose. ZBOSS calls ZDO callback immediately when a) unicast transmit of APS
* message failed (no ACK) and b) this is ZDO message that does not suppose to
* have an answer, like broadcast NWK Update req. In other cases if callback is
* set using zb_af_set_zdo_data_conf_cb, it is called when outgoing ZDO command
* is sent; callback passed to zb_zdo_node_desc_req and friends is called when
* ZBOSS got response/responses to ZDO command, or ZDO command is timed out.
*
* @param cb - callback. The buffer passed to the callback has zb_apsde_data_confirm_t in parameters section.
*/
void zb_af_set_zdo_data_conf_cb(zb_callback_t cb);
/** @} */ /* aps_user_payload */
/** @} */
#endif /* #ifdef ZB_APS_USER_PAYLOAD */
#endif /* #ifndef ZB_ZBOSS_API_APS_H */