bta_gattc_api.cc revision e9e58ced195ec2c983c7723c9cbdabd45eb0f2fd
1/******************************************************************************
2 *
3 *  Copyright (C) 2010-2012 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 *
21 *  This is the implementation of the API for GATT module of BTA.
22 *
23 ******************************************************************************/
24
25#include "bt_target.h"
26
27#if (BTA_GATT_INCLUDED == TRUE)
28
29#include <string.h>
30#include "bt_common.h"
31#include "bta_sys.h"
32#include "bta_gatt_api.h"
33#include "bta_gattc_int.h"
34
35/*****************************************************************************
36**  Constants
37*****************************************************************************/
38
39static const tBTA_SYS_REG bta_gattc_reg =
40{
41    bta_gattc_hdl_event,
42    BTA_GATTC_Disable
43};
44
45
46/*******************************************************************************
47**
48** Function         BTA_GATTC_Disable
49**
50** Description      This function is called to disable GATTC module
51**
52** Parameters       None.
53**
54** Returns          None
55**
56*******************************************************************************/
57void BTA_GATTC_Disable(void)
58{
59    if (bta_sys_is_register(BTA_ID_GATTC) == false)
60    {
61        APPL_TRACE_WARNING("GATTC Module not enabled/already disabled");
62        return;
63    }
64
65    BT_HDR *p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR));
66    p_buf->event = BTA_GATTC_API_DISABLE_EVT;
67
68    bta_sys_sendmsg(p_buf);
69    bta_sys_deregister(BTA_ID_GATTC);
70}
71
72/*******************************************************************************
73**
74** Function         BTA_GATTC_AppRegister
75**
76** Description      This function is called to register application callbacks
77**                    with BTA GATTC module.
78**
79** Parameters       p_app_uuid - applicaiton UUID
80**                  p_client_cb - pointer to the application callback function.
81**
82** Returns          None
83**
84*******************************************************************************/
85void BTA_GATTC_AppRegister(tBT_UUID *p_app_uuid, tBTA_GATTC_CBACK *p_client_cb)
86{
87    tBTA_GATTC_API_REG *p_buf =
88        (tBTA_GATTC_API_REG *)osi_malloc(sizeof(tBTA_GATTC_API_REG));
89
90    if (bta_sys_is_register(BTA_ID_GATTC) == false)
91        bta_sys_register(BTA_ID_GATTC, &bta_gattc_reg);
92
93    p_buf->hdr.event = BTA_GATTC_API_REG_EVT;
94    if (p_app_uuid != NULL)
95        memcpy(&p_buf->app_uuid, p_app_uuid, sizeof(tBT_UUID));
96    p_buf->p_cback = p_client_cb;
97
98    bta_sys_sendmsg(p_buf);
99}
100
101/*******************************************************************************
102**
103** Function         BTA_GATTC_AppDeregister
104**
105** Description      This function is called to deregister an application
106**                  from BTA GATTC module.
107**
108** Parameters       client_if - client interface identifier.
109**
110** Returns          None
111**
112*******************************************************************************/
113void BTA_GATTC_AppDeregister(tBTA_GATTC_IF client_if)
114{
115    tBTA_GATTC_API_DEREG *p_buf =
116        (tBTA_GATTC_API_DEREG *)osi_malloc(sizeof(tBTA_GATTC_API_DEREG));
117
118    p_buf->hdr.event = BTA_GATTC_API_DEREG_EVT;
119    p_buf->client_if = client_if;
120
121    bta_sys_sendmsg(p_buf);
122}
123
124/*******************************************************************************
125**
126** Function         BTA_GATTC_Open
127**
128** Description      Open a direct connection or add a background auto connection
129**                  bd address
130**
131** Parameters       client_if: server interface.
132**                  remote_bda: remote device BD address.
133**                  is_direct: direct connection or background auto connection
134**                  transport: Transport to be used for GATT connection (BREDR/LE)
135**
136** Returns          void
137**
138*******************************************************************************/
139void BTA_GATTC_Open(tBTA_GATTC_IF client_if, BD_ADDR remote_bda,
140                    bool is_direct, tBTA_GATT_TRANSPORT transport)
141{
142    tBTA_GATTC_API_OPEN *p_buf =
143       (tBTA_GATTC_API_OPEN *) osi_malloc(sizeof(tBTA_GATTC_API_OPEN));
144
145    p_buf->hdr.event = BTA_GATTC_API_OPEN_EVT;
146    p_buf->client_if = client_if;
147    p_buf->is_direct = is_direct;
148    p_buf->transport = transport;
149    memcpy(p_buf->remote_bda, remote_bda, BD_ADDR_LEN);
150
151    bta_sys_sendmsg(p_buf);
152}
153
154/*******************************************************************************
155**
156** Function         BTA_GATTC_CancelOpen
157**
158** Description      Cancel a direct open connection or remove a background auto connection
159**                  bd address
160**
161** Parameters       client_if: server interface.
162**                  remote_bda: remote device BD address.
163**                  is_direct: direct connection or background auto connection
164**
165** Returns          void
166**
167*******************************************************************************/
168void BTA_GATTC_CancelOpen(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, bool is_direct)
169{
170    tBTA_GATTC_API_CANCEL_OPEN *p_buf =
171        (tBTA_GATTC_API_CANCEL_OPEN *)osi_malloc(sizeof(tBTA_GATTC_API_CANCEL_OPEN));
172
173    p_buf->hdr.event = BTA_GATTC_API_CANCEL_OPEN_EVT;
174    p_buf->client_if = client_if;
175    p_buf->is_direct = is_direct;
176    memcpy(p_buf->remote_bda, remote_bda, BD_ADDR_LEN);
177
178    bta_sys_sendmsg(p_buf);
179}
180
181/*******************************************************************************
182**
183** Function         BTA_GATTC_Close
184**
185** Description      Close a connection to a GATT server.
186**
187** Parameters       conn_id: connectino ID to be closed.
188**
189** Returns          void
190**
191*******************************************************************************/
192void BTA_GATTC_Close(uint16_t conn_id)
193{
194    BT_HDR *p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR));
195
196    p_buf->event = BTA_GATTC_API_CLOSE_EVT;
197    p_buf->layer_specific = conn_id;
198
199    bta_sys_sendmsg(p_buf);
200}
201
202/*******************************************************************************
203**
204** Function         BTA_GATTC_ConfigureMTU
205**
206** Description      Configure the MTU size in the GATT channel. This can be done
207**                  only once per connection.
208**
209** Parameters       conn_id: connection ID.
210**                  mtu: desired MTU size to use.
211**
212** Returns          void
213**
214*******************************************************************************/
215void BTA_GATTC_ConfigureMTU (uint16_t conn_id, uint16_t mtu)
216{
217    tBTA_GATTC_API_CFG_MTU *p_buf =
218        (tBTA_GATTC_API_CFG_MTU *)osi_malloc(sizeof(tBTA_GATTC_API_CFG_MTU));
219
220    p_buf->hdr.event = BTA_GATTC_API_CFG_MTU_EVT;
221    p_buf->hdr.layer_specific = conn_id;
222    p_buf->mtu = mtu;
223
224    bta_sys_sendmsg(p_buf);
225}
226
227/*******************************************************************************
228**
229** Function         BTA_GATTC_ServiceSearchRequest
230**
231** Description      This function is called to request a GATT service discovery
232**                    on a GATT server. This function report service search result
233**                  by a callback event, and followed by a service search complete
234**                  event.
235**
236** Parameters       conn_id: connection ID.
237**                  p_srvc_uuid: a UUID of the service application is interested in.
238**                              If Null, discover for all services.
239**
240** Returns          None
241**
242*******************************************************************************/
243void BTA_GATTC_ServiceSearchRequest (uint16_t conn_id, tBT_UUID *p_srvc_uuid)
244{
245    const size_t len = sizeof(tBTA_GATTC_API_SEARCH) + sizeof(tBT_UUID);
246    tBTA_GATTC_API_SEARCH *p_buf = (tBTA_GATTC_API_SEARCH *)osi_calloc(len);
247
248    p_buf->hdr.event = BTA_GATTC_API_SEARCH_EVT;
249    p_buf->hdr.layer_specific = conn_id;
250    if (p_srvc_uuid) {
251        p_buf->p_srvc_uuid = (tBT_UUID *)(p_buf + 1);
252        memcpy(p_buf->p_srvc_uuid, p_srvc_uuid, sizeof(tBT_UUID));
253    } else {
254        p_buf->p_srvc_uuid = NULL;
255    }
256
257    bta_sys_sendmsg(p_buf);
258}
259
260/*******************************************************************************
261**
262** Function         BTA_GATTC_GetServices
263**
264** Description      This function is called to find the services on the given server.
265**
266** Parameters       conn_id: connection ID which identify the server.
267**
268** Returns          returns list_t of tBTA_GATTC_SERVICE or NULL.
269**
270*******************************************************************************/
271const list_t* BTA_GATTC_GetServices(uint16_t conn_id) {
272    return bta_gattc_get_services(conn_id);
273}
274
275/*******************************************************************************
276**
277** Function         BTA_GATTC_GetCharacteristic
278**
279** Description      This function is called to find the characteristic on the given server.
280**
281** Parameters       conn_id - connection ID which identify the server.
282**                  handle - characteristic handle
283**
284** Returns          returns pointer to tBTA_GATTC_CHARACTERISTIC or NULL.
285**
286*******************************************************************************/
287const tBTA_GATTC_CHARACTERISTIC* BTA_GATTC_GetCharacteristic(uint16_t conn_id, uint16_t handle) {
288    return bta_gattc_get_characteristic(conn_id, handle);
289}
290
291/*******************************************************************************
292**
293** Function         BTA_GATTC_GetDescriptor
294**
295** Description      This function is called to find the characteristic on the given server.
296**
297** Parameters       conn_id - connection ID which identify the server.
298**                  handle - descriptor handle
299**
300** Returns          returns pointer to tBTA_GATTC_DESCRIPTOR or NULL.
301**
302*******************************************************************************/
303const tBTA_GATTC_DESCRIPTOR* BTA_GATTC_GetDescriptor(uint16_t conn_id, uint16_t handle) {
304    return bta_gattc_get_descriptor(conn_id, handle);
305}
306
307/*******************************************************************************
308**
309** Function         BTA_GATTC_GetGattDb
310**
311** Description      This function is called to get the GATT database.
312**
313** Parameters       conn_id: connection ID which identify the server.
314**                  db: output parameter which will contain the GATT database copy.
315**                      Caller is responsible for freeing it.
316**                  count: number of elements in database.
317**
318*******************************************************************************/
319void  BTA_GATTC_GetGattDb(uint16_t conn_id, uint16_t start_handle, uint16_t end_handle,
320                          btgatt_db_element_t **db, int *count)
321{
322    bta_gattc_get_gatt_db(conn_id, start_handle, end_handle, db, count);
323}
324
325/*******************************************************************************
326**
327** Function         BTA_GATTC_ReadCharacteristic
328**
329** Description      This function is called to read a characteristics value
330**
331** Parameters       conn_id - connection ID.
332**                  handle - characteritic handle to read.
333**
334** Returns          None
335**
336*******************************************************************************/
337void BTA_GATTC_ReadCharacteristic(uint16_t conn_id, uint16_t handle, tBTA_GATT_AUTH_REQ auth_req)
338{
339    tBTA_GATTC_API_READ *p_buf =
340        (tBTA_GATTC_API_READ *)osi_calloc(sizeof(tBTA_GATTC_API_READ));
341
342    p_buf->hdr.event = BTA_GATTC_API_READ_EVT;
343    p_buf->hdr.layer_specific = conn_id;
344    p_buf->auth_req = auth_req;
345    p_buf->handle = handle;
346    p_buf->cmpl_evt = BTA_GATTC_READ_CHAR_EVT;
347
348    bta_sys_sendmsg(p_buf);
349}
350
351/*******************************************************************************
352**
353** Function         BTA_GATTC_ReadCharDescr
354**
355** Description      This function is called to read a descriptor value.
356**
357** Parameters       conn_id - connection ID.
358**                  handle - descriptor handle to read.
359**
360** Returns          None
361**
362*******************************************************************************/
363void BTA_GATTC_ReadCharDescr (uint16_t conn_id, uint16_t handle, tBTA_GATT_AUTH_REQ auth_req)
364{
365    tBTA_GATTC_API_READ *p_buf =
366        (tBTA_GATTC_API_READ *)osi_calloc(sizeof(tBTA_GATTC_API_READ));
367
368    p_buf->hdr.event = BTA_GATTC_API_READ_EVT;
369    p_buf->hdr.layer_specific = conn_id;
370    p_buf->auth_req = auth_req;
371    p_buf->handle = handle;
372    p_buf->cmpl_evt = BTA_GATTC_READ_DESCR_EVT;
373
374    bta_sys_sendmsg(p_buf);
375}
376
377/*******************************************************************************
378**
379** Function         BTA_GATTC_ReadMultiple
380**
381** Description      This function is called to read multiple characteristic or
382**                  characteristic descriptors.
383**
384** Parameters       conn_id - connectino ID.
385**                    p_read_multi - pointer to the read multiple parameter.
386**
387** Returns          None
388**
389*******************************************************************************/
390void BTA_GATTC_ReadMultiple(uint16_t conn_id, tBTA_GATTC_MULTI *p_read_multi,
391                            tBTA_GATT_AUTH_REQ auth_req)
392{
393    tBTA_GATTC_API_READ_MULTI *p_buf =
394        (tBTA_GATTC_API_READ_MULTI *)osi_calloc(sizeof(tBTA_GATTC_API_READ_MULTI));
395
396    p_buf->hdr.event = BTA_GATTC_API_READ_MULTI_EVT;
397    p_buf->hdr.layer_specific = conn_id;
398    p_buf->auth_req = auth_req;
399    p_buf->num_attr = p_read_multi->num_attr;
400
401    if (p_buf->num_attr > 0)
402        memcpy(p_buf->handles, p_read_multi->handles, sizeof(uint16_t) * p_read_multi->num_attr);
403
404    bta_sys_sendmsg(p_buf);
405}
406
407/*******************************************************************************
408**
409** Function         BTA_GATTC_WriteCharValue
410**
411** Description      This function is called to write characteristic value.
412**
413** Parameters       conn_id - connection ID.
414**                  handle - characteristic handle to write.
415**                  write_type - type of write.
416**                  value - the value to be written.
417**
418** Returns          None
419**
420*******************************************************************************/
421void BTA_GATTC_WriteCharValue ( uint16_t conn_id,
422                                uint16_t handle,
423                                tBTA_GATTC_WRITE_TYPE  write_type,
424                                std::vector<uint8_t> value,
425                                tBTA_GATT_AUTH_REQ auth_req)
426{
427    tBTA_GATTC_API_WRITE  *p_buf = (tBTA_GATTC_API_WRITE *)
428        osi_calloc(sizeof(tBTA_GATTC_API_WRITE) + value.size());
429
430    p_buf->hdr.event = BTA_GATTC_API_WRITE_EVT;
431    p_buf->hdr.layer_specific = conn_id;
432    p_buf->auth_req = auth_req;
433    p_buf->handle = handle;
434    p_buf->cmpl_evt = BTA_GATTC_WRITE_CHAR_EVT;
435    p_buf->write_type = write_type;
436    p_buf->len = value.size();
437
438    if (value.size() > 0) {
439        p_buf->p_value = (uint8_t *)(p_buf + 1);
440        memcpy(p_buf->p_value, value.data(), value.size());
441    }
442
443    bta_sys_sendmsg(p_buf);
444}
445
446/*******************************************************************************
447**
448** Function         BTA_GATTC_WriteCharDescr
449**
450** Description      This function is called to write descriptor value.
451**
452** Parameters       conn_id - connection ID
453**                  handle - descriptor hadle to write.
454**                  write_type - write type.
455**                  value - the value to be written.
456**
457** Returns          None
458**
459*******************************************************************************/
460void BTA_GATTC_WriteCharDescr (uint16_t conn_id,
461                               uint16_t handle,
462                               tBTA_GATTC_WRITE_TYPE  write_type,
463                               std::vector<uint8_t> value,
464                               tBTA_GATT_AUTH_REQ auth_req)
465{
466    tBTA_GATTC_API_WRITE *p_buf = (tBTA_GATTC_API_WRITE *)
467        osi_calloc(sizeof(tBTA_GATTC_API_WRITE) + value.size());
468
469    p_buf->hdr.event = BTA_GATTC_API_WRITE_EVT;
470    p_buf->hdr.layer_specific = conn_id;
471    p_buf->auth_req = auth_req;
472    p_buf->handle = handle;
473    p_buf->cmpl_evt = BTA_GATTC_WRITE_DESCR_EVT;
474    p_buf->write_type = write_type;
475
476    if (value.size() != 0) {
477        p_buf->p_value  = (uint8_t *)(p_buf + 1);
478        p_buf->len      = value.size();
479        memcpy(p_buf->p_value, value.data(), value.size());
480    }
481
482    bta_sys_sendmsg(p_buf);
483}
484
485/*******************************************************************************
486**
487** Function         BTA_GATTC_PrepareWrite
488**
489** Description      This function is called to prepare write a characteristic value.
490**
491** Parameters       conn_id - connection ID.
492**                  p_char_id - GATT characteritic ID of the service.
493**                  offset - offset of the write value.
494**                  value - the value to be written.
495**
496** Returns          None
497**
498*******************************************************************************/
499void BTA_GATTC_PrepareWrite  (uint16_t conn_id, uint16_t handle,
500                              uint16_t offset, std::vector<uint8_t> value,
501                              tBTA_GATT_AUTH_REQ auth_req)
502{
503    tBTA_GATTC_API_WRITE *p_buf =
504        (tBTA_GATTC_API_WRITE *)osi_calloc(sizeof(tBTA_GATTC_API_WRITE) + value.size());
505
506    p_buf->hdr.event = BTA_GATTC_API_WRITE_EVT;
507    p_buf->hdr.layer_specific = conn_id;
508    p_buf->auth_req = auth_req;
509    p_buf->handle = handle;
510
511    p_buf->write_type = BTA_GATTC_WRITE_PREPARE;
512    p_buf->offset   = offset;
513    p_buf->len = value.size();
514
515    if (value.size() > 0) {
516        p_buf->p_value = (uint8_t *)(p_buf + 1);
517        memcpy(p_buf->p_value, value.data(), value.size());
518    }
519
520    bta_sys_sendmsg(p_buf);
521}
522
523/*******************************************************************************
524**
525** Function         BTA_GATTC_ExecuteWrite
526**
527** Description      This function is called to execute write a prepare write sequence.
528**
529** Parameters       conn_id - connection ID.
530**                    is_execute - execute or cancel.
531**
532** Returns          None
533**
534*******************************************************************************/
535void BTA_GATTC_ExecuteWrite  (uint16_t conn_id, bool is_execute)
536{
537    tBTA_GATTC_API_EXEC *p_buf =
538        (tBTA_GATTC_API_EXEC *)osi_calloc(sizeof(tBTA_GATTC_API_EXEC));
539
540    p_buf->hdr.event = BTA_GATTC_API_EXEC_EVT;
541    p_buf->hdr.layer_specific = conn_id;
542    p_buf->is_execute = is_execute;
543
544    bta_sys_sendmsg(p_buf);
545}
546
547/*******************************************************************************
548**
549** Function         BTA_GATTC_SendIndConfirm
550**
551** Description      This function is called to send handle value confirmation.
552**
553** Parameters       conn_id - connection ID.
554**                    p_char_id - characteristic ID to confirm.
555**
556** Returns          None
557**
558*******************************************************************************/
559void BTA_GATTC_SendIndConfirm (uint16_t conn_id, uint16_t handle)
560{
561    tBTA_GATTC_API_CONFIRM *p_buf =
562        (tBTA_GATTC_API_CONFIRM *)osi_calloc(sizeof(tBTA_GATTC_API_CONFIRM));
563
564    APPL_TRACE_API("%s conn_id=%d handle=0x%04x", __func__, conn_id, handle);
565
566    p_buf->hdr.event = BTA_GATTC_API_CONFIRM_EVT;
567    p_buf->hdr.layer_specific = conn_id;
568    p_buf->handle = handle;
569
570    bta_sys_sendmsg(p_buf);
571}
572
573/*******************************************************************************
574**
575** Function         BTA_GATTC_RegisterForNotifications
576**
577** Description      This function is called to register for notification of a service.
578**
579** Parameters       client_if - client interface.
580**                  bda - target GATT server.
581**                  handle - GATT characteristic handle.
582**
583** Returns          OK if registration succeed, otherwise failed.
584**
585*******************************************************************************/
586tBTA_GATT_STATUS BTA_GATTC_RegisterForNotifications (tBTA_GATTC_IF client_if,
587                                                     const BD_ADDR bda, uint16_t handle)
588{
589    tBTA_GATTC_RCB      *p_clreg;
590    tBTA_GATT_STATUS    status = BTA_GATT_ILLEGAL_PARAMETER;
591    uint8_t               i;
592
593    if (!handle)
594    {
595        APPL_TRACE_ERROR("deregistration failed, handle is 0");
596        return status;
597    }
598
599    if ((p_clreg = bta_gattc_cl_get_regcb(client_if)) != NULL)
600    {
601        for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i ++)
602        {
603            if ( p_clreg->notif_reg[i].in_use &&
604                 !memcmp(p_clreg->notif_reg[i].remote_bda, bda, BD_ADDR_LEN) &&
605                  p_clreg->notif_reg[i].handle == handle)
606            {
607                APPL_TRACE_WARNING("notification already registered");
608                status = BTA_GATT_OK;
609                break;
610            }
611        }
612        if (status != BTA_GATT_OK)
613        {
614            for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i ++)
615            {
616                if (!p_clreg->notif_reg[i].in_use)
617                {
618                    memset((void *)&p_clreg->notif_reg[i], 0, sizeof(tBTA_GATTC_NOTIF_REG));
619
620                    p_clreg->notif_reg[i].in_use = true;
621                    memcpy(p_clreg->notif_reg[i].remote_bda, bda, BD_ADDR_LEN);
622
623                    p_clreg->notif_reg[i].handle = handle;
624                    status = BTA_GATT_OK;
625                    break;
626                }
627            }
628            if (i == BTA_GATTC_NOTIF_REG_MAX)
629            {
630                status = BTA_GATT_NO_RESOURCES;
631                APPL_TRACE_ERROR("Max Notification Reached, registration failed.");
632            }
633        }
634    }
635    else
636    {
637        APPL_TRACE_ERROR("Client_if: %d Not Registered", client_if);
638    }
639
640    return status;
641}
642
643/*******************************************************************************
644**
645** Function         BTA_GATTC_DeregisterForNotifications
646**
647** Description      This function is called to de-register for notification of a servbice.
648**
649** Parameters       client_if - client interface.
650**                  remote_bda - target GATT server.
651**                  handle - GATT characteristic handle.
652**
653** Returns          OK if deregistration succeed, otherwise failed.
654**
655*******************************************************************************/
656tBTA_GATT_STATUS BTA_GATTC_DeregisterForNotifications (tBTA_GATTC_IF client_if,
657                                                       const BD_ADDR bda, uint16_t handle)
658{
659    if (!handle) {
660        APPL_TRACE_ERROR("%s: deregistration failed, handle is 0", __func__);
661        return BTA_GATT_ILLEGAL_PARAMETER;
662    }
663
664    tBTA_GATTC_RCB *p_clreg = bta_gattc_cl_get_regcb(client_if);
665    if (p_clreg == NULL) {
666        APPL_TRACE_ERROR("%s client_if: %d not registered bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
667            __func__, client_if, bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
668        return BTA_GATT_ILLEGAL_PARAMETER;
669    }
670
671    for (int i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i ++) {
672        if (p_clreg->notif_reg[i].in_use &&
673            !memcmp(p_clreg->notif_reg[i].remote_bda, bda, BD_ADDR_LEN) &&
674            p_clreg->notif_reg[i].handle == handle) {
675            APPL_TRACE_DEBUG("%s deregistered bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
676                __func__, bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
677            memset(&p_clreg->notif_reg[i], 0, sizeof(tBTA_GATTC_NOTIF_REG));
678            return BTA_GATT_OK;
679        }
680    }
681
682    APPL_TRACE_ERROR("%s registration not found bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
683        __func__, bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
684    return BTA_GATT_ERROR;
685}
686
687/*******************************************************************************
688**
689** Function         BTA_GATTC_Refresh
690**
691** Description      Refresh the server cache of the remote device
692**
693** Parameters       remote_bda: remote device BD address.
694**
695** Returns          void
696**
697*******************************************************************************/
698void BTA_GATTC_Refresh(const BD_ADDR remote_bda)
699{
700    tBTA_GATTC_API_OPEN *p_buf =
701        (tBTA_GATTC_API_OPEN *)osi_malloc(sizeof(tBTA_GATTC_API_OPEN));
702
703    p_buf->hdr.event = BTA_GATTC_API_REFRESH_EVT;
704    memcpy(p_buf->remote_bda, remote_bda, BD_ADDR_LEN);
705
706    bta_sys_sendmsg(p_buf);
707}
708
709/*******************************************************************************
710**
711** Function         BTA_GATTC_Listen
712**
713** Description      Start advertisement to listen for connection request for a GATT
714**                  client application.
715**
716** Parameters       client_if: server interface.
717**                  start: to start or stop listening for connection
718**                  remote_bda: remote device BD address, if listen to all device
719**                              use NULL.
720**
721** Returns          void
722**
723*******************************************************************************/
724void BTA_GATTC_Listen(tBTA_GATTC_IF client_if, bool start, BD_ADDR_PTR target_bda)
725{
726    tBTA_GATTC_API_LISTEN *p_buf =
727        (tBTA_GATTC_API_LISTEN *)osi_malloc(sizeof(tBTA_GATTC_API_LISTEN) + BD_ADDR_LEN);
728
729    p_buf->hdr.event = BTA_GATTC_API_LISTEN_EVT;
730    p_buf->client_if = client_if;
731    p_buf->start = start;
732    if (target_bda) {
733        p_buf->remote_bda = (uint8_t*)(p_buf + 1);
734        memcpy(p_buf->remote_bda, target_bda, BD_ADDR_LEN);
735    } else {
736        p_buf->remote_bda = NULL;
737    }
738
739    bta_sys_sendmsg(p_buf);
740}
741
742/*******************************************************************************
743**
744** Function         BTA_GATTC_Broadcast
745**
746** Description      Start broadcasting (non-connectable advertisements)
747**
748** Parameters       client_if: client interface.
749**                  start: to start or stop listening for connection
750**
751** Returns          void
752**
753*******************************************************************************/
754void BTA_GATTC_Broadcast(tBTA_GATTC_IF client_if, bool start)
755{
756    tBTA_GATTC_API_LISTEN *p_buf =
757        (tBTA_GATTC_API_LISTEN *)osi_malloc(sizeof(tBTA_GATTC_API_LISTEN) + BD_ADDR_LEN);
758
759    p_buf->hdr.event = BTA_GATTC_API_BROADCAST_EVT;
760    p_buf->client_if = client_if;
761    p_buf->start = start;
762
763    bta_sys_sendmsg(p_buf);
764}
765
766#endif /* BTA_GATT_INCLUDED */
767