1/******************************************************************************
2 *
3 *  Copyright (C) 2009-2013 Broadcom Corporation
4 *
5 *  Licensed under the Apache License, Version 2.0 (the "License");
6 *  you may not use this file except in compliance with the License.
7 *  You may obtain a copy of the License at:
8 *
9 *  http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 *
17 ******************************************************************************/
18
19
20#ifndef GAP_INT_H
21#define GAP_INT_H
22
23#include "bt_target.h"
24#include "gap_api.h"
25#include "btm_api.h"
26#include "gki.h"
27#include "gatt_api.h"
28#if AMP_INCLUDED == TRUE
29    #include "amp_api.h"
30#endif
31
32#if defined BLE_INCLUDED && BLE_INCLUDED == TRUE
33    #include "gatt_api.h"
34#endif
35
36#define GAP_MAX_BLOCKS 2        /* Concurrent GAP commands pending at a time*/
37/* There must be a different btm callback for*/
38/* each control block.*/
39
40
41/* Definitions of limits for inquiries */
42#define GAP_PER_INQ_MIN_MAX_PERIOD      BTM_PER_INQ_MIN_MAX_PERIOD
43#define GAP_PER_INQ_MAX_MAX_PERIOD      BTM_PER_INQ_MAX_MAX_PERIOD
44#define GAP_PER_INQ_MIN_MIN_PERIOD      BTM_PER_INQ_MIN_MIN_PERIOD
45#define GAP_PER_INQ_MAX_MIN_PERIOD      BTM_PER_INQ_MAX_MIN_PERIOD
46#define GAP_MAX_INQUIRY_LENGTH          BTM_MAX_INQUIRY_LENGTH
47#define GAP_MIN_INQUIRY_LEN             BTM_MIN_INQUIRY_LEN
48
49/* Define the Generic Access Profile control structure */
50typedef struct
51{
52    void          *p_data;      /* Pointer to any data returned in callback */
53    tGAP_CALLBACK *gap_cback;   /* Pointer to users callback function */
54    tGAP_CALLBACK *gap_inq_rslt_cback; /* Used for inquiry results */
55    UINT16         event;       /* Passed back in the callback */
56    UINT8          index;       /* Index of this control block and callback */
57    BOOLEAN        in_use;      /* True when structure is allocated */
58} tGAP_INFO;
59
60/* Define the control block for the FindAddrByName operation (Only 1 active at a time) */
61typedef struct
62{
63    tGAP_CALLBACK           *p_cback;
64    tBTM_INQ_INFO           *p_cur_inq; /* Pointer to the current inquiry database entry */
65    tGAP_FINDADDR_RESULTS    results;
66    BOOLEAN                  in_use;
67} tGAP_FINDADDR_CB;
68
69
70/* Define the GAP Connection Control Block.
71*/
72typedef struct
73{
74#define GAP_CCB_STATE_IDLE              0
75#define GAP_CCB_STATE_LISTENING         1
76#define GAP_CCB_STATE_CONN_SETUP        2
77#define GAP_CCB_STATE_CFG_SETUP         3
78#define GAP_CCB_STATE_WAIT_SEC          4
79#define GAP_CCB_STATE_CONNECTED         5
80    UINT8             con_state;
81
82#define GAP_CCB_FLAGS_IS_ORIG           0x01
83#define GAP_CCB_FLAGS_HIS_CFG_DONE      0x02
84#define GAP_CCB_FLAGS_MY_CFG_DONE       0x04
85#define GAP_CCB_FLAGS_SEC_DONE          0x08
86#define GAP_CCB_FLAGS_CONN_DONE         0x0E
87    UINT8             con_flags;
88
89    UINT8             service_id;           /* Used by BTM                          */
90    UINT16            gap_handle;           /* GAP handle                           */
91    UINT16            connection_id;        /* L2CAP CID                            */
92    BOOLEAN           rem_addr_specified;
93    UINT8             chan_mode_mask;       /* Supported channel modes (FCR)        */
94    BD_ADDR           rem_dev_address;
95    UINT16            psm;
96    UINT16            rem_mtu_size;
97
98    BOOLEAN           is_congested;
99    BUFFER_Q          tx_queue;             /* Queue of buffers waiting to be sent  */
100    BUFFER_Q          rx_queue;             /* Queue of buffers waiting to be read  */
101
102    UINT32            rx_queue_size;        /* Total data count in rx_queue         */
103
104    tGAP_CONN_CALLBACK *p_callback;         /* Users callback function              */
105
106    tL2CAP_CFG_INFO   cfg;                  /* Configuration                        */
107    tL2CAP_ERTM_INFO  ertm_info;            /* Pools and modes for ertm */
108} tGAP_CCB;
109
110typedef struct
111{
112#if AMP_INCLUDED == TRUE
113    tAMP_APPL_INFO    reg_info;
114#else
115    tL2CAP_APPL_INFO  reg_info;                     /* L2CAP Registration info */
116#endif
117    tGAP_CCB    ccb_pool[GAP_MAX_CONNECTIONS];
118} tGAP_CONN;
119
120
121#if BLE_INCLUDED == TRUE
122    #define GAP_MAX_CHAR_NUM          5
123
124typedef struct
125{
126    UINT16                  handle;
127    UINT16                  uuid;
128    tGAP_BLE_ATTR_VALUE     attr_value;
129}tGAP_ATTR;
130#endif
131/**********************************************************************
132** M A I N   C O N T R O L   B L O C K
133***********************************************************************/
134
135#define GAP_MAX_CL GATT_CL_MAX_LCB
136
137typedef struct
138{
139    union
140    {
141        BD_ADDR         reconn_addr;
142        UINT8           privacy_flag;
143    }                   pending_data;
144    UINT8               op;
145    void                *p_pending_cback;
146}tGAP_BLE_PENDING_OP;
147
148typedef struct
149{
150    BD_ADDR                 bda;
151    BD_ADDR                 reconn_addr;
152    void                    * p_cback;
153    UINT16                  conn_id;
154    UINT16                  cl_op_uuid;
155    UINT16                  disc_handle;
156    BOOLEAN                 in_use;
157    BOOLEAN                 connected;
158    UINT8                   privacy_flag;
159    BUFFER_Q                pending_op_q;
160}tGAP_CLCB;
161
162typedef struct
163{
164    tGAP_INFO        blk[GAP_MAX_BLOCKS];
165    tBTM_CMPL_CB    *btm_cback[GAP_MAX_BLOCKS];
166    UINT8            trace_level;
167    tGAP_FINDADDR_CB findaddr_cb;   /* Contains the control block for finding a device addr */
168    tBTM_INQ_INFO   *cur_inqptr;
169
170#if GAP_CONN_INCLUDED == TRUE
171    tGAP_CONN        conn;
172#endif
173
174    /* LE GAP attribute database */
175#if BLE_INCLUDED == TRUE
176    tGAP_ATTR               gatt_attr[GAP_MAX_CHAR_NUM];
177    BD_ADDR                 reconn_bda;
178    tGAP_CLCB               clcb[GAP_MAX_CL]; /* connection link*/
179
180    tGATT_IF                gatt_if;
181#endif
182} tGAP_CB;
183
184
185#ifdef __cplusplus
186extern "C" {
187#endif
188
189#if GAP_DYNAMIC_MEMORY == FALSE
190    GAP_API extern tGAP_CB  gap_cb;
191#else
192    GAP_API extern tGAP_CB *gap_cb_ptr;
193#define gap_cb (*gap_cb_ptr)
194#endif
195
196    extern tGAP_INFO        *gap_allocate_cb(void);
197    extern void              gap_free_cb(tGAP_INFO *p_cb);
198
199    /* GAP inquiry functions */
200    extern void              gap_inq_results_cb(tGAP_INQ_RESULTS *p_results, UINT8 *p_eir);
201    extern UINT16            gap_find_local_addr_by_name (const BD_NAME devname, BD_ADDR bd_addr);
202    extern void              gap_find_addr_inq_cb (tBTM_INQUIRY_CMPL *p);
203
204    extern BOOLEAN           gap_is_service_busy (UINT16 request);
205    extern UINT16            gap_convert_btm_status (tBTM_STATUS btm_status);
206
207    extern void gap_btm_cback0(void *p1);
208#if GAP_MAX_BLOCKS > 1
209    extern void gap_btm_cback1(void *p1);
210#endif
211#if GAP_MAX_BLOCKS > 2
212    extern void gap_btm_cback2(void *p1);
213#endif
214
215#if (GAP_CONN_INCLUDED == TRUE)
216    extern void gap_conn_init(void);
217#if (GAP_CONN_POST_EVT_INCLUDED == TRUE)
218    void gap_send_event (UINT16 gap_handle);
219    void gap_proc_btu_event(BT_HDR *p_msg);
220#endif
221#endif
222
223#if (BLE_INCLUDED == TRUE)
224    extern void gap_attr_db_init(void);
225#endif
226
227#ifdef __cplusplus
228}
229#endif
230
231#endif
232