/** * @file * @author chipsea * @brief * @version 0.1 * @date 2020-11-30 * @copyright Copyright (c) 2020, CHIPSEA Co., Ltd. * @note */ /** @headerfile: att.h **************************************************************************************************/ #ifndef ATT_H #define ATT_H #ifdef __cplusplus extern "C" { #endif /********************************************************************* * INCLUDES */ #include "bcomdef.h" #include "OSAL.h" #include "l2cap.h" /********************************************************************* * CONSTANTS */ // The Exchanging MTU Size is defined as the maximum size of any packet // transmitted between a client and a server. A higher layer specification // defines the default ATT MTU value. The ATT MTU value should be within // the range 23 to 517 inclusive. #define ATT_MTU_SIZE L2CAP_MTU_SIZE //!< Minimum ATT MTU size #define ATT_MAX_MTU_SIZE 517 //!< Maximum ATT MTU size #define ATT_MTU_SIZE_MIN 23 /** @defgroup ATT_METHOD_DEFINES ATT Methods * @{ */ #define ATT_ERROR_RSP 0x01 //!< ATT Error Response #define ATT_EXCHANGE_MTU_REQ 0x02 //!< ATT Exchange MTU Request #define ATT_EXCHANGE_MTU_RSP 0x03 //!< ATT Exchange MTU Response #define ATT_FIND_INFO_REQ 0x04 //!< ATT Find Information Request #define ATT_FIND_INFO_RSP 0x05 //!< ATT Find Information Response #define ATT_FIND_BY_TYPE_VALUE_REQ 0x06 //!< ATT Find By Type Vaue Request #define ATT_FIND_BY_TYPE_VALUE_RSP 0x07 //!< ATT Find By Type Vaue Response #define ATT_READ_BY_TYPE_REQ 0x08 //!< ATT Read By Type Request #define ATT_READ_BY_TYPE_RSP 0x09 //!< ATT Read By Type Response #define ATT_READ_REQ 0x0a //!< ATT Read Request #define ATT_READ_RSP 0x0b //!< ATT Read Response #define ATT_READ_BLOB_REQ 0x0c //!< ATT Read Blob Request #define ATT_READ_BLOB_RSP 0x0d //!< ATT Read Blob Response #define ATT_READ_MULTI_REQ 0x0e //!< ATT Read Multiple Request #define ATT_READ_MULTI_RSP 0x0f //!< ATT Read Multiple Response #define ATT_READ_BY_GRP_TYPE_REQ 0x10 //!< ATT Read By Group Type Request #define ATT_READ_BY_GRP_TYPE_RSP 0x11 //!< ATT Read By Group Type Response #define ATT_WRITE_REQ 0x12 //!< ATT Write Request #define ATT_WRITE_RSP 0x13 //!< ATT Write Response #define ATT_PREPARE_WRITE_REQ 0x16 //!< ATT Prepare Write Request #define ATT_PREPARE_WRITE_RSP 0x17 //!< ATT Prepare Write Response #define ATT_EXECUTE_WRITE_REQ 0x18 //!< ATT Execute Write Request #define ATT_EXECUTE_WRITE_RSP 0x19 //!< ATT Execute Write Response #define ATT_HANDLE_VALUE_NOTI 0x1b //!< ATT Handle Value Notification #define ATT_HANDLE_VALUE_IND 0x1d //!< ATT Handle Value Indication #define ATT_HANDLE_VALUE_CFM 0x1e //!< ATT Handle Value Confirmation #define ATT_WRITE_CMD 0x52 //!< ATT Write Command #define ATT_SIGNED_WRITE_CMD 0xD2 //!< ATT Signed Write Command /** @} End ATT_METHOD_DEFINES */ /*** Opcode fields: bitmasks ***/ // Method (bits 5-0) #define ATT_METHOD_BITS 0x3f // Command Flag (bit 6) #define ATT_CMD_FLAG_BIT 0x40 // Authentication Signature Flag (bit 7) #define ATT_AUTHEN_SIG_FLAG_BIT 0x80 // Size of 16-bit Bluetooth UUID #define ATT_BT_UUID_SIZE 2 // Size of 128-bit UUID #define ATT_UUID_SIZE 16 // ATT Response or Confirmation timeout #define ATT_MSG_TIMEOUT 30 // Authentication Signature status for received PDU; it's TRUE or FALSE for PDU to be sent #define ATT_SIG_NOT_INCLUDED 0x00 // Signature not included #define ATT_SIG_VALID 0x01 // Included signature valid #define ATT_SIG_INVALID 0x02 // Included signature not valid /********************************************************************* * Error Response: Error Code */ /** @defgroup ATT_ERR_CODE_DEFINES ATT Error Codes * @{ */ #define ATT_ERR_INVALID_HANDLE 0x01 //!< Attribute handle value given was not valid on this attribute server #define ATT_ERR_READ_NOT_PERMITTED 0x02 //!< Attribute cannot be read #define ATT_ERR_WRITE_NOT_PERMITTED 0x03 //!< Attribute cannot be written #define ATT_ERR_INVALID_PDU 0x04 //!< The attribute PDU was invalid #define ATT_ERR_INSUFFICIENT_AUTHEN 0x05 //!< The attribute requires authentication before it can be read or written #define ATT_ERR_UNSUPPORTED_REQ 0x06 //!< Attribute server doesn't support the request received from the attribute client #define ATT_ERR_INVALID_OFFSET 0x07 //!< Offset specified was past the end of the attribute #define ATT_ERR_INSUFFICIENT_AUTHOR 0x08 //!< The attribute requires an authorization before it can be read or written #define ATT_ERR_PREPARE_QUEUE_FULL 0x09 //!< Too many prepare writes have been queued #define ATT_ERR_ATTR_NOT_FOUND 0x0a //!< No attribute found within the given attribute handle range #define ATT_ERR_ATTR_NOT_LONG 0x0b //!< Attribute cannot be read or written using the Read Blob Request or Prepare Write Request #define ATT_ERR_INSUFFICIENT_KEY_SIZE 0x0c //!< The Encryption Key Size used for encrypting this link is insufficient #define ATT_ERR_INVALID_VALUE_SIZE 0x0d //!< The attribute value length is invalid for the operation #define ATT_ERR_UNLIKELY 0x0e //!< The attribute request that was requested has encountered an error that was very unlikely, and therefore could not be completed as requested #define ATT_ERR_INSUFFICIENT_ENCRYPT 0x0f //!< The attribute requires encryption before it can be read or written #define ATT_ERR_UNSUPPORTED_GRP_TYPE 0x10 //!< The attribute type is not a supported grouping attribute as defined by a higher layer specification #define ATT_ERR_INSUFFICIENT_RESOURCES 0x11 //!< Insufficient Resources to complete the request /*** Reserved for future use: 0x12 - 0x7F ***/ /*** Application error code defined by a higher layer specification: 0x80-0x9F ***/ #define ATT_ERR_INVALID_VALUE 0x80 //!< The attribute value is invalid for the operation /** @} End ATT_ERR_CODE_DEFINES */ /********************************************************************* * Find Information Response: UUID Format */ // Handle and 16-bit Bluetooth UUID #define ATT_HANDLE_BT_UUID_TYPE 0x01 // Handle and 128-bit UUID #define ATT_HANDLE_UUID_TYPE 0x02 // Maximum number of handle and 16-bit UUID pairs in a single Find Info Response #define ATT_MAX_NUM_HANDLE_BT_UUID ( ( ATT_MTU_SIZE_MIN - 2 ) / ( 2 + ATT_BT_UUID_SIZE ) ) // Maximum number of handle and 128-bit UUID pairs in a single Find Info Response #define ATT_MAX_NUM_HANDLE_UUID ( ( ATT_MTU_SIZE_MIN - 2 ) / ( 2 + ATT_UUID_SIZE ) ) /********************************************************************* * Find By Type Value Response: Handles Infomation (Found Attribute Handle and Group End Handle) */ // Maximum number of handles info in a single Find By Type Value Response #define ATT_MAX_NUM_HANDLES_INFO ( ( ATT_MTU_SIZE - 1 ) / 4 ) /********************************************************************* * Read Multiple Request: Handles */ // Maximum number of handles in a single Read Multiple Request #define ATT_MAX_NUM_HANDLES ( ( ATT_MTU_SIZE - 1 ) / 2 ) // Minimum number of handles in a single Read Multiple Request #define ATT_MIN_NUM_HANDLES 2 /********************************************************************* * Execute Write Request: Flags */ // Cancel all prepared writes #define ATT_CANCEL_PREPARED_WRITES 0x00 // Immediately write all pending prepared values #define ATT_WRITE_PREPARED_VALUES 0x01 #if defined ( TESTMODES ) // ATT Test Modes #define ATT_TESTMODE_OFF 0 // Test mode off #define ATT_TESTMODE_UNAUTHEN_SIG 1 // Do not authenticate incoming signature #endif /********************************************************************* * Size of mandatory fields of ATT requests */ // Length of Read By Type Request's fixed fields: First handle number (2) + Last handle number (2) #define READ_BY_TYPE_REQ_FIXED_SIZE 4 // Length of Prepare Write Request's fixed size: Attribute Handle (2) + Value Offset (2) #define PREPARE_WRITE_REQ_FIXED_SIZE 4 /********************************************************************* * VARIABLES */ extern CONST uint8 btBaseUUID[ATT_UUID_SIZE]; /********************************************************************* * MACROS */ /********************************************************************* * TYPEDEFS */ /** * Attribute Protocol PDU format. */ typedef struct { uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) uint8 cmd; //!< Command Flag uint8 method; //!< Method uint16 len; //!< Length of Attribute Parameters uint8 *pParams; //!< Attribute Parameters } attPacket_t; /** * Attribute Type format (2 or 16 octet UUID). */ typedef struct { uint8 len; //!< Length of UUID uint8 uuid[ATT_UUID_SIZE]; //!< 16 or 128 bit UUID } attAttrType_t; /** * Attribute Type format (2-octet Bluetooth UUID). */ typedef struct { uint8 len; //!< Length of UUID uint8 uuid[ATT_BT_UUID_SIZE]; //!< 16 bit UUID } attAttrBtType_t; /** * Error Response format. */ typedef struct { uint8 reqOpcode; //!< Request that generated this error response uint16 handle; //!< Attribute handle that generated error response uint8 errCode; //!< Reason why the request has generated error response } attErrorRsp_t; /** * Exchange MTU Request format. */ typedef struct { uint16 clientRxMTU; //!< Client receive MTU size } attExchangeMTUReq_t; /** * Exchange MTU Response format. */ typedef struct { uint16 serverRxMTU; //!< Server receive MTU size } attExchangeMTURsp_t; typedef struct { uint16 clientMTU; uint16 serverMTU; }attMTU_t; /** * Find Information Request format. */ typedef struct { uint16 startHandle; //!< First requested handle number (must be first field) uint16 endHandle; //!< Last requested handle number } attFindInfoReq_t; /** * Handle and its 16-bit Bluetooth UUIDs. */ typedef struct { uint16 handle; //!< Handle uint8 uuid[ATT_BT_UUID_SIZE]; //!< 2-octet Bluetooth UUID } attHandleBtUUID_t; /** * Handle and its 128-bit UUID. */ typedef struct { uint16 handle; //!< Handle uint8 uuid[ATT_UUID_SIZE]; //!< 16-octect UUID } attHandleUUID_t; /** * Info data format for Find Information Response (handle-UUID pair). */ typedef union { attHandleBtUUID_t btPair[ATT_MAX_NUM_HANDLE_BT_UUID]; //!< A list of 1 or more handles with their 16-bit Bluetooth UUIDs attHandleUUID_t pair[ATT_MAX_NUM_HANDLE_UUID]; //!< A list of 1 or more handles with their 128-bit UUIDs } attFindInfo_t; /** * Find Information Response format. */ typedef struct { uint8 numInfo; //!< Number of attribute handle-UUID pairs found uint8 format; //!< Format of information data attFindInfo_t info; //!< Information data whose format is determined by format field } attFindInfoRsp_t; /** * Find By Type Value Request format. */ typedef struct { uint16 startHandle; //!< First requested handle number (must be first field) uint16 endHandle; //!< Last requested handle number attAttrBtType_t type; //!< 2-octet UUID to find uint16 len; //!< Length of value uint8 value[ATT_MTU_SIZE-7]; //!< Attribute value to find } attFindByTypeValueReq_t; /** * Handles Infomation format. */ typedef struct { uint16 handle; //!< Found attribute handle uint16 grpEndHandle; //!< Group end handle } attHandlesInfo_t; /** * Find By Type Value Response format. */ typedef struct { uint8 numInfo; //!< Number of handles information found attHandlesInfo_t handlesInfo[ATT_MAX_NUM_HANDLES_INFO]; //!< List of 1 or more handles information } attFindByTypeValueRsp_t; /** * Read By Type Request format. */ typedef struct { uint16 startHandle; //!< First requested handle number (must be first field) uint16 endHandle; //!< Last requested handle number attAttrType_t type; //!< Requested type (2 or 16 octet UUID) } attReadByTypeReq_t; /** * Read By Type Response format. */ typedef struct { uint8 numPairs; //!< Number of attribute handle-UUID pairs found uint16 len; //!< Size of each attribute handle-value pair uint8 dataList[ATT_MTU_SIZE-2]; //!< List of 1 or more attribute handle-value pairs } attReadByTypeRsp_t; /** * Read Request format. */ typedef struct { uint16 handle; //!< Handle of the attribute to be read (must be first field) } attReadReq_t; /** * Read Response format. */ typedef struct { uint16 len; //!< Length of value uint8 value[ATT_MTU_SIZE-1]; //!< Value of the attribute with the handle given } attReadRsp_t; /** * Read Blob Req format. */ typedef struct { uint16 handle; //!< Handle of the attribute to be read (must be first field) uint16 offset; //!< Offset of the first octet to be read } attReadBlobReq_t; /** * Read Blob Response format. */ typedef struct { uint16 len; //!< Length of value uint8 value[ATT_MTU_SIZE-1]; //!< Part of the value of the attribute with the handle given } attReadBlobRsp_t; /** * Read Multiple Request format. */ typedef struct { uint16 handle[ATT_MAX_NUM_HANDLES]; //!< Set of two or more attribute handles (must be first field) uint8 numHandles; //!< Number of attribute handles } attReadMultiReq_t; /** * Read Multiple Response format. */ typedef struct { uint16 len; //!< Length of values uint8 values[ATT_MTU_SIZE-1]; //!< Set of two or more values } attReadMultiRsp_t; /** * Read By Group Type Request format. */ typedef struct { uint16 startHandle; //!< First requested handle number (must be first field) uint16 endHandle; //!< Last requested handle number attAttrType_t type; //!< Requested group type (2 or 16 octet UUID) } attReadByGrpTypeReq_t; /** * Read By Group Type Response format. */ typedef struct { uint8 numGrps; //!< Number of attribute handle, end group handle and value sets found uint16 len; //!< Length of each attribute handle, end group handle and value set uint8 dataList[ATT_MTU_SIZE-2]; //!< List of 1 or more attribute handle, end group handle and value } attReadByGrpTypeRsp_t; /** * Write Request format. */ typedef struct { uint16 handle; //!< Handle of the attribute to be written (must be first field) uint16 len; //!< Length of value uint8 value[ATT_MTU_SIZE-3]; //!< Value of the attribute to be written uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2)) uint8 cmd; //!< Command Flag } attWriteReq_t; /** * Prepare Write Request format. */ typedef struct { uint16 handle; //!< Handle of the attribute to be written (must be first field) uint16 offset; //!< Offset of the first octet to be written uint16 len; //!< Length of value uint8 value[ATT_MTU_SIZE-5]; //!< Part of the value of the attribute to be written } attPrepareWriteReq_t; /** * Prepare Write Response format. */ typedef struct { uint16 handle; //!< Handle of the attribute that has been read uint16 offset; //!< Offset of the first octet to be written uint16 len; //!< Length of value uint8 value[ATT_MTU_SIZE-5]; //!< Part of the value of the attribute to be written } attPrepareWriteRsp_t; /** * Execute Write Request format. */ typedef struct { uint8 flags; //!< 0x00 - cancel all prepared writes. //!< 0x01 - immediately write all pending prepared values. } attExecuteWriteReq_t; /** * Handle Value Notification format. */ typedef struct { uint16 handle; //!< Handle of the attribute that has been changed (must be first field) uint16 len; //!< Length of value uint8 value[ATT_MTU_SIZE-3]; //!< New value of the attribute } attHandleValueNoti_t; /** * Handle Value Indication format. */ typedef struct { uint16 handle; //!< Handle of the attribute that has been changed (must be first field) uint16 len; //!< Length of value uint8 value[ATT_MTU_SIZE-3]; //!< New value of the attribute } attHandleValueInd_t; /** * ATT Message format. It's a union of all attribute protocol messages used * between the attribute protocol and upper layer profile/application. */ typedef union { // Request messages attExchangeMTUReq_t exchangeMTUReq; //!< ATT Exchange MTU Request attFindInfoReq_t findInfoReq; //!< ATT Find Information Request attFindByTypeValueReq_t findByTypeValueReq; //!< ATT Find By Type Vaue Request attReadByTypeReq_t readByTypeReq; //!< ATT Read By Type Request attReadReq_t readReq; //!< ATT Read Request attReadBlobReq_t readBlobReq; //!< ATT Read Blob Request attReadMultiReq_t readMultiReq; //!< ATT Read Multiple Request attReadByGrpTypeReq_t readByGrpTypeReq; //!< ATT Read By Group Type Request attWriteReq_t writeReq; //!< ATT Write Request attPrepareWriteReq_t prepareWriteReq; //!< ATT Prepare Write Request attExecuteWriteReq_t executeWriteReq; //!< ATT Execute Write Request // Response messages attErrorRsp_t errorRsp; //!< ATT Error Response attExchangeMTURsp_t exchangeMTURsp; //!< ATT Exchange MTU Response attFindInfoRsp_t findInfoRsp; //!< ATT Find Information Response attFindByTypeValueRsp_t findByTypeValueRsp; //!< ATT Find By Type Vaue Response attReadByTypeRsp_t readByTypeRsp; //!< ATT Read By Type Response attReadRsp_t readRsp; //!< ATT Read Response attReadBlobRsp_t readBlobRsp; //!< ATT Read Blob Response attReadMultiRsp_t readMultiRsp; //!< ATT Read Multiple Response attReadByGrpTypeRsp_t readByGrpTypeRsp; //!< ATT Read By Group Type Response attPrepareWriteRsp_t prepareWriteRsp; //!< ATT Prepare Write Response // Indication and Notification messages attHandleValueNoti_t handleValueNoti; //!< ATT Handle Value Notification attHandleValueInd_t handleValueInd; //!< ATT Handle Value Indication } attMsg_t; /********************************************************************* * VARIABLES */ /********************************************************************* * API FUNCTIONS */ /*------------------------------------------------------------------- * General Utility APIs */ /* * Parse an attribute protocol message. */ extern uint8 ATT_ParsePacket( l2capDataEvent_t *pL2capMsg, attPacket_t *pPkt ); /* * Compare two UUIDs. The UUIDs are converted if necessary. */ extern uint8 ATT_CompareUUID( const uint8 *pUUID1, uint16 len1, const uint8 *pUUID2, uint16 len2 ); /* * Convert a 16-bit UUID to 128-bit UUID. */ extern uint8 ATT_ConvertUUIDto128( const uint8 *pUUID16, uint8 *pUUID128 ); /* * Convert a 128-bit UUID to 16-bit UUID. */ extern uint8 ATT_ConvertUUIDto16( const uint8 *pUUID128, uint8 *pUUID16 ); /*------------------------------------------------------------------- * Attribute Client Utility APIs */ /* * Build Error Response. */ extern uint16 ATT_BuildErrorRsp( uint8 *pBuf, uint8 *pMsg ); /* * Parse Error Response. */ extern bStatus_t ATT_ParseErrorRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Build Exchange MTU Request. */ extern uint16 ATT_BuildExchangeMTUReq( uint8 *pBuf, uint8 *pMsg ); /* * Build Exchange MTU Respnose. */ extern uint16 ATT_BuildExchangeMTURsp( uint8 *pBuf, uint8 *pMsg ); /* * Parse Exchange MTU Response. */ extern bStatus_t ATT_ParseExchangeMTURsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Build Find Information Request. */ extern uint16 ATT_BuildFindInfoReq( uint8 *pBuf, uint8 *pMsg ); /* * Parse Find Information Response. */ extern bStatus_t ATT_ParseFindInfoRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Build Find Information Response. */ extern uint16 ATT_BuildFindInfoRsp( uint8 *pBuf, uint8 *pMsg ); /* * Build Find By Type Value Request. */ extern uint16 ATT_BuildFindByTypeValueReq( uint8 *pBuf, uint8 *pMsg ); /* * Build Find By Type Value Response. */ extern uint16 ATT_BuildFindByTypeValueRsp( uint8 *pBuf, uint8 *pMsg ); /* * Parse Find By Type Value Response. */ extern bStatus_t ATT_ParseFindByTypeValueRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Build Read By Type Request. */ extern uint16 ATT_BuildReadByTypeReq( uint8 *pBuf, uint8 *pMsg ); /* * Build Read By Type Response. */ extern uint16 ATT_BuildReadByTypeRsp( uint8 *pBuf, uint8 *pMsg ); /* * Parse Read By Type Response. */ extern bStatus_t ATT_ParseReadByTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Build Read Request. */ extern uint16 ATT_BuildReadReq( uint8 *pBuf, uint8 *pMsg ); /* * Build Read Response. */ extern uint16 ATT_BuildReadRsp( uint8 *pBuf, uint8 *pMsg ); /* * Parse Read Response. */ extern bStatus_t ATT_ParseReadRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Build Read Blob Request. */ extern uint16 ATT_BuildReadBlobReq( uint8 *pBuf, uint8 *pMsg ); /* * Build Read Blob Response. */ extern uint16 ATT_BuildReadBlobRsp( uint8 *pBuf, uint8 *pMsg ); /* * Parse Read Blob Response. */ extern bStatus_t ATT_ParseReadBlobRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Build Read Multiple Request. */ extern uint16 ATT_BuildReadMultiReq( uint8 *pBuf, uint8 *pMsg ); /* * Build Read Multiple Response. */ extern uint16 ATT_BuildReadMultiRsp( uint8 *pBuf, uint8 *pMsg ); /* * Parse Read Multiple Response. */ extern bStatus_t ATT_ParseReadMultiRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Build Read By Group Type Response. */ extern uint16 ATT_BuildReadByGrpTypeRsp( uint8 *pBuf, uint8 *pMsg ); /* * Parse Read By Group Type Response. */ extern bStatus_t ATT_ParseReadByGrpTypeRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Build Write Request. */ extern uint16 ATT_BuildWriteReq( uint8 *pBuf, uint8 *pMsg ); /* * Parse Write Response. */ extern bStatus_t ATT_ParseWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Build Prepare Write Request. */ extern uint16 ATT_BuildPrepareWriteReq( uint8 *pBuf, uint8 *pMsg ); /* * Build Prepare Write Response. */ extern uint16 ATT_BuildPrepareWriteRsp( uint8 *pBuf, uint8 *pMsg ); /* * Parse Prepare Write Response. */ extern bStatus_t ATT_ParsePrepareWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Build Execute Write Request. */ extern uint16 ATT_BuildExecuteWriteReq( uint8 *pBuf, uint8 *pMsg ); /* * Parse Execute Write Response. */ extern bStatus_t ATT_ParseExecuteWriteRsp( uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Build Handle Value Indication. */ extern uint16 ATT_BuildHandleValueInd( uint8 *pBuf, uint8 *pMsg ); /* * Parse Handle Value Indication. */ extern bStatus_t ATT_ParseHandleValueInd( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); /*------------------------------------------------------------------- * Attribute Server Utility APIs */ /* * Parse Exchange MTU Request. */ extern bStatus_t ATT_ParseExchangeMTUReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Parse Find Information Request. */ extern bStatus_t ATT_ParseFindInfoReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Parse Find By Type Value Request. */ extern bStatus_t ATT_ParseFindByTypeValueReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Parse Read By Type Request. */ extern bStatus_t ATT_ParseReadByTypeReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Parse Read Request. */ extern bStatus_t ATT_ParseReadReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Parse Write Blob Request. */ extern bStatus_t ATT_ParseReadBlobReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Parse Read Multiple Request. */ extern bStatus_t ATT_ParseReadMultiReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Parse Write Request. */ extern bStatus_t ATT_ParseWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Parse Execute Write Request. */ extern bStatus_t ATT_ParseExecuteWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Parse Prepare Write Request. */ extern bStatus_t ATT_ParsePrepareWriteReq( uint8 sig, uint8 cmd, uint8 *pParams, uint16 len, attMsg_t *pMsg ); /* * Parse Handle Value Confirmation. */ extern bStatus_t ATT_ParseHandleValueCfm( uint8 *pParams, uint16 len, attMsg_t *pMsg ); /*------------------------------------------------------------------- * Attribute Client Public APIs */ /** * @defgroup ATT_CLIENT_API ATT Client API Functions * * @{ */ /** * @brief Send Exchange MTU Request. * * @param connHandle - connection to use * @param pReq - pointer to request to be sent * * @return SUCCESS: Request was sent successfully.
* INVALIDPARAMETER: Invalid request field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_ExchangeMTUReq( uint16 connHandle, attExchangeMTUReq_t *pReq ); /** * @brief Send Find Information Request. * * @param connHandle - connection to use * @param pReq - pointer to request to be sent * * @return SUCCESS: Request was sent successfully.
* INVALIDPARAMETER: Invalid request field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_FindInfoReq( uint16 connHandle, attFindInfoReq_t *pReq ); /** * @brief Send Find By Type Value Request. * * @param connHandle - connection to use * @param pReq - pointer to request to be sent * * @return SUCCESS: Request was sent successfully.
* INVALIDPARAMETER: Invalid request field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_FindByTypeValueReq( uint16 connHandle, attFindByTypeValueReq_t *pReq ); /** * @brief Send Read By Type Request. * * @param connHandle - connection to use * @param pReq - pointer to request to be sent * * @return SUCCESS: Request was sent successfully.
* INVALIDPARAMETER: Invalid request field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_ReadByTypeReq( uint16 connHandle, attReadByTypeReq_t *pReq ); /** * @brief Send Read Request. * * @param connHandle - connection to use * @param pReq - pointer to request to be sent * * @return SUCCESS: Request was sent successfully.
* INVALIDPARAMETER: Invalid request field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_ReadReq( uint16 connHandle, attReadReq_t *pReq ); /** * @brief Send Read Blob Request. * * @param connHandle - connection to use * @param pReq - pointer to request to be sent * * @return SUCCESS: Request was sent successfully.
* INVALIDPARAMETER: Invalid request field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_ReadBlobReq( uint16 connHandle, attReadBlobReq_t *pReq ); /** * @brief Send Read Multiple Request. * * @param connHandle - connection to use * @param pReq - pointer to request to be sent * * @return SUCCESS: Request was sent successfully.
* INVALIDPARAMETER: Invalid request field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_ReadMultiReq( uint16 connHandle, attReadMultiReq_t *pReq ); /** * @brief Send Read By Group Type Request. * * @param connHandle - connection to use * @param pReq - pointer to request to be sent * * @return SUCCESS: Request was sent successfully.
* INVALIDPARAMETER: Invalid request field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_ReadByGrpTypeReq( uint16 connHandle, attReadByGrpTypeReq_t *pReq ); /** * @brief Send Write Request. * * @param connHandle - connection to use * @param pReq - pointer to request to be sent * * @return SUCCESS: Request was sent successfully.
* INVALIDPARAMETER: Invalid request field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
* bleLinkEncrypted: Connection is already encrypted.
*/ extern bStatus_t ATT_WriteReq( uint16 connHandle, attWriteReq_t *pReq ); /** * @brief Send Prepare Write Request. * * @param connHandle - connection to use * @param pReq - pointer to request to be sent * * @return SUCCESS: Request was sent successfully.
* INVALIDPARAMETER: Invalid request field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_PrepareWriteReq( uint16 connHandle, attPrepareWriteReq_t *pReq ); /** * @brief Send Execute Write Request. * * @param connHandle - connection to use * @param pReq - pointer to request to be sent * * @return SUCCESS: Request was sent successfully.
* INVALIDPARAMETER: Invalid request field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_ExecuteWriteReq( uint16 connHandle, attExecuteWriteReq_t *pReq ); /** * @brief Send Handle Value Confirmation. * * @param connHandle - connection to use * * @return SUCCESS: Confirmation was sent successfully.
* INVALIDPARAMETER: Invalid confirmation field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_HandleValueCfm( uint16 connHandle ); /** * @} */ /*------------------------------------------------------------------- * Attribute Server Public APIs */ /** * @defgroup ATT_SERVER_API ATT Server API Functions * * @{ */ /** * @brief Send Error Response. * * @param connHandle - connection to use * @param pRsp - pointer to error response to be sent * * @return SUCCESS: Response was sent successfully.
* INVALIDPARAMETER: Invalid response field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_ErrorRsp( uint16 connHandle, attErrorRsp_t *pRsp ); /** * @brief Send Exchange MTU Response. * * @param connHandle - connection to use * @param pRsp - pointer to request to be sent * * @return SUCCESS: Response was sent successfully.
* INVALIDPARAMETER: Invalid response field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_ExchangeMTURsp( uint16 connHandle, attExchangeMTURsp_t *pRsp ); /** * @brief Send Find Information Response. * * @param connHandle - connection to use * @param pRsp - pointer to response to be sent * * @return SUCCESS: Response was sent successfully.
* INVALIDPARAMETER: Invalid response field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_FindInfoRsp( uint16 connHandle, attFindInfoRsp_t *pRsp ); /** * @brief Send Find By Tyep Value Response. * * @param connHandle - connection to use * @param pRsp - pointer to response to be sent * * @return SUCCESS: Response was sent successfully.
* INVALIDPARAMETER: Invalid response field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_FindByTypeValueRsp( uint16 connHandle, attFindByTypeValueRsp_t *pRsp ); /** * @brief Send Read By Type Respond. * * @param connHandle - connection to use * @param pRsp - pointer to response to be sent * * @return SUCCESS: Response was sent successfully.
* INVALIDPARAMETER: Invalid response field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_ReadByTypeRsp( uint16 connHandle, attReadByTypeRsp_t *pRsp ); /** * @brief Send Read Response. * * @param connHandle - connection to use * @param pRsp - pointer to response to be sent * * @return SUCCESS: Response was sent successfully.
* INVALIDPARAMETER: Invalid response field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_ReadRsp( uint16 connHandle, attReadRsp_t *pRsp ); /** * @brief Send Read Blob Response. * * @param connHandle - connection to use * @param pRsp - pointer to response to be sent * * @return SUCCESS: Response was sent successfully.
* INVALIDPARAMETER: Invalid response field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_ReadBlobRsp( uint16 connHandle, attReadBlobRsp_t *pRsp ); /** * @brief Send Read Multiple Response. * * @param connHandle - connection to use * @param pRsp - pointer to response to be sent * * @return SUCCESS: Response was sent successfully.
* INVALIDPARAMETER: Invalid response field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_ReadMultiRsp( uint16 connHandle, attReadMultiRsp_t *pRsp ) ; /** * @brief Send Read By Group Type Respond. * * @param connHandle - connection to use * @param pRsp - pointer to response to be sent * * @return SUCCESS: Response was sent successfully.
* INVALIDPARAMETER: Invalid response field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_ReadByGrpTypeRsp( uint16 connHandle, attReadByGrpTypeRsp_t *pRsp ); /** * @brief Send Write Response. * * @param connHandle - connection to use * * @return SUCCESS: Response was sent successfully.
* INVALIDPARAMETER: Invalid response field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_WriteRsp( uint16 connHandle ); /** * @brief Send Prepare Write Response. * * @param connHandle - connection to use * @param pRsp - pointer to response to be sent * * @return SUCCESS: Response was sent successfully.
* INVALIDPARAMETER: Invalid response field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_PrepareWriteRsp( uint16 connHandle, attPrepareWriteRsp_t *pRsp ); /** * @brief Send Execute Write Response. * * @param connHandle - connection to use * * @return SUCCESS: Response was sent successfully.
* INVALIDPARAMETER: Invalid response field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_ExecuteWriteRsp( uint16 connHandle ); /** * @brief Send Handle Value Notification. * * @param connHandle - connection to use * @param pNoti - pointer to notification to be sent * * @return SUCCESS: Notification was sent successfully.
* INVALIDPARAMETER: Invalid notification field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_HandleValueNoti( uint16 connHandle, attHandleValueNoti_t *pNoti ); /** * @brief Send Handle Value Indication. * * @param connHandle - connection to use * @param pInd - pointer to indication to be sent * * @return SUCCESS: Indication was sent successfully.
* INVALIDPARAMETER: Invalid indication field.
* MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
* bleNotConnected: Connection is down.
* bleMemAllocError: Memory allocation error occurred.
*/ extern bStatus_t ATT_HandleValueInd( uint16 connHandle, attHandleValueInd_t *pInd ); /** * @} */ /** * @brief Set a ATT Parameter value. Use this function to change * the default ATT parameter values. * * @param value - new param value * * @return void */ extern void ATT_SetParamValue( uint16 value ); /** * @brief Get a ATT Parameter value. * * @param none * * @return ATT Parameter value */ extern uint16 ATT_GetParamValue( void ); extern uint16 ATT_GetCurrentMTUSize( uint16 connHandle ); extern void ATT_UpdateMtuSize(uint16 connHandle, uint16 mtuSize); extern void ATT_SetMTUSizeMax(uint16 mtuSize); extern void ATT_MTU_SIZE_UPDATE(uint8 mtuSize); extern void ATT_InitMtuSize(void); //extern uint16 g_ATT_MTU_SIZE; extern uint16 g_ATT_MTU_SIZE_MAX; extern uint16 g_ATT_MAX_NUM_HANDLES; extern uint16 g_ATT_MAX_NUM_HANDLES_INFO; //extern uint16 g_ATT_MAX_NUM_HANDLE_BT_UUID; extern attMTU_t g_attMtuClientServer; // for multi-role extern uint16 gAttMtuSize[]; /********************************************************************* *********************************************************************/ #ifdef __cplusplus } #endif #endif /* ATT_H */