/******************************************************************************
*
* Copyright (C) 2009-2013 Broadcom Corporation
*
* 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.
*
******************************************************************************/
#ifndef GAP_INT_H
#define GAP_INT_H
#include "bt_target.h"
#include "gap_api.h"
#include "btm_api.h"
#include "gki.h"
#include "gatt_api.h"
#if AMP_INCLUDED == TRUE
#include "amp_api.h"
#endif
#if defined BLE_INCLUDED && BLE_INCLUDED == TRUE
#include "gatt_api.h"
#endif
#define GAP_MAX_BLOCKS 2 /* Concurrent GAP commands pending at a time*/
/* There must be a different btm callback for*/
/* each control block.*/
/* Definitions of limits for inquiries */
#define GAP_PER_INQ_MIN_MAX_PERIOD BTM_PER_INQ_MIN_MAX_PERIOD
#define GAP_PER_INQ_MAX_MAX_PERIOD BTM_PER_INQ_MAX_MAX_PERIOD
#define GAP_PER_INQ_MIN_MIN_PERIOD BTM_PER_INQ_MIN_MIN_PERIOD
#define GAP_PER_INQ_MAX_MIN_PERIOD BTM_PER_INQ_MAX_MIN_PERIOD
#define GAP_MAX_INQUIRY_LENGTH BTM_MAX_INQUIRY_LENGTH
#define GAP_MIN_INQUIRY_LEN BTM_MIN_INQUIRY_LEN
/* Define the Generic Access Profile control structure */
typedef struct
{
void *p_data; /* Pointer to any data returned in callback */
tGAP_CALLBACK *gap_cback; /* Pointer to users callback function */
tGAP_CALLBACK *gap_inq_rslt_cback; /* Used for inquiry results */
UINT16 event; /* Passed back in the callback */
UINT8 index; /* Index of this control block and callback */
BOOLEAN in_use; /* True when structure is allocated */
} tGAP_INFO;
/* Define the control block for the FindAddrByName operation (Only 1 active at a time) */
typedef struct
{
tGAP_CALLBACK *p_cback;
tBTM_INQ_INFO *p_cur_inq; /* Pointer to the current inquiry database entry */
tGAP_FINDADDR_RESULTS results;
BOOLEAN in_use;
} tGAP_FINDADDR_CB;
/* Define the GAP Connection Control Block.
*/
typedef struct
{
#define GAP_CCB_STATE_IDLE 0
#define GAP_CCB_STATE_LISTENING 1
#define GAP_CCB_STATE_CONN_SETUP 2
#define GAP_CCB_STATE_CFG_SETUP 3
#define GAP_CCB_STATE_WAIT_SEC 4
#define GAP_CCB_STATE_CONNECTED 5
UINT8 con_state;
#define GAP_CCB_FLAGS_IS_ORIG 0x01
#define GAP_CCB_FLAGS_HIS_CFG_DONE 0x02
#define GAP_CCB_FLAGS_MY_CFG_DONE 0x04
#define GAP_CCB_FLAGS_SEC_DONE 0x08
#define GAP_CCB_FLAGS_CONN_DONE 0x0E
UINT8 con_flags;
UINT8 service_id; /* Used by BTM */
UINT16 gap_handle; /* GAP handle */
UINT16 connection_id; /* L2CAP CID */
BOOLEAN rem_addr_specified;
UINT8 chan_mode_mask; /* Supported channel modes (FCR) */
BD_ADDR rem_dev_address;
UINT16 psm;
UINT16 rem_mtu_size;
BOOLEAN is_congested;
BUFFER_Q tx_queue; /* Queue of buffers waiting to be sent */
BUFFER_Q rx_queue; /* Queue of buffers waiting to be read */
UINT32 rx_queue_size; /* Total data count in rx_queue */
tGAP_CONN_CALLBACK *p_callback; /* Users callback function */
tL2CAP_CFG_INFO cfg; /* Configuration */
tL2CAP_ERTM_INFO ertm_info; /* Pools and modes for ertm */
} tGAP_CCB;
typedef struct
{
#if AMP_INCLUDED == TRUE
tAMP_APPL_INFO reg_info;
#else
tL2CAP_APPL_INFO reg_info; /* L2CAP Registration info */
#endif
tGAP_CCB ccb_pool[GAP_MAX_CONNECTIONS];
} tGAP_CONN;
#if BLE_INCLUDED == TRUE
#define GAP_MAX_CHAR_NUM 5
typedef struct
{
UINT16 handle;
UINT16 uuid;
tGAP_BLE_ATTR_VALUE attr_value;
}tGAP_ATTR;
#endif
/**********************************************************************
** M A I N C O N T R O L B L O C K
***********************************************************************/
#define GAP_MAX_CL GATT_CL_MAX_LCB
typedef struct
{
union
{
BD_ADDR reconn_addr;
UINT8 privacy_flag;
} pending_data;
UINT8 op;
void *p_pending_cback;
}tGAP_BLE_PENDING_OP;
typedef struct
{
BD_ADDR bda;
BD_ADDR reconn_addr;
void * p_cback;
UINT16 conn_id;
UINT16 cl_op_uuid;
UINT16 disc_handle;
BOOLEAN in_use;
BOOLEAN connected;
UINT8 privacy_flag;
BUFFER_Q pending_op_q;
}tGAP_CLCB;
typedef struct
{
tGAP_INFO blk[GAP_MAX_BLOCKS];
tBTM_CMPL_CB *btm_cback[GAP_MAX_BLOCKS];
UINT8 trace_level;
tGAP_FINDADDR_CB findaddr_cb; /* Contains the control block for finding a device addr */
tBTM_INQ_INFO *cur_inqptr;
#if GAP_CONN_INCLUDED == TRUE
tGAP_CONN conn;
#endif
/* LE GAP attribute database */
#if BLE_INCLUDED == TRUE
tGAP_ATTR gatt_attr[GAP_MAX_CHAR_NUM];
BD_ADDR reconn_bda;
tGAP_CLCB clcb[GAP_MAX_CL]; /* connection link*/
tGATT_IF gatt_if;
#endif
} tGAP_CB;
#ifdef __cplusplus
extern "C" {
#endif
#if GAP_DYNAMIC_MEMORY == FALSE
GAP_API extern tGAP_CB gap_cb;
#else
GAP_API extern tGAP_CB *gap_cb_ptr;
#define gap_cb (*gap_cb_ptr)
#endif
extern tGAP_INFO *gap_allocate_cb(void);
extern void gap_free_cb(tGAP_INFO *p_cb);
/* GAP inquiry functions */
extern void gap_inq_results_cb(tGAP_INQ_RESULTS *p_results, UINT8 *p_eir);
extern UINT16 gap_find_local_addr_by_name (const BD_NAME devname, BD_ADDR bd_addr);
extern void gap_find_addr_inq_cb (tBTM_INQUIRY_CMPL *p);
extern BOOLEAN gap_is_service_busy (UINT16 request);
extern UINT16 gap_convert_btm_status (tBTM_STATUS btm_status);
extern void gap_btm_cback0(void *p1);
#if GAP_MAX_BLOCKS > 1
extern void gap_btm_cback1(void *p1);
#endif
#if GAP_MAX_BLOCKS > 2
extern void gap_btm_cback2(void *p1);
#endif
#if (GAP_CONN_INCLUDED == TRUE)
extern void gap_conn_init(void);
#if (GAP_CONN_POST_EVT_INCLUDED == TRUE)
void gap_send_event (UINT16 gap_handle);
void gap_proc_btu_event(BT_HDR *p_msg);
#endif
#endif
#if (BLE_INCLUDED == TRUE)
extern void gap_attr_db_init(void);
#endif
#ifdef __cplusplus
}
#endif
#endif