* Copyright (C) 2021 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
* @file att_common.h
*
* @brief declare common function to be called.
*
*/
#ifndef ATT_COMMON_H
#define ATT_COMMON_H
#include "att.h"
#include <stdint.h>
#include <string.h>
#include "alarm.h"
#include "btstack.h"
#include "list.h"
#include "packet.h"
#include "l2cap_if.h"
#include "l2cap_le_if.h"
#include "gap_if.h"
#include "gap_le_if.h"
#include "securec.h"
#ifdef __cplusplus
extern "C" {
#endif
#define BT_PSM_ATT 0x001F
#define LE_CID 0x04
#define MAXCONNECT 22
#define GAPSIGNATURESIZE 12
#define ADDRESSLEN 6
#define UUID128LEN 16
#define DEFAULTBREDRMTU 48
#define DEFAULTLEATTMTU 23
#define STEP_TWO 2
#define STEP_THREE 3
#define STEP_FOUR 4
#define STEP_FIVE 5
#define STEP_SIX 6
#define STEP_FIFTEEN 15
#define MAXREADBYTYPERESLEN 253
#define MAXREADBYGROUPRESLEN 251
#define INITIATIVECONNECT 1
#define PASSIVECONNECT 2
#define CONNECTTIMEOUT 40000
#define INSTRUCTIONTIMEOUT 30000
#define UUID16BITTYPELEN 2
#define UUID128BITTYPELEN 16
#define HANDLEAND16BITBLUETOOTHUUID 0x01
#define HANDLEAND128BITUUID 0x02
#define READBYTYPERESPONSEFREE 1
#define READBYGROUPTYPERESPONSEFREE 2
#define FINDINFORRESINFOR16BITLEN 4
#define FINDINFORRESINFOR128BITLEN 18
#define IMMEDIATELY_WRITE_ALL_PENDING_PREPARED_VALUES 1
#define CANCEL_ALL_PREPARED_WRITES 0
typedef struct AttConnectInfo {
uint16_t aclHandle;
union {
uint16_t bredrcid;
uint16_t lecid;
} AttConnectID;
uint16_t retGattConnectHandle;
uint8_t transportType;
BtAddr addr;
uint16_t mtu;
uint16_t sendMtu;
uint16_t receiveMtu;
bool mtuFlag;
uint8_t initPassConnFlag;
List *instruct;
Alarm *alarm;
bool serverSendFlag;
} AttConnectInfo;
typedef struct AttConnectingInfo {
uint16_t aclHandle;
uint16_t cid;
uint8_t id;
uint16_t mtu;
L2capConfigInfo locall2capConfigInfoObj;
L2capConfigInfo remotel2capConfigInfoObj;
BtAddr addr;
uint16_t connectHandle;
uint8_t initiativeConnectStatus;
uint8_t passiveConnectSatatus;
uint8_t initPassConnFlag;
Alarm *bredrAlarm;
Alarm *leAlarm;
uint8_t transportType;
} AttConnectingInfo;
typedef void (*recvDataFunction)(AttConnectInfo *connect, const Buffer *buffer);
typedef struct {
attCallback attClientCallback;
void *context;
} AttClientDataCallback;
typedef struct {
attCallback attServerCallback;
void *context;
} AttServerDataCallback;
typedef struct {
AttConnectCallback attConnect;
void *context;
} AttConnectedCallback;
typedef struct {
uint16_t connectHandle;
AttError *ATTErrorPtr;
} ErrorResponseAsync;
typedef struct {
uint16_t connectHandle;
uint16_t mtu;
} ExchangeMTUAsync;
typedef struct {
uint16_t connectHandle;
AttHandleRange attHandleRange;
} FindInformationRequestAsync;
typedef struct {
uint16_t connectHandle;
AttFindInformationRsp attFindInformationResContext;
} FindInformationResponseAsync;
typedef struct {
uint16_t connectHandle;
AttFindByTypeValueReq *attFindByTypePtreve;
Buffer *attValue;
} FindByTypeValueRequestAsync;
typedef struct {
uint16_t connectHandle;
AttFindByTypeValueRsp attFindByTypeResContext;
} FindByTypeValueResponseAsync;
typedef struct {
uint16_t connectHandle;
AttReadByTypeReq attReadByTypeReqContext;
} ReadByTypeRequestAsync;
typedef struct {
uint16_t connectHandle;
AttReadByTypeRsp attReadByTypeRspContext;
} ReadByTypeResponseAsync;
typedef struct {
uint16_t connectHandle;
uint16_t attHandle;
} ReadRequestAsync;
typedef struct {
uint16_t connectHandle;
Buffer *attValue;
} ReadResponseAsync;
typedef struct {
uint16_t connectHandle;
AttReadBlobReqPrepareWriteValue attReadBlobContext;
} ReadBlobRequestAsync;
typedef struct {
uint16_t connectHandle;
AttReadByTypeReq attReadGroupContext;
} ReadByGroupTypeRequesAsync;
typedef struct {
uint16_t connectHandle;
AttReadGroupRes attReadGroupResContext;
} ReadByGroupTypeResponseAsync;
typedef struct {
uint16_t connectHandle;
uint16_t attHandle;
Buffer *attValue;
} WriteAsync;
typedef struct {
uint16_t connectHandle;
} WriteResponseAsync;
typedef struct {
uint16_t connectHandle;
AttReadBlobReqPrepareWriteValue attReadBlobObj;
Buffer *attValue;
} PrepareWriteAsync;
typedef struct {
uint16_t connectHandle;
uint8_t flag;
} ExecuteWriteRequestAsync;
typedef struct SigedWriteCommandGenerationContext {
AttConnectInfo *connect;
Packet *packet;
uint8_t *data;
uint16_t bufferSize;
} SigedWriteCommandGenerationContext;
typedef struct AttGapSignatureGenerationContext {
GAP_SignatureResult result;
uint8_t *signaturePtr;
uint16_t signatureLen;
void *context;
} AttGapSignatureGenerationContext;
* @brief get AttConnectInfo information.
*
* @return Returns the pointer to AttConnectInfo.
*/
AttConnectInfo *AttGetConnectStart();
* @brief lookup AttConnectInfo info by aclHandle.
*
* @param1 aclHandle Indicates the aclHandle.
* @param2 connect Indicates the second rank pointer to AttConnectInfo.
*/
void AttGetConnectInfoIndexByAclHandle(uint16_t aclHandle, AttConnectInfo **connect);
* @brief lookup AttConnectInfo info by cid.
*
* @param1 cid Indicates the cid.
* @param2 connect Indicates the second rank pointer to AttConnectInfo.
*/
void AttGetConnectInfoIndexByCid(uint16_t cid, AttConnectInfo **connect);
* @brief lookup AttConnectInfo info by cid and output parameter index.
*
* @param1 cid Indicates the cid.
* @param2 index Indicates the pointer to index.
* @param3 connect Indicates second rank pointer to AttConnectInfo.
*/
void AttGetConnectInfoIndexByCidOutIndex(uint16_t cid, uint16_t *index, AttConnectInfo **connect);
* @brief lookup AttConnectInfo info by connectHandle and output parameter index.
*
* @param1 connectHandle Indicates the connectHandle.
* @param2 index Indicates the pointer to index.
* @param3 connect Indicates second rank pointer to AttConnectInfo.
*/
void AttGetConnectInfoIndexByConnectHandle(uint16_t connectHandle, uint16_t *index, AttConnectInfo **connect);
* @brief get AttConnectingInfo information.
*
* @return Returns the pointer to AttConnectingInfo.
*/
AttConnectingInfo *AttGetConnectingStart();
* @brief lookup AttConnectingInfo info by cid.
*
* @param1 cid Indicates the cid.
* @param2 connecting Indicates the second rank pointer to AttConnectingInfo.
*/
void AttGetConnectingIndexByCid(uint16_t cid, AttConnectingInfo **connecting);
* @brief lookup AttConnectingInfo info by cid and output parameter index.
*
* @param1 cid Indicates the cid.
* @param2 index Indicates the pointer to index.
* @param3 connecting Indicates the second rank pointer to AttConnectingInfo.
*/
void AttGetConnectingIndexByCidOutIndex(uint16_t cid, uint16_t *index, AttConnectingInfo **connecting);
* @brief lookup AttConnectingInfo info by connectHandle.
*
* @param1 connectHandle Indicates the connectHandle.
* @param2 connecting Indicates the second rank pointer to AttConnectingInfo.
*/
void AttGetConnectingIndexByConnectHandle(uint16_t connectHandle, AttConnectingInfo **connecting);
* @brief lookup AttConnectingInfo info by cid and connectHandle, result to output parameter index.
*
* @param1 cid Indicates the cid.
* @param2 connectHandle Indicates the connectHandle.
* @param3 index Indicates the pointer to index.
* @param4 connecting Indicates second rank pointer to AttConnectingInfo.
*/
void AttGetConnectingIndexByCidConnectHandle(
uint16_t cid, uint16_t connectHandle, uint16_t *index, AttConnectingInfo **connecting);
* @brief lookup AttConnectingInfo info by addr.
*
* @param1 addr Indicates pointer to addr.
* @param2 connecting Indicates the second rank pointer to AttConnectingInfo.
*/
void AttGetConnectingIndexByAddr(const BtAddr *addr, AttConnectingInfo **connecting);
* @brief lookup AttConnectingInfo info by addr uninitialized cid.
*
* @param1 addr Indicates pointer to addr.
* @param2 connecting Indicates the second rank pointer to AttConnectingInfo.
*/
void AttGetConnectingIndexByAddrUninitializedCid(const BtAddr *addr, AttConnectingInfo **connecting);
* @brief lookup AttConnectingInfo info by addr aclhandle cid.
*
* @param1 addr Indicates pointer to addr.
* @param2 addr Indicates the aclHandle.
* @param3 addr Indicates the cid.
* @param4 connecting Indicates the second rank pointer to AttConnectingInfo.
*/
void AttGetConnectingIndexByAddrAclhandleCid(
const BtAddr *addr, uint16_t aclHandle, uint16_t cid, AttConnectingInfo **connecting);
* @brief get AttClientDataCallback information.
*
* @return Returns the pointer to AttClientDataCallback.
*/
AttClientDataCallback *AttGetATTClientCallback();
* @brief get AttServerDataCallback information.
*
* @return Returns the pointer to AttServerDataCallback.
*/
AttServerDataCallback *AttGetATTServerCallback();
* @brief initiative execut instructions by Scheduling.
*
* @param connect Indicates the pointer to AttConnectInfo.
* @return Returns <b>0</b> if the operation is successful; returns <b>!0</b> if the operation fails.
*/
int AttSendSequenceScheduling(const AttConnectInfo *connect);
* @brief execut instructions by Scheduling after receiving response.
*
* @param connect Indicates the pointer to AttConnectInfo.
*/
void AttReceiveSequenceScheduling(const AttConnectInfo *connect);
* @brief client call back copy.
*
* @param1 attSendDataCB Indicates the pointer to attSendDataCallback.
* @param2 context Indicates the pointer to context.
*/
void AttClientCallBackCopyToCommon(attSendDataCallback attSendDataCB, const void *context);
* @brief server call back copy.
*
* @param1 attSendDataCB Indicates the pointer to attSendDataCallback.
* @param2 context Indicates the pointer to context.
*/
void AttServerCallBackCopyToCommon(attSendDataCallback attSendDataCB, const void *context);
* @brief receive senddata callback.
*
* @param1 aclHandle Indicates the aclHandle.
* @param2 result Indicates the result.
*/
void LeRecvSendDataCallback(uint16_t aclHandle, int result);
* @brief bredr receive senddata callback.
*
* @param1 aclHandle Indicates the aclHandle.
* @param2 result Indicates the result.
* @param3 cb Indicates the pointer to cb.
*/
void BREDRRecvSendDataCallback(uint16_t lcid, int result);
* @brief receive delect callback.
*
*/
void AttCallBackDelectCopyToCommon();
* @brief switch thread.
*
* @param1 callback Indicates the pointer to function pointer.
* @param2 destroyCallback Indicates the pointer to function pointer.
* @param3 context Indicates the pointer to context.
*/
void AttAsyncProcess(
void (*callback)(const void *context), void (*destroyCallback)(const void *context), const void *context);
* @brief shut down clear connect information.
*
* @param connectInfo Indicates the pointer to AttConnectInfo.
*/
void AttShutDownClearConnectInfo(AttConnectInfo *connectInfo);
* @brief client call back btbadparam.
*
* @param connect Indicates the pointer to AttConnectInfo.
*/
void ClientCallbackBTBADPARAM(const AttConnectInfo *connect);
* @brief server call back btbadparam.
*
* @param connect Indicates the pointer to AttConnectInfo.
*/
void ServerCallbackBTBADPARAM(const AttConnectInfo *connect);
* @brief client call back return value.
*
* @param1 ret Indicates the ret.
* @param2 connect Indicates the pointer to AttConnectInfo.
*/
void ClientCallbackReturnValue(int ret, const AttConnectInfo *connect);
* @brief server call back return value.
*
* @param1 ret Indicates the ret.
* @param2 connect Indicates the pointer to AttConnectInfo.
*/
void ServerCallbackReturnValue(int ret, const AttConnectInfo *connect);
* @brief received bredr connect instructions data information.
*
* @param1 lcid Indicates the lcid.
* @param2 packet Indicates the pointer to Packet.
* @param3 ctx Indicates the pointer to context.
*/
void AttRecvData(uint16_t lcid, const Packet *packet, const void *ctx);
* @brief received le connect instructions data information.
*
* @param1 aclHandle Indicates the aclHandle.
* @param2 packet Indicates the pointer to Packet.
*/
void AttRecvLeData(uint16_t aclHandle, const Packet *packet);
AttConnectedCallback *AttGetATTConnectCallback();
int AttResponseSendData(const AttConnectInfo *connect, const Packet *packet);
* @brief received error opcode.
*
* @param1 connect Indicates the AttConnectInfo.
* @param2 error opcode.
*/
void AttErrorCode(const AttConnectInfo *connect, uint8_t opcode);
* @brief get function array dress.
*
* @return Returns the pointer to recvDataFunction.
*/
recvDataFunction *GetFunctionArrayDress();
* @brief return minute number
*
* @param1 number1
* @param2 number2
*/
uint16_t Min(uint16_t param1, uint16_t param2);
void AttShutDownClearConnectInfo(AttConnectInfo *connectInfo);
#ifdef __cplusplus
}
#endif
#endif