1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
|
/******************************************************************************
*
* Copyright 2003-2012 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.
*
******************************************************************************/
/******************************************************************************
*
* This is the private file for the file transfer client (FTC).
*
******************************************************************************/
#ifndef BTA_GATTC_INT_H
#define BTA_GATTC_INT_H
#include <cstdint>
#include "bt_target.h" // Must be first to define build configuration
#include "bta/gatt/database.h"
#include "bta/gatt/database_builder.h"
#include "bta/include/bta_gatt_api.h"
#include "bta/sys/bta_sys.h"
#include "stack/include/bt_hdr.h"
#include "stack/include/gatt_api.h"
#include "types/bluetooth/uuid.h"
#include "types/bt_transport.h"
#include "types/raw_address.h"
/*****************************************************************************
* Constants and data types
****************************************************************************/
enum {
BTA_GATTC_API_OPEN_EVT = BTA_SYS_EVT_START(BTA_ID_GATTC),
BTA_GATTC_INT_OPEN_FAIL_EVT,
BTA_GATTC_API_CANCEL_OPEN_EVT,
BTA_GATTC_INT_CANCEL_OPEN_OK_EVT,
BTA_GATTC_API_READ_EVT,
BTA_GATTC_API_WRITE_EVT,
BTA_GATTC_API_EXEC_EVT,
BTA_GATTC_API_CFG_MTU_EVT,
BTA_GATTC_API_CLOSE_EVT,
BTA_GATTC_API_SEARCH_EVT,
BTA_GATTC_API_CONFIRM_EVT,
BTA_GATTC_API_READ_MULTI_EVT,
BTA_GATTC_INT_CONN_EVT,
BTA_GATTC_INT_DISCOVER_EVT,
BTA_GATTC_DISCOVER_CMPL_EVT,
BTA_GATTC_OP_CMPL_EVT,
BTA_GATTC_INT_DISCONN_EVT
};
typedef uint16_t tBTA_GATTC_INT_EVT;
#define BTA_GATTC_SERVICE_CHANGED_LEN 4
/* max client application GATTC can support */
#ifndef BTA_GATTC_CL_MAX
#define BTA_GATTC_CL_MAX 32
#endif
/* max known devices GATTC can support in Bluetooth spec */
#ifndef BTA_GATTC_KNOWN_SR_MAX
#define BTA_GATTC_KNOWN_SR_MAX 255
#endif
#ifndef BTA_GATTC_CLCB_MAX
#define BTA_GATTC_CLCB_MAX GATT_CL_MAX_LCB
#endif
#define BTA_GATTC_WRITE_PREPARE GATT_WRITE_PREPARE
/* internal strucutre for GATTC register API */
typedef struct {
BT_HDR_RIGID hdr;
RawAddress remote_bda;
tGATT_IF client_if;
bool is_direct;
tBT_TRANSPORT transport;
uint8_t initiating_phys;
bool opportunistic;
} tBTA_GATTC_API_OPEN;
typedef tBTA_GATTC_API_OPEN tBTA_GATTC_API_CANCEL_OPEN;
typedef struct {
BT_HDR_RIGID hdr;
tGATT_AUTH_REQ auth_req;
// read by handle data
uint16_t handle;
// read by UUID data
bluetooth::Uuid uuid;
uint16_t s_handle;
uint16_t e_handle;
tBTA_GATTC_EVT cmpl_evt;
GATT_READ_OP_CB read_cb;
void* read_cb_data;
} tBTA_GATTC_API_READ;
typedef struct {
BT_HDR_RIGID hdr;
tGATT_AUTH_REQ auth_req;
uint16_t handle;
tGATT_WRITE_TYPE write_type;
uint16_t offset;
uint16_t len;
uint8_t* p_value;
GATT_WRITE_OP_CB write_cb;
void* write_cb_data;
} tBTA_GATTC_API_WRITE;
typedef struct {
BT_HDR_RIGID hdr;
bool is_execute;
} tBTA_GATTC_API_EXEC;
typedef struct {
BT_HDR_RIGID hdr;
uint16_t cid;
} tBTA_GATTC_API_CONFIRM;
typedef struct {
BT_HDR_RIGID hdr;
tGATTC_OPTYPE op_code;
tGATT_STATUS status;
tGATT_CL_COMPLETE* p_cmpl;
} tBTA_GATTC_OP_CMPL;
typedef struct {
BT_HDR_RIGID hdr;
bluetooth::Uuid* p_srvc_uuid;
} tBTA_GATTC_API_SEARCH;
typedef struct {
BT_HDR_RIGID hdr;
tGATT_AUTH_REQ auth_req;
uint8_t num_attr;
uint16_t handles[GATT_MAX_READ_MULTI_HANDLES];
} tBTA_GATTC_API_READ_MULTI;
typedef struct {
BT_HDR_RIGID hdr;
uint16_t mtu;
GATT_CONFIGURE_MTU_OP_CB mtu_cb;
void* mtu_cb_data;
} tBTA_GATTC_API_CFG_MTU;
typedef struct {
BT_HDR_RIGID hdr;
RawAddress remote_bda;
tGATT_IF client_if;
uint8_t role;
tBT_TRANSPORT transport;
tGATT_DISCONN_REASON reason;
} tBTA_GATTC_INT_CONN;
typedef union {
BT_HDR_RIGID hdr;
tBTA_GATTC_API_OPEN api_conn;
tBTA_GATTC_API_CANCEL_OPEN api_cancel_conn;
tBTA_GATTC_API_READ api_read;
tBTA_GATTC_API_SEARCH api_search;
tBTA_GATTC_API_WRITE api_write;
tBTA_GATTC_API_CONFIRM api_confirm;
tBTA_GATTC_API_EXEC api_exec;
tBTA_GATTC_API_READ_MULTI api_read_multi;
tBTA_GATTC_API_CFG_MTU api_mtu;
tBTA_GATTC_OP_CMPL op_cmpl;
tBTA_GATTC_INT_CONN int_conn;
} tBTA_GATTC_DATA;
enum {
BTA_GATTC_IDLE_ST = 0, /* Idle */
BTA_GATTC_W4_CONN_ST, /* Wait for connection - (optional) */
BTA_GATTC_CONN_ST, /* connected state */
BTA_GATTC_DISCOVER_ST /* discover is in progress */
};
typedef uint8_t tBTA_GATTC_STATE;
typedef struct {
bool in_use;
RawAddress server_bda;
bool connected;
#define BTA_GATTC_SERV_IDLE 0
#define BTA_GATTC_SERV_LOAD 1
#define BTA_GATTC_SERV_SAVE 2
#define BTA_GATTC_SERV_DISC 3
#define BTA_GATTC_SERV_DISC_ACT 4
uint8_t state;
gatt::Database gatt_database;
uint8_t update_count; /* indication received */
uint8_t num_clcb; /* number of associated CLCB */
gatt::DatabaseBuilder pending_discovery;
/* used only during service discovery, when reading Extended Characteristic
* Properties */
bool read_multiple_not_supported;
uint8_t srvc_hdl_chg; /* service handle change indication pending */
bool srvc_hdl_db_hash; /* read db hash pending */
uint8_t srvc_disc_count; /* current discovery retry count */
uint16_t attr_index; /* cahce NV saving/loading attribute index */
uint16_t mtu;
} tBTA_GATTC_SERV;
#ifndef BTA_GATTC_NOTIF_REG_MAX
#define BTA_GATTC_NOTIF_REG_MAX 64
#endif
typedef struct {
bool in_use;
RawAddress remote_bda;
uint16_t handle;
} tBTA_GATTC_NOTIF_REG;
typedef struct {
tBTA_GATTC_CBACK* p_cback;
bool in_use;
tGATT_IF client_if; /* client interface with BTE stack for this application */
uint8_t num_clcb; /* number of associated CLCB */
bool dereg_pending;
bluetooth::Uuid app_uuid;
tBTA_GATTC_NOTIF_REG notif_reg[BTA_GATTC_NOTIF_REG_MAX];
} tBTA_GATTC_RCB;
/* client channel is a mapping between a BTA client(cl_id) and a remote BD
* address */
typedef struct {
uint16_t bta_conn_id; /* client channel ID, unique for clcb */
RawAddress bda;
tBT_TRANSPORT transport; /* channel transport */
tBTA_GATTC_RCB* p_rcb; /* pointer to the registration CB */
tBTA_GATTC_SERV* p_srcb; /* server cache CB */
const tBTA_GATTC_DATA* p_q_cmd; /* command in queue waiting for execution */
// request during discover state
#define BTA_GATTC_DISCOVER_REQ_NONE 0
#define BTA_GATTC_DISCOVER_REQ_READ_EXT_PROP_DESC 1
#define BTA_GATTC_DISCOVER_REQ_READ_DB_HASH 2
#define BTA_GATTC_DISCOVER_REQ_READ_DB_HASH_FOR_SVC_CHG 3
uint8_t request_during_discovery; /* request during discover state */
#define BTA_GATTC_NO_SCHEDULE 0
#define BTA_GATTC_DISC_WAITING 0x01
#define BTA_GATTC_REQ_WAITING 0x10
uint8_t auto_update; /* auto update is waiting */
bool disc_active;
bool in_use;
tBTA_GATTC_STATE state;
tGATT_STATUS status;
} tBTA_GATTC_CLCB;
/* back ground connection tracking information */
#if GATT_MAX_APPS <= 8
typedef uint8_t tBTA_GATTC_CIF_MASK;
#elif GATT_MAX_APPS <= 16
typedef uint16_t tBTA_GATTC_CIF_MASK;
#elif GATT_MAX_APPS <= 32
typedef uint32_t tBTA_GATTC_CIF_MASK;
#endif
typedef struct {
bool in_use;
RawAddress remote_bda;
tBTA_GATTC_CIF_MASK cif_mask;
} tBTA_GATTC_BG_TCK;
typedef struct {
bool in_use;
RawAddress remote_bda;
} tBTA_GATTC_CONN;
enum {
BTA_GATTC_STATE_DISABLED,
BTA_GATTC_STATE_ENABLING,
BTA_GATTC_STATE_ENABLED,
BTA_GATTC_STATE_DISABLING
};
typedef struct {
uint8_t state;
tBTA_GATTC_CONN conn_track[GATT_MAX_PHY_CHANNEL];
tBTA_GATTC_BG_TCK bg_track[BTA_GATTC_KNOWN_SR_MAX];
tBTA_GATTC_RCB cl_rcb[BTA_GATTC_CL_MAX];
tBTA_GATTC_CLCB clcb[BTA_GATTC_CLCB_MAX];
tBTA_GATTC_SERV known_server[BTA_GATTC_KNOWN_SR_MAX];
} tBTA_GATTC_CB;
/*****************************************************************************
* Global data
****************************************************************************/
/* GATTC control block */
extern tBTA_GATTC_CB bta_gattc_cb;
/*****************************************************************************
* Function prototypes
****************************************************************************/
extern bool bta_gattc_hdl_event(BT_HDR_RIGID* p_msg);
extern bool bta_gattc_sm_execute(tBTA_GATTC_CLCB* p_clcb, uint16_t event,
const tBTA_GATTC_DATA* p_data);
/* function processed outside SM */
extern void bta_gattc_disable();
extern void bta_gattc_register(const bluetooth::Uuid& app_uuid,
tBTA_GATTC_CBACK* p_data,
BtaAppRegisterCallback cb, bool eatt_support);
extern void bta_gattc_process_api_open(const tBTA_GATTC_DATA* p_msg);
extern void bta_gattc_process_api_open_cancel(const tBTA_GATTC_DATA* p_msg);
extern void bta_gattc_deregister(tBTA_GATTC_RCB* p_clreg);
/* function within state machine */
extern void bta_gattc_open(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_open_fail(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_open_error(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_cancel_open(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_cancel_open_ok(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_cancel_open_error(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_conn(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_close(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_close_fail(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_disc_close(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_start_discover(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_start_discover_internal(tBTA_GATTC_CLCB* p_clcb);
extern void bta_gattc_disc_cmpl(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_read(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_write(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_op_cmpl(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_q_cmd(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_search(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_fail(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_confirm(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_execute(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_read_multi(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_ci_open(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_ci_close(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_op_cmpl_during_discovery(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_restart_discover(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_msg);
extern void bta_gattc_cancel_bk_conn(const tBTA_GATTC_API_CANCEL_OPEN* p_data);
extern void bta_gattc_send_open_cback(tBTA_GATTC_RCB* p_clreg,
tGATT_STATUS status,
const RawAddress& remote_bda,
uint16_t conn_id, tBT_TRANSPORT transport,
uint16_t mtu);
extern void bta_gattc_process_api_refresh(const RawAddress& remote_bda);
extern void bta_gattc_cfg_mtu(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern void bta_gattc_listen(tBTA_GATTC_DATA* p_msg);
extern void bta_gattc_broadcast(tBTA_GATTC_DATA* p_msg);
/* utility functions */
extern tBTA_GATTC_CLCB* bta_gattc_find_clcb_by_cif(uint8_t client_if,
const RawAddress& remote_bda,
tBT_TRANSPORT transport);
extern tBTA_GATTC_CLCB* bta_gattc_find_clcb_by_conn_id(uint16_t conn_id);
extern tBTA_GATTC_CLCB* bta_gattc_clcb_alloc(tGATT_IF client_if,
const RawAddress& remote_bda,
tBT_TRANSPORT transport);
extern void bta_gattc_clcb_dealloc(tBTA_GATTC_CLCB* p_clcb);
extern tBTA_GATTC_CLCB* bta_gattc_find_alloc_clcb(tGATT_IF client_if,
const RawAddress& remote_bda,
tBT_TRANSPORT transport);
extern tBTA_GATTC_RCB* bta_gattc_cl_get_regcb(uint8_t client_if);
extern tBTA_GATTC_SERV* bta_gattc_find_srcb(const RawAddress& bda);
extern tBTA_GATTC_SERV* bta_gattc_srcb_alloc(const RawAddress& bda);
extern tBTA_GATTC_SERV* bta_gattc_find_scb_by_cid(uint16_t conn_id);
extern tBTA_GATTC_CLCB* bta_gattc_find_int_conn_clcb(tBTA_GATTC_DATA* p_msg);
extern tBTA_GATTC_CLCB* bta_gattc_find_int_disconn_clcb(tBTA_GATTC_DATA* p_msg);
extern bool bta_gattc_enqueue(tBTA_GATTC_CLCB* p_clcb,
const tBTA_GATTC_DATA* p_data);
extern bool bta_gattc_check_notif_registry(tBTA_GATTC_RCB* p_clreg,
tBTA_GATTC_SERV* p_srcb,
tBTA_GATTC_NOTIFY* p_notify);
extern bool bta_gattc_mark_bg_conn(tGATT_IF client_if,
const RawAddress& remote_bda, bool add);
extern bool bta_gattc_check_bg_conn(tGATT_IF client_if,
const RawAddress& remote_bda, uint8_t role);
extern uint8_t bta_gattc_num_reg_app(void);
extern void bta_gattc_clear_notif_registration(tBTA_GATTC_SERV* p_srcb,
uint16_t conn_id,
uint16_t start_handle,
uint16_t end_handle);
extern tBTA_GATTC_SERV* bta_gattc_find_srvr_cache(const RawAddress& bda);
extern bool bta_gattc_is_robust_caching_enabled();
/* discovery functions */
extern void bta_gattc_disc_res_cback(uint16_t conn_id,
tGATT_DISC_TYPE disc_type,
tGATT_DISC_RES* p_data);
extern void bta_gattc_disc_cmpl_cback(uint16_t conn_id,
tGATT_DISC_TYPE disc_type,
tGATT_STATUS status);
extern tGATT_STATUS bta_gattc_discover_pri_service(uint16_t conn_id,
tBTA_GATTC_SERV* p_server_cb,
tGATT_DISC_TYPE disc_type);
extern void bta_gattc_search_service(tBTA_GATTC_CLCB* p_clcb,
bluetooth::Uuid* p_uuid);
extern const std::list<gatt::Service>* bta_gattc_get_services(uint16_t conn_id);
extern const gatt::Service* bta_gattc_get_service_for_handle(uint16_t conn_id,
uint16_t handle);
const gatt::Characteristic* bta_gattc_get_characteristic_srcb(
tBTA_GATTC_SERV* p_srcb, uint16_t handle);
extern const gatt::Service* bta_gattc_get_service_for_handle_srcb(
tBTA_GATTC_SERV* p_srcb, uint16_t handle);
extern const gatt::Characteristic* bta_gattc_get_characteristic(
uint16_t conn_id, uint16_t handle);
extern const gatt::Descriptor* bta_gattc_get_descriptor(uint16_t conn_id,
uint16_t handle);
extern const gatt::Characteristic* bta_gattc_get_owning_characteristic(
uint16_t conn_id, uint16_t handle);
extern void bta_gattc_get_gatt_db(uint16_t conn_id, uint16_t start_handle,
uint16_t end_handle, btgatt_db_element_t** db,
int* count);
extern void bta_gattc_init_cache(tBTA_GATTC_SERV* p_srvc_cb);
extern void bta_gattc_reset_discover_st(tBTA_GATTC_SERV* p_srcb,
tGATT_STATUS status);
extern tBTA_GATTC_CONN* bta_gattc_conn_alloc(const RawAddress& remote_bda);
extern tBTA_GATTC_CONN* bta_gattc_conn_find(const RawAddress& remote_bda);
extern tBTA_GATTC_CONN* bta_gattc_conn_find_alloc(const RawAddress& remote_bda);
extern bool bta_gattc_conn_dealloc(const RawAddress& remote_bda);
/* bta_gattc_cache */
extern bool bta_gattc_read_db_hash(tBTA_GATTC_CLCB* p_clcb, bool is_svc_chg);
/* bta_gattc_db_storage */
extern gatt::Database bta_gattc_hash_load(const Octet16& hash);
extern bool bta_gattc_hash_write(const Octet16& hash,
const gatt::Database& database);
extern gatt::Database bta_gattc_cache_load(const RawAddress& server_bda);
extern void bta_gattc_cache_write(const RawAddress& server_bda,
const gatt::Database& database);
extern void bta_gattc_cache_link(const RawAddress& server_bda,
const Octet16& hash);
extern void bta_gattc_cache_reset(const RawAddress& server_bda);
#endif /* BTA_GATTC_INT_H */
|