Home | History | Annotate | Download | only in gatt
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2003-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 file contains the GATT client action functions for the state
     22  *  machine.
     23  *
     24  ******************************************************************************/
     25 
     26 #include "bt_target.h"
     27 
     28 #include "utl.h"
     29 #include "gki.h"
     30 #include "bd.h"
     31 #include "bta_sys.h"
     32 
     33 #include "bta_gattc_int.h"
     34 #include "l2c_api.h"
     35 
     36 #if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE)
     37 #include "bta_hh_int.h"
     38 #endif
     39 
     40 #include <string.h>
     41 
     42 #if BTA_GATT_INCLUDED && BLE_INCLUDED == TRUE
     43 
     44 /*****************************************************************************
     45 **  Constants
     46 *****************************************************************************/
     47 static void bta_gattc_conn_cback(tGATT_IF gattc_if, BD_ADDR bda, UINT16 conn_id,
     48                                  BOOLEAN connected, tGATT_DISCONN_REASON reason,
     49                                  tBT_TRANSPORT transport);
     50 
     51 static void  bta_gattc_cmpl_cback(UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status,
     52                                   tGATT_CL_COMPLETE *p_data);
     53 
     54 static void bta_gattc_deregister_cmpl(tBTA_GATTC_RCB *p_clreg);
     55 static void bta_gattc_enc_cmpl_cback(tGATT_IF gattc_if, BD_ADDR bda);
     56 static void bta_gattc_cong_cback (UINT16 conn_id, BOOLEAN congested);
     57 
     58 static tGATT_CBACK bta_gattc_cl_cback =
     59 {
     60     bta_gattc_conn_cback,
     61     bta_gattc_cmpl_cback,
     62     bta_gattc_disc_res_cback,
     63     bta_gattc_disc_cmpl_cback,
     64     NULL,
     65     bta_gattc_enc_cmpl_cback,
     66     bta_gattc_cong_cback
     67 };
     68 
     69 /* opcode(tGATTC_OPTYPE) order has to be comply with internal event order */
     70 static UINT16 bta_gattc_opcode_to_int_evt[] =
     71 {
     72     BTA_GATTC_API_READ_EVT,
     73     BTA_GATTC_API_WRITE_EVT,
     74     BTA_GATTC_API_EXEC_EVT,
     75     BTA_GATTC_API_CFG_MTU_EVT
     76 };
     77 
     78 #if (BT_TRACE_VERBOSE == TRUE)
     79 static const char *bta_gattc_op_code_name[] =
     80 {
     81     "Unknown",
     82     "Discovery",
     83     "Read",
     84     "Write",
     85     "Exec",
     86     "Config",
     87     "Notification",
     88     "Indication"
     89 };
     90 #endif
     91 /*****************************************************************************
     92 **  Action Functions
     93 *****************************************************************************/
     94 
     95 /*******************************************************************************
     96 **
     97 ** Function         bta_gattc_enable
     98 **
     99 ** Description      Enables GATTC module
    100 **
    101 **
    102 ** Returns          void
    103 **
    104 *******************************************************************************/
    105 static void bta_gattc_enable(tBTA_GATTC_CB *p_cb)
    106 {
    107     APPL_TRACE_DEBUG("bta_gattc_enable");
    108 
    109     if (p_cb->state == BTA_GATTC_STATE_DISABLED)
    110     {
    111         /* initialize control block */
    112         memset(&bta_gattc_cb, 0, sizeof(tBTA_GATTC_CB));
    113         p_cb->state = BTA_GATTC_STATE_ENABLED;
    114     }
    115     else
    116     {
    117         APPL_TRACE_DEBUG("GATTC is arelady enabled");
    118     }
    119 }
    120 
    121 
    122 /*******************************************************************************
    123 **
    124 ** Function         bta_gattc_disable
    125 **
    126 ** Description      Disable GATTC module by cleaning up all active connections
    127 **                  and deregister all application.
    128 **
    129 ** Returns          void
    130 **
    131 *******************************************************************************/
    132 void bta_gattc_disable(tBTA_GATTC_CB *p_cb)
    133 {
    134     UINT8           i;
    135 
    136     APPL_TRACE_DEBUG("bta_gattc_disable");
    137 
    138     if (p_cb->state != BTA_GATTC_STATE_ENABLED)
    139     {
    140         APPL_TRACE_ERROR("not enabled or disable in pogress");
    141         return;
    142     }
    143 
    144     for (i = 0; i <BTA_GATTC_CL_MAX; i ++)
    145     {
    146         if (p_cb->cl_rcb[i].in_use)
    147         {
    148             p_cb->state = BTA_GATTC_STATE_DISABLING;
    149             /* don't deregister HH GATT IF */
    150             /* HH GATT IF will be deregistered by bta_hh_le_deregister when disable HH */
    151 #if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE)
    152             if (!bta_hh_le_is_hh_gatt_if(p_cb->cl_rcb[i].client_if)) {
    153 #endif
    154                 bta_gattc_deregister(p_cb, &p_cb->cl_rcb[i]);
    155 #if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE)
    156             }
    157 #endif
    158         }
    159     }
    160 
    161     /* no registered apps, indicate disable completed */
    162     if (p_cb->state != BTA_GATTC_STATE_DISABLING)
    163     {
    164         p_cb->state = BTA_GATTC_STATE_DISABLED;
    165         memset(p_cb, 0, sizeof(tBTA_GATTC_CB));
    166     }
    167 }
    168 
    169 /*******************************************************************************
    170 **
    171 ** Function         bta_gattc_register
    172 **
    173 ** Description      Register a GATT client application with BTA.
    174 **
    175 ** Returns          void
    176 **
    177 *******************************************************************************/
    178 void bta_gattc_register(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_data)
    179 {
    180     tBTA_GATTC               cb_data;
    181     UINT8                    i;
    182     tBT_UUID                 *p_app_uuid = &p_data->api_reg.app_uuid;
    183     tBTA_GATTC_INT_START_IF  *p_buf;
    184     tBTA_GATT_STATUS         status = BTA_GATT_NO_RESOURCES;
    185 
    186 
    187     APPL_TRACE_DEBUG("bta_gattc_register state %d",p_cb->state);
    188     memset(&cb_data, 0, sizeof(cb_data));
    189     cb_data.reg_oper.status = BTA_GATT_NO_RESOURCES;
    190 
    191      /* check if  GATTC module is already enabled . Else enable */
    192      if (p_cb->state == BTA_GATTC_STATE_DISABLED)
    193      {
    194          bta_gattc_enable (p_cb);
    195      }
    196     /* todo need to check duplicate uuid */
    197     for (i = 0; i < BTA_GATTC_CL_MAX; i ++)
    198     {
    199         if (!p_cb->cl_rcb[i].in_use)
    200         {
    201             if ((p_app_uuid == NULL) || (p_cb->cl_rcb[i].client_if = GATT_Register(p_app_uuid, &bta_gattc_cl_cback)) == 0)
    202             {
    203                 APPL_TRACE_ERROR("Register with GATT stack failed.");
    204                 status = BTA_GATT_ERROR;
    205             }
    206             else
    207             {
    208                 p_cb->cl_rcb[i].in_use = TRUE;
    209                 p_cb->cl_rcb[i].p_cback = p_data->api_reg.p_cback;
    210                 memcpy(&p_cb->cl_rcb[i].app_uuid, p_app_uuid, sizeof(tBT_UUID));
    211 
    212                 /* BTA use the same client interface as BTE GATT statck */
    213                 cb_data.reg_oper.client_if = p_cb->cl_rcb[i].client_if;
    214 
    215                 if ((p_buf = (tBTA_GATTC_INT_START_IF *) GKI_getbuf(sizeof(tBTA_GATTC_INT_START_IF))) != NULL)
    216                 {
    217                     p_buf->hdr.event    = BTA_GATTC_INT_START_IF_EVT;
    218                     p_buf->client_if    = p_cb->cl_rcb[i].client_if;
    219 
    220                     bta_sys_sendmsg(p_buf);
    221                     status = BTA_GATT_OK;
    222                 }
    223                 else
    224                 {
    225                     GATT_Deregister(p_cb->cl_rcb[i].client_if);
    226 
    227                     status = BTA_GATT_NO_RESOURCES;
    228                     memset( &p_cb->cl_rcb[i], 0 , sizeof(tBTA_GATTC_RCB));
    229                 }
    230                 break;
    231             }
    232         }
    233     }
    234 
    235     /* callback with register event */
    236     if (p_data->api_reg.p_cback)
    237     {
    238         if (p_app_uuid != NULL)
    239             memcpy(&(cb_data.reg_oper.app_uuid),p_app_uuid,sizeof(tBT_UUID));
    240 
    241         cb_data.reg_oper.status = status;
    242         (*p_data->api_reg.p_cback)(BTA_GATTC_REG_EVT,  (tBTA_GATTC *)&cb_data);
    243     }
    244 }
    245 /*******************************************************************************
    246 **
    247 ** Function         bta_gattc_start_if
    248 **
    249 ** Description      start an application interface.
    250 **
    251 ** Returns          none.
    252 **
    253 *******************************************************************************/
    254 void bta_gattc_start_if(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg)
    255 {
    256     UNUSED(p_cb);
    257 
    258     if (bta_gattc_cl_get_regcb(p_msg->int_start_if.client_if) !=NULL )
    259     {
    260         GATT_StartIf(p_msg->int_start_if.client_if);
    261     }
    262     else
    263     {
    264         APPL_TRACE_ERROR("Unable to start app.: Unknown interface =%d",p_msg->int_start_if.client_if );
    265     }
    266 }
    267 /*******************************************************************************
    268 **
    269 ** Function         bta_gattc_deregister
    270 **
    271 ** Description      De-Register a GATT client application with BTA.
    272 **
    273 ** Returns          void
    274 **
    275 *******************************************************************************/
    276 void bta_gattc_deregister(tBTA_GATTC_CB *p_cb, tBTA_GATTC_RCB  *p_clreg)
    277 {
    278     UINT8               i;
    279     BT_HDR              buf;
    280 
    281     if (p_clreg != NULL)
    282     {
    283         /* remove bg connection associated with this rcb */
    284         for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX; i ++)
    285         {
    286             if (p_cb->bg_track[i].in_use)
    287             {
    288                 if (p_cb->bg_track[i].cif_mask & (1 <<(p_clreg->client_if - 1)))
    289                 {
    290                     bta_gattc_mark_bg_conn(p_clreg->client_if, p_cb->bg_track[i].remote_bda, FALSE, FALSE);
    291                     GATT_CancelConnect(p_clreg->client_if, p_cb->bg_track[i].remote_bda, FALSE);
    292                 }
    293                 if (p_cb->bg_track[i].cif_adv_mask & (1 <<(p_clreg->client_if - 1)))
    294                 {
    295                     bta_gattc_mark_bg_conn(p_clreg->client_if, p_cb->bg_track[i].remote_bda, FALSE, TRUE);
    296                 }
    297             }
    298         }
    299 
    300         if (p_clreg->num_clcb > 0)
    301         {
    302             /* close all CLCB related to this app */
    303             for (i= 0; i < BTA_GATTC_CLCB_MAX; i ++)
    304             {
    305                 if (p_cb->clcb[i].in_use && (p_cb->clcb[i].p_rcb == p_clreg))
    306                 {
    307                     p_clreg->dereg_pending = TRUE;
    308 
    309                     buf.event = BTA_GATTC_API_CLOSE_EVT;
    310                     buf.layer_specific = p_cb->clcb[i].bta_conn_id;
    311                     bta_gattc_close(&p_cb->clcb[i], (tBTA_GATTC_DATA *)&buf)  ;
    312                 }
    313             }
    314         }
    315         else
    316             bta_gattc_deregister_cmpl(p_clreg);
    317     }
    318     else
    319     {
    320         APPL_TRACE_ERROR("bta_gattc_deregister Deregister Failedm unknown client cif");
    321     }
    322 }
    323 /*******************************************************************************
    324 **
    325 ** Function         bta_gattc_process_api_open
    326 **
    327 ** Description      process connect API request.
    328 **
    329 ** Returns          void
    330 **
    331 *******************************************************************************/
    332 void bta_gattc_process_api_open (tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg)
    333 {
    334     UINT16 event = ((BT_HDR *)p_msg)->event;
    335     tBTA_GATTC_CLCB *p_clcb = NULL;
    336     tBTA_GATTC_RCB *p_clreg = bta_gattc_cl_get_regcb(p_msg->api_conn.client_if);
    337     UNUSED(p_cb);
    338 
    339     if (p_clreg != NULL)
    340     {
    341         if (p_msg->api_conn.is_direct)
    342         {
    343             if ((p_clcb = bta_gattc_find_alloc_clcb(p_msg->api_conn.client_if,
    344                                                     p_msg->api_conn.remote_bda,
    345                                                     p_msg->api_conn.transport)) != NULL)
    346             {
    347                 bta_gattc_sm_execute(p_clcb, event, p_msg);
    348             }
    349             else
    350             {
    351                 APPL_TRACE_ERROR("No resources to open a new connection.");
    352 
    353                 bta_gattc_send_open_cback(p_clreg,
    354                                           BTA_GATT_NO_RESOURCES,
    355                                           p_msg->api_conn.remote_bda,
    356                                           BTA_GATT_INVALID_CONN_ID,
    357                                           p_msg->api_conn.transport, 0);
    358             }
    359         }
    360         else
    361         {
    362             bta_gattc_init_bk_conn(&p_msg->api_conn, p_clreg);
    363         }
    364     }
    365     else
    366     {
    367         APPL_TRACE_ERROR("bta_gattc_process_api_open Failed, unknown client_if: %d",
    368                         p_msg->api_conn.client_if);
    369     }
    370 }
    371 /*******************************************************************************
    372 **
    373 ** Function         bta_gattc_process_api_open_cancel
    374 **
    375 ** Description      process connect API request.
    376 **
    377 ** Returns          void
    378 **
    379 *******************************************************************************/
    380 void bta_gattc_process_api_open_cancel (tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg)
    381 {
    382     UINT16 event = ((BT_HDR *)p_msg)->event;
    383     tBTA_GATTC_CLCB *p_clcb = NULL;
    384     tBTA_GATTC_RCB *p_clreg;
    385     tBTA_GATTC cb_data;
    386     UNUSED(p_cb);
    387 
    388     if (p_msg->api_cancel_conn.is_direct)
    389     {
    390         if ((p_clcb = bta_gattc_find_clcb_by_cif(p_msg->api_cancel_conn.client_if,
    391                                                  p_msg->api_cancel_conn.remote_bda,
    392                                                  BTA_GATT_TRANSPORT_LE)) != NULL)
    393         {
    394             bta_gattc_sm_execute(p_clcb, event, p_msg);
    395         }
    396         else
    397         {
    398             APPL_TRACE_ERROR("No such connection need to be cancelled");
    399 
    400             p_clreg = bta_gattc_cl_get_regcb(p_msg->api_cancel_conn.client_if);
    401 
    402             if (p_clreg && p_clreg->p_cback)
    403             {
    404                 cb_data.status = BTA_GATT_ERROR;
    405                 (*p_clreg->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
    406             }
    407         }
    408     }
    409     else
    410     {
    411         bta_gattc_cancel_bk_conn(&p_msg->api_cancel_conn);
    412 
    413     }
    414 }
    415 
    416 /*******************************************************************************
    417 **
    418 ** Function         bta_gattc_process_enc_cmpl
    419 **
    420 ** Description      process encryption complete message.
    421 **
    422 ** Returns          void
    423 **
    424 *******************************************************************************/
    425 void bta_gattc_process_enc_cmpl(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg)
    426 {
    427     tBTA_GATTC_RCB *p_clreg;
    428     tBTA_GATTC cb_data;
    429     UNUSED(p_cb);
    430 
    431     p_clreg = bta_gattc_cl_get_regcb(p_msg->enc_cmpl.client_if);
    432 
    433     if (p_clreg && p_clreg->p_cback)
    434     {
    435         memset(&cb_data, 0, sizeof(tBTA_GATTC));
    436 
    437         cb_data.enc_cmpl.client_if = p_msg->enc_cmpl.client_if;
    438         bdcpy(cb_data.enc_cmpl.remote_bda, p_msg->enc_cmpl.remote_bda);
    439 
    440         (*p_clreg->p_cback)(BTA_GATTC_ENC_CMPL_CB_EVT, &cb_data);
    441     }
    442 }
    443 
    444 /*******************************************************************************
    445 **
    446 ** Function         bta_gattc_cancel_open_error
    447 **
    448 ** Description
    449 **
    450 ** Returns          void
    451 **
    452 *******************************************************************************/
    453 void bta_gattc_cancel_open_error(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
    454 {
    455     tBTA_GATTC cb_data;
    456     UNUSED(p_data);
    457 
    458     cb_data.status=BTA_GATT_ERROR;
    459 
    460     if ( p_clcb && p_clcb->p_rcb && p_clcb->p_rcb->p_cback )
    461         (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
    462 }
    463 
    464 /*******************************************************************************
    465 **
    466 ** Function         bta_gattc_open_error
    467 **
    468 ** Description
    469 **
    470 ** Returns          void
    471 **
    472 *******************************************************************************/
    473 void bta_gattc_open_error(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
    474 {
    475     UNUSED(p_data);
    476 
    477     APPL_TRACE_ERROR("Connection already opened. wrong state");
    478 
    479     bta_gattc_send_open_cback(p_clcb->p_rcb,
    480                               BTA_GATT_OK,
    481                               p_clcb->bda,
    482                               p_clcb->bta_conn_id,
    483                               p_clcb->transport,
    484                               0);
    485 }
    486 /*******************************************************************************
    487 **
    488 ** Function         bta_gattc_open_fail
    489 **
    490 ** Description
    491 **
    492 ** Returns          void
    493 **
    494 *******************************************************************************/
    495 void bta_gattc_open_fail(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
    496 {
    497     UNUSED(p_data);
    498 
    499     bta_gattc_send_open_cback(p_clcb->p_rcb,
    500                               BTA_GATT_ERROR,
    501                               p_clcb->bda,
    502                               p_clcb->bta_conn_id,
    503                               p_clcb->transport,
    504                               0);
    505     /* open failure, remove clcb */
    506     bta_gattc_clcb_dealloc(p_clcb);
    507 }
    508 
    509 /*******************************************************************************
    510 **
    511 ** Function         bta_gattc_open
    512 **
    513 ** Description      Process API connection function.
    514 **
    515 ** Returns          void
    516 **
    517 *******************************************************************************/
    518 void bta_gattc_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
    519 {
    520     tBTA_GATTC_DATA gattc_data;
    521 
    522     /* open/hold a connection */
    523     if (!GATT_Connect(p_clcb->p_rcb->client_if, p_data->api_conn.remote_bda,
    524                       TRUE, p_data->api_conn.transport))
    525     {
    526         APPL_TRACE_ERROR("Connection open failure");
    527 
    528         bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_OPEN_FAIL_EVT, p_data);
    529     }
    530     else
    531     {
    532         /* a connected remote device */
    533         if (GATT_GetConnIdIfConnected(p_clcb->p_rcb->client_if,
    534                                       p_data->api_conn.remote_bda,
    535                                       &p_clcb->bta_conn_id,
    536                                       p_data->api_conn.transport))
    537         {
    538             gattc_data.int_conn.hdr.layer_specific = p_clcb->bta_conn_id;
    539 
    540             bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, &gattc_data);
    541         }
    542         /* else wait for the callback event */
    543     }
    544 }
    545 /*******************************************************************************
    546 **
    547 ** Function         bta_gattc_init_bk_conn
    548 **
    549 ** Description      Process API Open for a background connection
    550 **
    551 ** Returns          void
    552 **
    553 *******************************************************************************/
    554 void bta_gattc_init_bk_conn(tBTA_GATTC_API_OPEN *p_data, tBTA_GATTC_RCB *p_clreg)
    555 {
    556     tBTA_GATT_STATUS         status = BTA_GATT_NO_RESOURCES;
    557     UINT16                   conn_id;
    558     tBTA_GATTC_CLCB         *p_clcb;
    559     tBTA_GATTC_DATA         gattc_data;
    560 
    561     if (bta_gattc_mark_bg_conn(p_data->client_if, p_data->remote_bda, TRUE, FALSE))
    562     {
    563         /* always call open to hold a connection */
    564         if (!GATT_Connect(p_data->client_if, p_data->remote_bda, FALSE, p_data->transport))
    565         {
    566             status = BTA_GATT_ERROR;
    567             APPL_TRACE_ERROR("bta_gattc_init_bk_conn failed");
    568         }
    569         else
    570         {
    571             status = BTA_GATT_OK;
    572 
    573             /* if is a connected remote device */
    574             if (GATT_GetConnIdIfConnected(p_data->client_if,
    575                                           p_data->remote_bda,
    576                                           &conn_id,
    577                                           p_data->transport))
    578             {
    579                 if ((p_clcb = bta_gattc_find_alloc_clcb(p_data->client_if, p_data->remote_bda,
    580                     BTA_GATT_TRANSPORT_LE)) != NULL)
    581                 {
    582                     gattc_data.hdr.layer_specific = p_clcb->bta_conn_id = conn_id;
    583 
    584                     /* open connection */
    585                     bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, &gattc_data);
    586                     status = BTA_GATT_OK;
    587                 }
    588             }
    589         }
    590     }
    591 
    592     /* open failure, report OPEN_EVT */
    593     if (status != BTA_GATT_OK)
    594     {
    595         bta_gattc_send_open_cback(p_clreg, status, p_data->remote_bda,
    596         BTA_GATT_INVALID_CONN_ID, BTA_GATT_TRANSPORT_LE, 0);
    597     }
    598 }
    599 /*******************************************************************************
    600 **
    601 ** Function         bta_gattc_cancel_bk_conn
    602 **
    603 ** Description      Process API Cancel Open for a background connection
    604 **
    605 ** Returns          void
    606 **
    607 *******************************************************************************/
    608 void bta_gattc_cancel_bk_conn(tBTA_GATTC_API_CANCEL_OPEN *p_data)
    609 {
    610     tBTA_GATTC_RCB      *p_clreg;
    611     tBTA_GATTC          cb_data;
    612     cb_data.status = BTA_GATT_ERROR;
    613 
    614     /* remove the device from the bg connection mask */
    615     if (bta_gattc_mark_bg_conn(p_data->client_if, p_data->remote_bda, FALSE, FALSE))
    616     {
    617         if (GATT_CancelConnect(p_data->client_if, p_data->remote_bda, FALSE))
    618         {
    619             cb_data.status = BTA_GATT_OK;
    620         }
    621         else
    622         {
    623             APPL_TRACE_ERROR("bta_gattc_cancel_bk_conn failed");
    624         }
    625     }
    626     p_clreg = bta_gattc_cl_get_regcb(p_data->client_if);
    627 
    628     if (p_clreg && p_clreg->p_cback)
    629     {
    630         (*p_clreg->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
    631     }
    632 
    633 }
    634 /*******************************************************************************
    635 **
    636 ** Function         bta_gattc_int_cancel_open_ok
    637 **
    638 ** Description
    639 **
    640 ** Returns          void
    641 **
    642 *******************************************************************************/
    643 void bta_gattc_cancel_open_ok(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
    644 {
    645     tBTA_GATTC          cb_data;
    646     UNUSED(p_data);
    647 
    648     if ( p_clcb->p_rcb->p_cback )
    649     {
    650         cb_data.status = BTA_GATT_OK;
    651         (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
    652     }
    653 
    654     bta_gattc_clcb_dealloc(p_clcb);
    655 }
    656 /*******************************************************************************
    657 **
    658 ** Function         bta_gattc_cancel_open
    659 **
    660 ** Description
    661 **
    662 ** Returns          void
    663 **
    664 *******************************************************************************/
    665 void bta_gattc_cancel_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
    666 {
    667     tBTA_GATTC          cb_data;
    668 
    669     if (GATT_CancelConnect(p_clcb->p_rcb->client_if, p_data->api_cancel_conn.remote_bda, TRUE))
    670     {
    671         bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CANCEL_OPEN_OK_EVT, p_data);
    672     }
    673     else
    674     {
    675         if ( p_clcb->p_rcb->p_cback )
    676         {
    677             cb_data.status = BTA_GATT_ERROR;
    678             (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
    679         }
    680     }
    681 }
    682 /*******************************************************************************
    683 **
    684 ** Function         bta_gattc_conn
    685 **
    686 ** Description      receive connection callback from stack
    687 **
    688 ** Returns          void
    689 **
    690 *******************************************************************************/
    691 void bta_gattc_conn(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
    692 {
    693     tBTA_GATTC_IF   gatt_if;
    694     APPL_TRACE_DEBUG("bta_gattc_conn server cache state=%d",p_clcb->p_srcb->state);
    695 
    696     if (p_data != NULL)
    697     {
    698         APPL_TRACE_DEBUG("bta_gattc_conn conn_id=%d",p_data->hdr.layer_specific);
    699         p_clcb->bta_conn_id  = p_data->int_conn.hdr.layer_specific;
    700 
    701         GATT_GetConnectionInfor(p_data->hdr.layer_specific,
    702                                 &gatt_if, p_clcb->bda, &p_clcb->transport);
    703     }
    704 
    705         p_clcb->p_srcb->connected = TRUE;
    706 
    707         if (p_clcb->p_srcb->mtu == 0)
    708             p_clcb->p_srcb->mtu = GATT_DEF_BLE_MTU_SIZE;
    709 
    710         /* start database cache if needed */
    711         if (p_clcb->p_srcb->p_srvc_cache == NULL ||
    712             p_clcb->p_srcb->state != BTA_GATTC_SERV_IDLE)
    713         {
    714             if (p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE)
    715             {
    716                 p_clcb->p_srcb->state = BTA_GATTC_SERV_LOAD;
    717                 bta_gattc_sm_execute(p_clcb, BTA_GATTC_START_CACHE_EVT, NULL);
    718             }
    719             else /* cache is building */
    720                 p_clcb->state = BTA_GATTC_DISCOVER_ST;
    721         }
    722 
    723         else
    724         {
    725             /* a pending service handle change indication */
    726             if (p_clcb->p_srcb->srvc_hdl_chg)
    727             {
    728                 p_clcb->p_srcb->srvc_hdl_chg = FALSE;
    729                 /* start discovery */
    730                 bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
    731             }
    732         }
    733 
    734         if (p_clcb->p_rcb)
    735         {
    736         /* there is no RM for GATT */
    737         if (p_clcb->transport == BTA_TRANSPORT_BR_EDR)
    738             bta_sys_conn_open(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
    739 
    740         bta_gattc_send_open_cback(p_clcb->p_rcb,
    741                                   BTA_GATT_OK,
    742                                   p_clcb->bda,
    743                                   p_clcb->bta_conn_id,
    744                                   p_clcb->transport,
    745                                   p_clcb->p_srcb->mtu);
    746         }
    747     }
    748 /*******************************************************************************
    749 **
    750 ** Function         bta_gattc_close_fail
    751 **
    752 ** Description      close a  connection.
    753 **
    754 ** Returns          void
    755 **
    756 *******************************************************************************/
    757 void bta_gattc_close_fail(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
    758 {
    759     tBTA_GATTC           cb_data;
    760 
    761     if ( p_clcb->p_rcb->p_cback )
    762     {
    763         memset(&cb_data, 0, sizeof(tBTA_GATTC));
    764         cb_data.close.client_if = p_clcb->p_rcb->client_if;
    765         cb_data.close.conn_id   = p_data->hdr.layer_specific;
    766         bdcpy(cb_data.close.remote_bda, p_clcb->bda);
    767         cb_data.close.status    = BTA_GATT_ERROR;
    768         cb_data.close.reason    = BTA_GATT_CONN_NONE;
    769 
    770 
    771         (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CLOSE_EVT, &cb_data);
    772     }
    773 }
    774 /*******************************************************************************
    775 **
    776 ** Function         bta_gattc_api_close
    777 **
    778 ** Description      close a GATTC connection.
    779 **
    780 ** Returns          void
    781 **
    782 *******************************************************************************/
    783 void bta_gattc_close(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
    784 {
    785     tBTA_GATTC_CBACK    *p_cback = p_clcb->p_rcb->p_cback;
    786     tBTA_GATTC_RCB      *p_clreg = p_clcb->p_rcb;
    787     tBTA_GATTC           cb_data;
    788 
    789     APPL_TRACE_DEBUG("bta_gattc_close conn_id=%d",p_clcb->bta_conn_id);
    790 
    791     cb_data.close.client_if = p_clcb->p_rcb->client_if;
    792     cb_data.close.conn_id   = p_clcb->bta_conn_id;
    793     cb_data.close.reason    = p_clcb->reason;
    794     cb_data.close.status    = p_clcb->status;
    795     bdcpy(cb_data.close.remote_bda, p_clcb->bda);
    796 
    797     if (p_clcb->transport == BTA_TRANSPORT_BR_EDR)
    798         bta_sys_conn_close( BTA_ID_GATTC ,BTA_ALL_APP_ID, p_clcb->bda);
    799 
    800     bta_gattc_clcb_dealloc(p_clcb);
    801 
    802     if (p_data->hdr.event == BTA_GATTC_API_CLOSE_EVT)
    803     {
    804         cb_data.close.status = GATT_Disconnect(p_data->hdr.layer_specific);
    805     }
    806     else if (p_data->hdr.event == BTA_GATTC_INT_DISCONN_EVT)
    807     {
    808         cb_data.close.status = p_data->int_conn.reason;
    809     }
    810 
    811     if(p_cback)
    812         (* p_cback)(BTA_GATTC_CLOSE_EVT,   (tBTA_GATTC *)&cb_data);
    813 
    814     if (p_clreg->num_clcb == 0 && p_clreg->dereg_pending)
    815     {
    816         bta_gattc_deregister_cmpl(p_clreg);
    817     }
    818 }
    819 /*******************************************************************************
    820 **
    821 ** Function         bta_gattc_reset_discover_st
    822 **
    823 ** Description      when a SRCB finished discovery, tell all related clcb.
    824 **
    825 ** Returns          None.
    826 **
    827 *******************************************************************************/
    828 void bta_gattc_reset_discover_st(tBTA_GATTC_SERV *p_srcb, tBTA_GATT_STATUS status)
    829 {
    830     tBTA_GATTC_CB   *p_cb = &bta_gattc_cb;
    831     UINT8 i;
    832 
    833     for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++)
    834     {
    835         if (p_cb->clcb[i].p_srcb == p_srcb)
    836         {
    837             p_cb->clcb[i].status = status;
    838             bta_gattc_sm_execute(&p_cb->clcb[i], BTA_GATTC_DISCOVER_CMPL_EVT, NULL);
    839         }
    840     }
    841 }
    842 /*******************************************************************************
    843 **
    844 ** Function         bta_gattc_disc_close
    845 **
    846 ** Description      close a GATTC connection while in discovery state.
    847 **
    848 ** Returns          void
    849 **
    850 *******************************************************************************/
    851 void bta_gattc_disc_close(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
    852 {
    853     APPL_TRACE_DEBUG("Discovery cancel conn_id=%d",p_clcb->bta_conn_id);
    854     if (p_clcb->disc_active)
    855         bta_gattc_reset_discover_st(p_clcb->p_srcb, BTA_GATT_ERROR);
    856     else
    857         p_clcb->state = BTA_GATTC_CONN_ST;
    858 }
    859 /*******************************************************************************
    860 **
    861 ** Function         bta_gattc_set_discover_st
    862 **
    863 ** Description      when a SRCB start discovery, tell all related clcb and set
    864 **                  the state.
    865 **
    866 ** Returns          None.
    867 **
    868 *******************************************************************************/
    869 void bta_gattc_set_discover_st(tBTA_GATTC_SERV *p_srcb)
    870 {
    871     tBTA_GATTC_CB   *p_cb = &bta_gattc_cb;
    872     UINT8   i;
    873 
    874 #if BLE_INCLUDED == TRUE
    875     L2CA_EnableUpdateBleConnParams(p_srcb->server_bda, FALSE);
    876 #endif
    877     for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++)
    878     {
    879         if (p_cb->clcb[i].p_srcb == p_srcb)
    880         {
    881             p_cb->clcb[i].status = BTA_GATT_OK;
    882             p_cb->clcb[i].state = BTA_GATTC_DISCOVER_ST;
    883         }
    884     }
    885 }
    886 /*******************************************************************************
    887 **
    888 ** Function         bta_gattc_restart_discover
    889 **
    890 ** Description      process service change in discovery state, mark up the auto
    891 **                  update flag and set status to be discovery cancel for current
    892 **                  discovery.
    893 **
    894 ** Returns          None.
    895 **
    896 *******************************************************************************/
    897 void bta_gattc_restart_discover(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
    898 {
    899     UNUSED(p_data);
    900 
    901     p_clcb->status      = BTA_GATT_CANCEL;
    902     p_clcb->auto_update = BTA_GATTC_DISC_WAITING;
    903 }
    904 
    905 /*******************************************************************************
    906 **
    907 ** Function         bta_gattc_cfg_mtu
    908 **
    909 ** Description      Configure MTU size on the GATT connection.
    910 **
    911 ** Returns          None.
    912 **
    913 *******************************************************************************/
    914 void bta_gattc_cfg_mtu(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
    915 {
    916     tBTA_GATTC_OP_CMPL  op_cmpl;
    917     tBTA_GATT_STATUS    status;
    918 
    919     if (bta_gattc_enqueue(p_clcb, p_data))
    920     {
    921         status = GATTC_ConfigureMTU (p_clcb->bta_conn_id, p_data->api_mtu.mtu);
    922 
    923         /* if failed, return callback here */
    924         if (status != GATT_SUCCESS && status != GATT_CMD_STARTED)
    925         {
    926             memset(&op_cmpl, 0, sizeof(tBTA_GATTC_OP_CMPL));
    927 
    928             op_cmpl.status  = status;
    929             op_cmpl.op_code = GATTC_OPTYPE_CONFIG;
    930             op_cmpl.p_cmpl  = NULL;
    931 
    932             bta_gattc_sm_execute(p_clcb, BTA_GATTC_OP_CMPL_EVT, (tBTA_GATTC_DATA *)&op_cmpl);
    933         }
    934     }
    935 }
    936 /*******************************************************************************
    937 **
    938 ** Function         bta_gattc_start_discover
    939 **
    940 ** Description      Start a discovery on server.
    941 **
    942 ** Returns          None.
    943 **
    944 *******************************************************************************/
    945 void bta_gattc_start_discover(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
    946 {
    947     UNUSED(p_data);
    948 
    949     APPL_TRACE_DEBUG("bta_gattc_start_discover conn_id=%d p_clcb->p_srcb->state = %d ",
    950         p_clcb->bta_conn_id, p_clcb->p_srcb->state);
    951 
    952     if (((p_clcb->p_q_cmd == NULL || p_clcb->auto_update == BTA_GATTC_REQ_WAITING) &&
    953         p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE) ||
    954         p_clcb->p_srcb->state == BTA_GATTC_SERV_DISC)
    955     /* no pending operation, start discovery right away */
    956     {
    957         p_clcb->auto_update = BTA_GATTC_NO_SCHEDULE;
    958 
    959         if (p_clcb->p_srcb != NULL)
    960         {
    961             /* clear the service change mask */
    962             p_clcb->p_srcb->srvc_hdl_chg = FALSE;
    963             p_clcb->p_srcb->update_count = 0;
    964             p_clcb->p_srcb->state = BTA_GATTC_SERV_DISC_ACT;
    965 
    966             if (p_clcb->transport == BTA_TRANSPORT_LE)
    967                 L2CA_EnableUpdateBleConnParams(p_clcb->p_srcb->server_bda, FALSE);
    968 
    969             /* set all srcb related clcb into discovery ST */
    970             bta_gattc_set_discover_st(p_clcb->p_srcb);
    971 
    972             if ((p_clcb->status = bta_gattc_init_cache(p_clcb->p_srcb)) == BTA_GATT_OK)
    973             {
    974                 p_clcb->status = bta_gattc_discover_pri_service(p_clcb->bta_conn_id,
    975                                                                p_clcb->p_srcb, GATT_DISC_SRVC_ALL);
    976             }
    977             if (p_clcb->status != BTA_GATT_OK)
    978             {
    979                 APPL_TRACE_ERROR("discovery on server failed");
    980                 bta_gattc_reset_discover_st(p_clcb->p_srcb, p_clcb->status);
    981             }
    982             else
    983                 p_clcb->disc_active = TRUE;
    984         }
    985         else
    986         {
    987             APPL_TRACE_ERROR("unknown device, can not start discovery");
    988         }
    989     }
    990     /* pending operation, wait until it finishes */
    991     else
    992     {
    993         p_clcb->auto_update = BTA_GATTC_DISC_WAITING;
    994 
    995         if (p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE)
    996             p_clcb->state = BTA_GATTC_CONN_ST; /* set clcb state */
    997     }
    998 
    999 }
   1000 /*******************************************************************************
   1001 **
   1002 ** Function         bta_gattc_disc_cmpl
   1003 **
   1004 ** Description      discovery on server is finished
   1005 **
   1006 ** Returns          None.
   1007 **
   1008 *******************************************************************************/
   1009 void bta_gattc_disc_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
   1010 {
   1011     tBTA_GATTC_DATA *p_q_cmd = p_clcb->p_q_cmd;
   1012     UNUSED(p_data);
   1013 
   1014     APPL_TRACE_DEBUG("bta_gattc_disc_cmpl conn_id=%d",p_clcb->bta_conn_id);
   1015 
   1016 #if BLE_INCLUDED == TRUE
   1017     if(p_clcb->transport == BTA_TRANSPORT_LE)
   1018         L2CA_EnableUpdateBleConnParams(p_clcb->p_srcb->server_bda, TRUE);
   1019 #endif
   1020     p_clcb->p_srcb->state = BTA_GATTC_SERV_IDLE;
   1021     p_clcb->disc_active = FALSE;
   1022 
   1023     if (p_clcb->status != GATT_SUCCESS)
   1024     {
   1025         /* clean up cache */
   1026         if(p_clcb->p_srcb && p_clcb->p_srcb->p_srvc_cache)
   1027         {
   1028             while (p_clcb->p_srcb->cache_buffer.p_first)
   1029             {
   1030                 GKI_freebuf (GKI_dequeue (&p_clcb->p_srcb->cache_buffer));
   1031             }
   1032             p_clcb->p_srcb->p_srvc_cache = NULL;
   1033         }
   1034 
   1035         /* used to reset cache in application */
   1036         bta_gattc_co_cache_reset(p_clcb->p_srcb->server_bda);
   1037     }
   1038     /* release pending attribute list buffer */
   1039     utl_freebuf((void **)&p_clcb->p_srcb->p_srvc_list);
   1040 
   1041     if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING)
   1042     {
   1043         /* start discovery again */
   1044         bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
   1045     }
   1046     /* get any queued command to proceed */
   1047     else if (p_q_cmd != NULL)
   1048     {
   1049         p_clcb->p_q_cmd = NULL;
   1050 
   1051         bta_gattc_sm_execute(p_clcb, p_q_cmd->hdr.event, p_q_cmd);
   1052         /* if the command executed requeued the cmd, we don't
   1053          * want to free the underlying buffer that's being
   1054          * referenced by p_clcb->p_q_cmd
   1055          */
   1056         if (p_q_cmd != p_clcb->p_q_cmd) {
   1057             utl_freebuf((void **)&p_q_cmd);
   1058         }
   1059     }
   1060 }
   1061 /*******************************************************************************
   1062 **
   1063 ** Function         bta_gattc_read
   1064 **
   1065 ** Description      Read an attribute
   1066 **
   1067 ** Returns          None.
   1068 **
   1069 *******************************************************************************/
   1070 void bta_gattc_read(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
   1071 {
   1072     UINT16 handle = 0;
   1073     tGATT_READ_PARAM    read_param;
   1074     tBTA_GATTC_OP_CMPL  op_cmpl;
   1075 
   1076     memset (&read_param, 0 ,sizeof(tGATT_READ_PARAM));
   1077     memset (&op_cmpl, 0 ,sizeof(tBTA_GATTC_OP_CMPL));
   1078 
   1079     if (bta_gattc_enqueue(p_clcb, p_data))
   1080     {
   1081         if ((handle = bta_gattc_id2handle(p_clcb->p_srcb,
   1082                                           &p_data->api_read.srvc_id,
   1083                                           &p_data->api_read.char_id,
   1084                                           p_data->api_read.p_descr_type)) == 0)
   1085         {
   1086             op_cmpl.status = BTA_GATT_ERROR;
   1087         }
   1088         else
   1089         {
   1090             read_param.by_handle.handle = handle;
   1091             read_param.by_handle.auth_req = p_data->api_read.auth_req;
   1092 
   1093             op_cmpl.status = GATTC_Read(p_clcb->bta_conn_id, GATT_READ_BY_HANDLE, &read_param);
   1094         }
   1095 
   1096         /* read fail */
   1097         if (op_cmpl.status != BTA_GATT_OK)
   1098         {
   1099             op_cmpl.op_code = GATTC_OPTYPE_READ;
   1100             op_cmpl.p_cmpl = NULL;
   1101 
   1102             bta_gattc_sm_execute(p_clcb, BTA_GATTC_OP_CMPL_EVT, (tBTA_GATTC_DATA *)&op_cmpl);
   1103         }
   1104     }
   1105 }
   1106 /*******************************************************************************
   1107 **
   1108 ** Function         bta_gattc_read_multi
   1109 **
   1110 ** Description      read multiple
   1111 **
   1112 ** Returns          None.
   1113 *********************************************************************************/
   1114 void bta_gattc_read_multi(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
   1115 {
   1116     UINT16              i, handle;
   1117     tBTA_GATT_STATUS    status = BTA_GATT_OK;
   1118     tGATT_READ_PARAM    read_param;
   1119     tBTA_GATTC_OP_CMPL  op_cmpl;
   1120     tBTA_GATTC_ATTR_ID  *p_id;
   1121 
   1122     if (bta_gattc_enqueue(p_clcb, p_data))
   1123     {
   1124         memset(&read_param, 0, sizeof(tGATT_READ_PARAM));
   1125 
   1126         p_id = p_data->api_read_multi.p_id_list;
   1127 
   1128         for (i = 0; i < p_data->api_read_multi.num_attr && p_id; i ++, p_id ++)
   1129         {
   1130             handle = 0;
   1131 
   1132             if (p_id->id_type == BTA_GATT_TYPE_CHAR)
   1133             {
   1134                 handle = bta_gattc_id2handle(p_clcb->p_srcb,
   1135                                      &p_id->id_value.char_id.srvc_id,
   1136                                      &p_id->id_value.char_id.char_id,
   1137                                      NULL);
   1138             }
   1139             else if (p_id->id_type == BTA_GATT_TYPE_CHAR_DESCR)
   1140             {
   1141                 handle = bta_gattc_id2handle(p_clcb->p_srcb,
   1142                                      &p_id->id_value.char_descr_id.char_id.srvc_id,
   1143                                      &p_id->id_value.char_descr_id.char_id.char_id,
   1144                                      &p_id->id_value.char_descr_id.descr_id);
   1145             }
   1146             else
   1147             {
   1148                 APPL_TRACE_ERROR("invalud ID type: %d", p_id->id_type);
   1149             }
   1150 
   1151             if (handle == 0)
   1152             {
   1153                 status = BTA_GATT_ERROR;
   1154                 break;
   1155             }
   1156         }
   1157         if (status == BTA_GATT_OK)
   1158         {
   1159             read_param.read_multiple.num_handles = p_data->api_read_multi.num_attr;
   1160             read_param.read_multiple.auth_req = p_data->api_read_multi.auth_req;
   1161 
   1162             status = GATTC_Read(p_clcb->bta_conn_id, GATT_READ_MULTIPLE, &read_param);
   1163         }
   1164 
   1165         /* read fail */
   1166         if (status != BTA_GATT_OK)
   1167         {
   1168             memset(&op_cmpl, 0, sizeof(tBTA_GATTC_OP_CMPL));
   1169 
   1170             op_cmpl.status  = status;
   1171             op_cmpl.op_code = GATTC_OPTYPE_READ;
   1172             op_cmpl.p_cmpl  = NULL;
   1173 
   1174             bta_gattc_sm_execute(p_clcb, BTA_GATTC_OP_CMPL_EVT, (tBTA_GATTC_DATA *)&op_cmpl);
   1175         }
   1176     }
   1177 }
   1178 /*******************************************************************************
   1179 **
   1180 ** Function         bta_gattc_write
   1181 **
   1182 ** Description      Write an attribute
   1183 **
   1184 ** Returns          None.
   1185 **
   1186 *******************************************************************************/
   1187 void bta_gattc_write(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
   1188 {
   1189     UINT16              handle = 0;
   1190     tGATT_VALUE         attr = {0};
   1191     tBTA_GATTC_OP_CMPL  op_cmpl;
   1192     tBTA_GATT_STATUS    status = BTA_GATT_OK;
   1193 
   1194     if (bta_gattc_enqueue(p_clcb, p_data))
   1195     {
   1196         if ((handle = bta_gattc_id2handle(p_clcb->p_srcb,
   1197                                           &p_data->api_write.srvc_id,
   1198                                           &p_data->api_write.char_id,
   1199                                           p_data->api_write.p_descr_type)) == 0)
   1200         {
   1201             status = BTA_GATT_ERROR;
   1202         }
   1203         else
   1204         {
   1205             attr.handle= handle;
   1206             attr.offset = p_data->api_write.offset;
   1207             attr.len    = p_data->api_write.len;
   1208             attr.auth_req = p_data->api_write.auth_req;
   1209 
   1210             if (p_data->api_write.p_value)
   1211                 memcpy(attr.value, p_data->api_write.p_value, p_data->api_write.len);
   1212 
   1213             status = GATTC_Write(p_clcb->bta_conn_id, p_data->api_write.write_type, &attr);
   1214         }
   1215 
   1216         /* write fail */
   1217         if (status != BTA_GATT_OK)
   1218         {
   1219             memset(&op_cmpl, 0, sizeof(tBTA_GATTC_OP_CMPL));
   1220 
   1221             op_cmpl.status  = status;
   1222             op_cmpl.op_code = GATTC_OPTYPE_WRITE;
   1223             op_cmpl.p_cmpl  = NULL;
   1224 
   1225             bta_gattc_sm_execute(p_clcb, BTA_GATTC_OP_CMPL_EVT, (tBTA_GATTC_DATA *)&op_cmpl);
   1226         }
   1227     }
   1228 }
   1229 /*******************************************************************************
   1230 **
   1231 ** Function         bta_gattc_execute
   1232 **
   1233 ** Description      send execute write
   1234 **
   1235 ** Returns          None.
   1236 *********************************************************************************/
   1237 void bta_gattc_execute(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
   1238 {
   1239     tBTA_GATTC_OP_CMPL  op_cmpl;
   1240     tBTA_GATT_STATUS    status;
   1241 
   1242     if (bta_gattc_enqueue(p_clcb, p_data))
   1243     {
   1244         status = GATTC_ExecuteWrite(p_clcb->bta_conn_id, p_data->api_exec.is_execute);
   1245 
   1246         if (status != BTA_GATT_OK)
   1247         {
   1248             memset(&op_cmpl, 0, sizeof(tBTA_GATTC_OP_CMPL));
   1249 
   1250             op_cmpl.status  = status;
   1251             op_cmpl.op_code = GATTC_OPTYPE_EXE_WRITE;
   1252             op_cmpl.p_cmpl  = NULL;
   1253 
   1254             bta_gattc_sm_execute(p_clcb, BTA_GATTC_OP_CMPL_EVT, (tBTA_GATTC_DATA *)&op_cmpl);
   1255         }
   1256     }
   1257 }
   1258 /*******************************************************************************
   1259 **
   1260 ** Function         bta_gattc_confirm
   1261 **
   1262 ** Description      send handle value confirmation
   1263 **
   1264 ** Returns          None.
   1265 **
   1266 *******************************************************************************/
   1267 void bta_gattc_confirm(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
   1268 {
   1269     UINT16 handle;
   1270 
   1271     if ((handle = bta_gattc_id2handle(p_clcb->p_srcb,
   1272                                       &p_data->api_confirm.srvc_id,
   1273                                       &p_data->api_confirm.char_id,
   1274                                       NULL)) == 0)
   1275     {
   1276         APPL_TRACE_ERROR("Can not map service/char ID into valid handle");
   1277     }
   1278     else
   1279     {
   1280         if (GATTC_SendHandleValueConfirm(p_data->api_confirm.hdr.layer_specific, handle)
   1281             != GATT_SUCCESS)
   1282         {
   1283             APPL_TRACE_ERROR("bta_gattc_confirm to handle [0x%04x] failed", handle);
   1284         }
   1285         else
   1286         {
   1287             /* if over BR_EDR, inform PM for mode change */
   1288             if (p_clcb->transport == BTA_TRANSPORT_BR_EDR)
   1289             {
   1290                 bta_sys_busy(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
   1291                 bta_sys_idle(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
   1292             }
   1293         }
   1294     }
   1295 }
   1296 /*******************************************************************************
   1297 **
   1298 ** Function         bta_gattc_read_cmpl
   1299 **
   1300 ** Description      read complete
   1301 **
   1302 ** Returns          None.
   1303 **
   1304 *******************************************************************************/
   1305 void bta_gattc_read_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_OP_CMPL *p_data)
   1306 {
   1307     UINT8               event;
   1308     tBTA_GATTC          cb_data;
   1309     tBTA_GATT_READ_VAL  read_value;
   1310 
   1311     memset(&cb_data, 0, sizeof(tBTA_GATTC));
   1312     memset(&read_value, 0, sizeof(tBTA_GATT_READ_VAL));
   1313 
   1314     cb_data.read.status     = p_data->status;
   1315 
   1316     if (p_data->p_cmpl != NULL && p_data->status == BTA_GATT_OK)
   1317     {
   1318         if (bta_gattc_handle2id(p_clcb->p_srcb,
   1319                                 p_data->p_cmpl->att_value.handle,
   1320                                 &cb_data.read.srvc_id,
   1321                                 &cb_data.read.char_id,
   1322                                 &cb_data.read.descr_type) == FALSE)
   1323         {
   1324             cb_data.read.status = BTA_GATT_INTERNAL_ERROR;
   1325             APPL_TRACE_ERROR("can not map to GATT ID. handle = 0x%04x",
   1326                                 p_data->p_cmpl->att_value.handle);
   1327         }
   1328         else
   1329         {
   1330             cb_data.read.status = bta_gattc_pack_read_cb_data(p_clcb->p_srcb,
   1331                                                               &cb_data.read.descr_type.uuid,
   1332                                                               &p_data->p_cmpl->att_value,
   1333                                                               &read_value);
   1334             cb_data.read.p_value = &read_value;
   1335         }
   1336     }
   1337     else
   1338     {
   1339         cb_data.read.srvc_id = p_clcb->p_q_cmd->api_read.srvc_id;
   1340         cb_data.read.char_id = p_clcb->p_q_cmd->api_read.char_id;
   1341         if (p_clcb->p_q_cmd->api_read.p_descr_type)
   1342             memcpy(&cb_data.read.descr_type, p_clcb->p_q_cmd->api_read.p_descr_type,
   1343                    sizeof(tBTA_GATT_ID));
   1344     }
   1345 
   1346     event = (p_clcb->p_q_cmd->api_read.p_descr_type == NULL) ?
   1347                     BTA_GATTC_READ_CHAR_EVT: BTA_GATTC_READ_DESCR_EVT;
   1348     cb_data.read.conn_id = p_clcb->bta_conn_id;
   1349 
   1350     utl_freebuf((void **)&p_clcb->p_q_cmd);
   1351     /* read complete, callback */
   1352     ( *p_clcb->p_rcb->p_cback)(event, (tBTA_GATTC *)&cb_data);
   1353 
   1354 }
   1355 /*******************************************************************************
   1356 **
   1357 ** Function         bta_gattc_write_cmpl
   1358 **
   1359 ** Description      read complete
   1360 **
   1361 ** Returns          None.
   1362 **
   1363 *******************************************************************************/
   1364 void bta_gattc_write_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_OP_CMPL *p_data)
   1365 {
   1366     tBTA_GATTC      cb_data = {0};
   1367     UINT8          event;
   1368 
   1369     memset(&cb_data, 0, sizeof(tBTA_GATTC));
   1370 
   1371     cb_data.write.status     = p_data->status;
   1372 
   1373     if (p_data->p_cmpl != NULL)
   1374     {
   1375         bta_gattc_handle2id(p_clcb->p_srcb, p_data->p_cmpl->handle,
   1376                             &cb_data.write.srvc_id, &cb_data.write.char_id,
   1377                             &cb_data.write.descr_type);
   1378     }
   1379     else
   1380     {
   1381         memcpy(&cb_data.write.srvc_id, &p_clcb->p_q_cmd->api_write.srvc_id,
   1382                 sizeof(tBTA_GATT_SRVC_ID));
   1383         memcpy(&cb_data.write.char_id, &p_clcb->p_q_cmd->api_write.char_id,
   1384                 sizeof(tBTA_GATT_ID));
   1385         if (p_clcb->p_q_cmd->api_write.p_descr_type)
   1386             memcpy(&cb_data.write.descr_type, p_clcb->p_q_cmd->api_write.p_descr_type,
   1387                    sizeof(tBTA_GATT_ID));
   1388     }
   1389 
   1390     if (p_clcb->p_q_cmd->api_write.hdr.event == BTA_GATTC_API_WRITE_EVT &&
   1391         p_clcb->p_q_cmd->api_write.write_type == BTA_GATTC_WRITE_PREPARE)
   1392 
   1393         event = BTA_GATTC_PREP_WRITE_EVT;
   1394 
   1395     else if (p_clcb->p_q_cmd->api_write.p_descr_type == NULL)
   1396 
   1397         event = BTA_GATTC_WRITE_CHAR_EVT;
   1398 
   1399     else
   1400         event = BTA_GATTC_WRITE_DESCR_EVT;
   1401 
   1402     utl_freebuf((void **)&p_clcb->p_q_cmd);
   1403     cb_data.write.conn_id = p_clcb->bta_conn_id;
   1404     /* write complete, callback */
   1405     ( *p_clcb->p_rcb->p_cback)(event, (tBTA_GATTC *)&cb_data);
   1406 
   1407 }
   1408 /*******************************************************************************
   1409 **
   1410 ** Function         bta_gattc_exec_cmpl
   1411 **
   1412 ** Description      execute write complete
   1413 **
   1414 ** Returns          None.
   1415 **
   1416 *******************************************************************************/
   1417 void bta_gattc_exec_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_OP_CMPL *p_data)
   1418 {
   1419     tBTA_GATTC          cb_data;
   1420 
   1421     utl_freebuf((void **)&p_clcb->p_q_cmd);
   1422 
   1423     p_clcb->status      = BTA_GATT_OK;
   1424 
   1425     /* execute complete, callback */
   1426     cb_data.exec_cmpl.conn_id = p_clcb->bta_conn_id;
   1427     cb_data.exec_cmpl.status = p_data->status;
   1428 
   1429     ( *p_clcb->p_rcb->p_cback)(BTA_GATTC_EXEC_EVT,  &cb_data);
   1430 
   1431 }
   1432 
   1433 /*******************************************************************************
   1434 **
   1435 ** Function         bta_gattc_cfg_mtu_cmpl
   1436 **
   1437 ** Description      configure MTU operation complete
   1438 **
   1439 ** Returns          None.
   1440 **
   1441 *******************************************************************************/
   1442 void bta_gattc_cfg_mtu_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_OP_CMPL *p_data)
   1443 {
   1444     tBTA_GATTC          cb_data;
   1445 
   1446     utl_freebuf((void **)&p_clcb->p_q_cmd);
   1447 
   1448 
   1449     if (p_data->p_cmpl  &&  p_data->status == BTA_GATT_OK)
   1450         p_clcb->p_srcb->mtu  = p_data->p_cmpl->mtu;
   1451 
   1452     /* configure MTU complete, callback */
   1453     p_clcb->status          = p_data->status;
   1454     cb_data.cfg_mtu.conn_id = p_clcb->bta_conn_id;
   1455     cb_data.cfg_mtu.status  = p_data->status;
   1456     cb_data.cfg_mtu.mtu     = p_clcb->p_srcb->mtu;
   1457 
   1458     (*p_clcb->p_rcb->p_cback) (BTA_GATTC_CFG_MTU_EVT,  &cb_data);
   1459 
   1460 }
   1461 /*******************************************************************************
   1462 **
   1463 ** Function         bta_gattc_op_cmpl
   1464 **
   1465 ** Description      operation completed.
   1466 **
   1467 ** Returns          None.
   1468 **
   1469 *******************************************************************************/
   1470 void  bta_gattc_op_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
   1471 {
   1472     UINT8           op = (UINT8)p_data->op_cmpl.op_code;
   1473     UINT8           mapped_op = 0;
   1474 
   1475     APPL_TRACE_DEBUG("bta_gattc_op_cmpl op = %d", op);
   1476 
   1477     if (op == GATTC_OPTYPE_INDICATION || op == GATTC_OPTYPE_NOTIFICATION)
   1478     {
   1479         APPL_TRACE_ERROR("unexpected operation, ignored");
   1480     }
   1481     else if (op >= GATTC_OPTYPE_READ)
   1482     {
   1483         if (p_clcb->p_q_cmd == NULL)
   1484         {
   1485             APPL_TRACE_ERROR("No pending command");
   1486             return;
   1487         }
   1488         if (p_clcb->p_q_cmd->hdr.event != bta_gattc_opcode_to_int_evt[op - GATTC_OPTYPE_READ])
   1489         {
   1490             mapped_op = p_clcb->p_q_cmd->hdr.event - BTA_GATTC_API_READ_EVT + GATTC_OPTYPE_READ;
   1491             if ( mapped_op > GATTC_OPTYPE_INDICATION)   mapped_op = 0;
   1492 
   1493 #if (BT_TRACE_VERBOSE == TRUE)
   1494             APPL_TRACE_ERROR("expect op:(%s :0x%04x), receive unexpected operation (%s).",
   1495                                 bta_gattc_op_code_name[mapped_op] , p_clcb->p_q_cmd->hdr.event,
   1496                                 bta_gattc_op_code_name[op]);
   1497 #else
   1498             APPL_TRACE_ERROR("expect op:(%u :0x%04x), receive unexpected operation (%u).",
   1499                                 mapped_op , p_clcb->p_q_cmd->hdr.event, op);
   1500 #endif
   1501             return;
   1502         }
   1503 
   1504         /* discard responses if service change indication is received before operation completed */
   1505         if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING && p_clcb->p_srcb->srvc_hdl_chg)
   1506         {
   1507             APPL_TRACE_DEBUG("Discard all responses when service change indication is received.");
   1508             p_data->op_cmpl.status = GATT_ERROR;
   1509         }
   1510 
   1511         /* service handle change void the response, discard it */
   1512         if (op == GATTC_OPTYPE_READ)
   1513             bta_gattc_read_cmpl(p_clcb, &p_data->op_cmpl);
   1514 
   1515         else if (op == GATTC_OPTYPE_WRITE)
   1516             bta_gattc_write_cmpl(p_clcb, &p_data->op_cmpl);
   1517 
   1518         else if (op == GATTC_OPTYPE_EXE_WRITE)
   1519             bta_gattc_exec_cmpl(p_clcb, &p_data->op_cmpl);
   1520 
   1521         else if (op == GATTC_OPTYPE_CONFIG)
   1522             bta_gattc_cfg_mtu_cmpl(p_clcb, &p_data->op_cmpl);
   1523 
   1524         if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING)
   1525         {
   1526             p_clcb->auto_update = BTA_GATTC_REQ_WAITING;
   1527             bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
   1528         }
   1529     }
   1530 }
   1531 /*******************************************************************************
   1532 **
   1533 ** Function         bta_gattc_op_cmpl
   1534 **
   1535 ** Description      operation completed.
   1536 **
   1537 ** Returns          None.
   1538 **
   1539 *******************************************************************************/
   1540 void  bta_gattc_ignore_op_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
   1541 {
   1542     UNUSED(p_clcb);
   1543 
   1544     /* receive op complete when discovery is started, ignore the response,
   1545         and wait for discovery finish and resent */
   1546     APPL_TRACE_DEBUG("bta_gattc_ignore_op_cmpl op = %d", p_data->hdr.layer_specific);
   1547 
   1548 }
   1549 /*******************************************************************************
   1550 **
   1551 ** Function         bta_gattc_search
   1552 **
   1553 ** Description      start a search in the local server cache
   1554 **
   1555 ** Returns          None.
   1556 **
   1557 *******************************************************************************/
   1558 void bta_gattc_search(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
   1559 {
   1560     tBTA_GATT_STATUS    status = GATT_INTERNAL_ERROR;
   1561     tBTA_GATTC cb_data;
   1562     APPL_TRACE_DEBUG("bta_gattc_search conn_id=%d",p_clcb->bta_conn_id);
   1563     if (p_clcb->p_srcb && p_clcb->p_srcb->p_srvc_cache)
   1564     {
   1565         status = BTA_GATT_OK;
   1566         /* search the local cache of a server device */
   1567         bta_gattc_search_service(p_clcb, p_data->api_search.p_srvc_uuid);
   1568     }
   1569     cb_data.search_cmpl.status  = status;
   1570     cb_data.search_cmpl.conn_id = p_clcb->bta_conn_id;
   1571 
   1572     /* end of search or no server cache available */
   1573     ( *p_clcb->p_rcb->p_cback)(BTA_GATTC_SEARCH_CMPL_EVT,  &cb_data);
   1574 }
   1575 /*******************************************************************************
   1576 **
   1577 ** Function         bta_gattc_q_cmd
   1578 **
   1579 ** Description      enqueue a command into control block, usually because discovery
   1580 **                  operation is busy.
   1581 **
   1582 ** Returns          None.
   1583 **
   1584 *******************************************************************************/
   1585 void bta_gattc_q_cmd(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
   1586 {
   1587     bta_gattc_enqueue(p_clcb, p_data);
   1588 }
   1589 /*******************************************************************************
   1590 **
   1591 ** Function         bta_gattc_cache_open
   1592 **
   1593 ** Description      open a NV cache for loading
   1594 **
   1595 ** Returns          void
   1596 **
   1597 *******************************************************************************/
   1598 void bta_gattc_cache_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
   1599 {
   1600     UNUSED(p_data);
   1601 
   1602     bta_gattc_set_discover_st(p_clcb->p_srcb);
   1603 
   1604     APPL_TRACE_DEBUG("bta_gattc_cache_open conn_id=%d",p_clcb->bta_conn_id);
   1605     bta_gattc_co_cache_open(p_clcb->p_srcb->server_bda, BTA_GATTC_CI_CACHE_OPEN_EVT,
   1606                             p_clcb->bta_conn_id, FALSE);
   1607 }
   1608 /*******************************************************************************
   1609 **
   1610 ** Function         bta_gattc_start_load
   1611 **
   1612 ** Description      start cache loading by sending callout open cache
   1613 **
   1614 ** Returns          None.
   1615 **
   1616 *******************************************************************************/
   1617 void bta_gattc_ci_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
   1618 {
   1619     APPL_TRACE_DEBUG("bta_gattc_ci_open conn_id=%d server state=%d" ,
   1620                       p_clcb->bta_conn_id, p_clcb->p_srcb->state);
   1621     if (p_clcb->p_srcb->state == BTA_GATTC_SERV_LOAD)
   1622     {
   1623         if (p_data->ci_open.status == BTA_GATT_OK)
   1624         {
   1625             p_clcb->p_srcb->attr_index = 0;
   1626             bta_gattc_co_cache_load(p_clcb->p_srcb->server_bda,
   1627                                     BTA_GATTC_CI_CACHE_LOAD_EVT,
   1628                                     p_clcb->p_srcb->attr_index,
   1629                                     p_clcb->bta_conn_id);
   1630         }
   1631         else
   1632         {
   1633             p_clcb->p_srcb->state = BTA_GATTC_SERV_DISC;
   1634             /* cache open failure, start discovery */
   1635             bta_gattc_start_discover(p_clcb, NULL);
   1636         }
   1637     }
   1638     if (p_clcb->p_srcb->state == BTA_GATTC_SERV_SAVE)
   1639     {
   1640         if (p_data->ci_open.status == BTA_GATT_OK)
   1641         {
   1642             if (!bta_gattc_cache_save(p_clcb->p_srcb, p_clcb->bta_conn_id))
   1643             {
   1644                 p_data->ci_open.status = BTA_GATT_ERROR;
   1645             }
   1646         }
   1647         if (p_data->ci_open.status != BTA_GATT_OK)
   1648         {
   1649             p_clcb->p_srcb->attr_index = 0;
   1650             bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, p_clcb->bta_conn_id);
   1651             bta_gattc_reset_discover_st(p_clcb->p_srcb, p_clcb->status);
   1652 
   1653         }
   1654     }
   1655 }
   1656 /*******************************************************************************
   1657 **
   1658 ** Function         bta_gattc_ci_load
   1659 **
   1660 ** Description      cache loading received.
   1661 **
   1662 ** Returns          None.
   1663 **
   1664 *******************************************************************************/
   1665 void bta_gattc_ci_load(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
   1666 {
   1667 
   1668     APPL_TRACE_DEBUG("bta_gattc_ci_load conn_id=%d load status=%d",
   1669                       p_clcb->bta_conn_id, p_data->ci_load.status);
   1670 
   1671     if (p_data->ci_load.status == BTA_GATT_OK ||
   1672          p_data->ci_load.status == BTA_GATT_MORE)
   1673     {
   1674         if (p_data->ci_load.num_attr != 0)
   1675             bta_gattc_rebuild_cache(p_clcb->p_srcb, p_data->ci_load.num_attr,
   1676                                 p_data->ci_load.attr, p_clcb->p_srcb->attr_index);
   1677 
   1678         if (p_data->ci_load.status == BTA_GATT_OK)
   1679         {
   1680             p_clcb->p_srcb->attr_index = 0;
   1681             bta_gattc_reset_discover_st(p_clcb->p_srcb, BTA_GATT_OK);
   1682             bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0);
   1683         }
   1684         else /* load more */
   1685         {
   1686             p_clcb->p_srcb->attr_index += p_data->ci_load.num_attr;
   1687 
   1688             bta_gattc_co_cache_load(p_clcb->p_srcb->server_bda,
   1689                                     BTA_GATTC_CI_CACHE_LOAD_EVT,
   1690                                     p_clcb->p_srcb->attr_index,
   1691                                     p_clcb->bta_conn_id);
   1692         }
   1693     }
   1694     else
   1695     {
   1696         bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0);
   1697         p_clcb->p_srcb->state = BTA_GATTC_SERV_DISC;
   1698         p_clcb->p_srcb->attr_index = 0;
   1699         /* cache load failure, start discovery */
   1700         bta_gattc_start_discover(p_clcb, NULL);
   1701     }
   1702 }
   1703 /*******************************************************************************
   1704 **
   1705 ** Function         bta_gattc_ci_save
   1706 **
   1707 ** Description      cache loading received.
   1708 **
   1709 ** Returns          None.
   1710 **
   1711 *******************************************************************************/
   1712 void bta_gattc_ci_save(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
   1713 {
   1714     UNUSED(p_data);
   1715 
   1716     APPL_TRACE_DEBUG("bta_gattc_ci_save conn_id=%d  " ,
   1717                       p_clcb->bta_conn_id   );
   1718 
   1719     if (!bta_gattc_cache_save(p_clcb->p_srcb, p_clcb->bta_conn_id))
   1720     {
   1721         p_clcb->p_srcb->attr_index = 0;
   1722         bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0);
   1723         bta_gattc_reset_discover_st(p_clcb->p_srcb, p_clcb->status);
   1724     }
   1725 }
   1726 /*******************************************************************************
   1727 **
   1728 ** Function         bta_gattc_fail
   1729 **
   1730 ** Description      report API call failure back to apps
   1731 **
   1732 ** Returns          None.
   1733 **
   1734 *******************************************************************************/
   1735 void bta_gattc_fail(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
   1736 {
   1737     UNUSED(p_data);
   1738 
   1739     if (p_clcb->status == BTA_GATT_OK)
   1740     {
   1741         APPL_TRACE_ERROR("operation not supported at current state [%d]", p_clcb->state);
   1742     }
   1743 }
   1744 
   1745 /*******************************************************************************
   1746 **
   1747 ** Function         bta_gattc_deregister_cmpl
   1748 **
   1749 ** Description      De-Register a GATT client application with BTA completed.
   1750 **
   1751 ** Returns          void
   1752 **
   1753 *******************************************************************************/
   1754 static void bta_gattc_deregister_cmpl(tBTA_GATTC_RCB *p_clreg)
   1755 {
   1756     tBTA_GATTC_CB       *p_cb = &bta_gattc_cb;
   1757     tBTA_GATTC_IF       client_if = p_clreg->client_if;
   1758     tBTA_GATTC          cb_data;
   1759     tBTA_GATTC_CBACK    *p_cback = p_clreg->p_cback;
   1760 
   1761     memset(&cb_data, 0, sizeof(tBTA_GATTC));
   1762 
   1763     GATT_Deregister(p_clreg->client_if);
   1764     memset(p_clreg, 0, sizeof(tBTA_GATTC_RCB));
   1765 
   1766     cb_data.reg_oper.client_if = client_if;
   1767     cb_data.reg_oper.status    = BTA_GATT_OK;
   1768 
   1769     if (p_cback)
   1770         /* callback with de-register event */
   1771         (*p_cback)(BTA_GATTC_DEREG_EVT,  (tBTA_GATTC *)&cb_data);
   1772 
   1773     if (bta_gattc_num_reg_app() == 0 && p_cb->state == BTA_GATTC_STATE_DISABLING)
   1774     {
   1775         p_cb->state = BTA_GATTC_STATE_DISABLED;
   1776     }
   1777 }
   1778 /*******************************************************************************
   1779 **
   1780 ** Function         bta_gattc_conn_cback
   1781 **                  bta_gattc_cmpl_cback
   1782 **
   1783 ** Description      callback functions to GATT client stack.
   1784 **
   1785 ** Returns          void
   1786 **
   1787 *******************************************************************************/
   1788 static void bta_gattc_conn_cback(tGATT_IF gattc_if, BD_ADDR bda, UINT16 conn_id,
   1789                                  BOOLEAN connected, tGATT_DISCONN_REASON reason,
   1790                                  tBT_TRANSPORT transport)
   1791 {
   1792     tBTA_GATTC_DATA *p_buf;
   1793 
   1794     APPL_TRACE_DEBUG("bta_gattc_conn_cback: cif = %d connected = %d conn_id = %d reaosn = 0x%04x",
   1795                       gattc_if, connected, conn_id, reason);
   1796 
   1797     if ((p_buf = (tBTA_GATTC_DATA *) GKI_getbuf(sizeof(tBTA_GATTC_DATA))) != NULL)
   1798     {
   1799         memset(p_buf, 0, sizeof(tBTA_GATTC_DATA));
   1800 
   1801         p_buf->int_conn.hdr.event            = connected ? BTA_GATTC_INT_CONN_EVT:
   1802                                                            BTA_GATTC_INT_DISCONN_EVT;
   1803         p_buf->int_conn.hdr.layer_specific   = conn_id;
   1804         p_buf->int_conn.client_if            = gattc_if;
   1805         p_buf->int_conn.role                 = L2CA_GetBleConnRole(bda);
   1806         p_buf->int_conn.reason               = reason;
   1807         p_buf->int_conn.transport            = transport;
   1808         bdcpy(p_buf->int_conn.remote_bda, bda);
   1809 
   1810         bta_sys_sendmsg(p_buf);
   1811     }
   1812 }
   1813 
   1814 /*******************************************************************************
   1815 **
   1816 ** Function         bta_gattc_enc_cmpl_cback
   1817 **
   1818 ** Description      encryption complete callback function to GATT client stack.
   1819 **
   1820 ** Returns          void
   1821 **
   1822 *******************************************************************************/
   1823 static void bta_gattc_enc_cmpl_cback(tGATT_IF gattc_if, BD_ADDR bda)
   1824 {
   1825     tBTA_GATTC_DATA *p_buf;
   1826     tBTA_GATTC_CLCB *p_clcb = NULL;
   1827 
   1828     if ((p_clcb = bta_gattc_find_clcb_by_cif(gattc_if, bda, BTA_GATT_TRANSPORT_LE)) == NULL)
   1829     {
   1830         return;
   1831     }
   1832 
   1833 #if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE)
   1834     /* filter this event just for BTA HH LE GATT client,
   1835        In the future, if we want to enable encryption complete event
   1836        for all GATT clients, we can remove this code */
   1837     if (!bta_hh_le_is_hh_gatt_if(gattc_if))
   1838     {
   1839         return;
   1840     }
   1841 #endif
   1842 
   1843     APPL_TRACE_DEBUG("bta_gattc_enc_cmpl_cback: cif = %d", gattc_if);
   1844 
   1845     if ((p_buf = (tBTA_GATTC_DATA *) GKI_getbuf(sizeof(tBTA_GATTC_DATA))) != NULL)
   1846     {
   1847         memset(p_buf, 0, sizeof(tBTA_GATTC_DATA));
   1848 
   1849         p_buf->enc_cmpl.hdr.event            = BTA_GATTC_ENC_CMPL_EVT;
   1850         p_buf->enc_cmpl.hdr.layer_specific   = p_clcb->bta_conn_id;
   1851         p_buf->enc_cmpl.client_if            = gattc_if;
   1852         bdcpy(p_buf->enc_cmpl.remote_bda, bda);
   1853 
   1854         bta_sys_sendmsg(p_buf);
   1855     }
   1856 }
   1857 
   1858 /*******************************************************************************
   1859 **
   1860 ** Function         bta_gattc_process_api_refresh
   1861 **
   1862 ** Description      process refresh API to delete cache and start a new discovery
   1863 **                  if currently connected.
   1864 **
   1865 ** Returns          None.
   1866 **
   1867 *******************************************************************************/
   1868 void bta_gattc_process_api_refresh(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg)
   1869 {
   1870     tBTA_GATTC_SERV *p_srvc_cb = bta_gattc_find_srvr_cache(p_msg->api_conn.remote_bda);
   1871     tBTA_GATTC_CLCB      *p_clcb = &bta_gattc_cb.clcb[0];
   1872     BOOLEAN         found = FALSE;
   1873     UINT8           i;
   1874     UNUSED(p_cb);
   1875 
   1876     if (p_srvc_cb != NULL)
   1877     {
   1878         /* try to find a CLCB */
   1879         if (p_srvc_cb->connected && p_srvc_cb->num_clcb != 0)
   1880         {
   1881             for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++, p_clcb ++)
   1882             {
   1883                 if (p_clcb->in_use && p_clcb->p_srcb == p_srvc_cb)
   1884                 {
   1885                     found = TRUE;
   1886                     break;
   1887                 }
   1888             }
   1889             if (found)
   1890             {
   1891                 bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
   1892                 return;
   1893             }
   1894         }
   1895         /* in all other cases, mark it and delete the cache */
   1896         if (p_srvc_cb->p_srvc_cache != NULL)
   1897         {
   1898             while (p_srvc_cb->cache_buffer.p_first)
   1899                 GKI_freebuf (GKI_dequeue (&p_srvc_cb->cache_buffer));
   1900 
   1901             p_srvc_cb->p_srvc_cache = NULL;
   1902         }
   1903     }
   1904     /* used to reset cache in application */
   1905     bta_gattc_co_cache_reset(p_msg->api_conn.remote_bda);
   1906 
   1907 }
   1908 /*******************************************************************************
   1909 **
   1910 ** Function         bta_gattc_process_srvc_chg_ind
   1911 **
   1912 ** Description      process service change indication.
   1913 **
   1914 ** Returns          None.
   1915 **
   1916 *******************************************************************************/
   1917 BOOLEAN bta_gattc_process_srvc_chg_ind(UINT16 conn_id,
   1918                                        tBTA_GATTC_RCB      *p_clrcb,
   1919                                        tBTA_GATTC_SERV     *p_srcb,
   1920                                        tBTA_GATTC_CLCB      *p_clcb,
   1921                                        tBTA_GATTC_NOTIFY    *p_notify,
   1922                                        UINT16 handle)
   1923 {
   1924     tBT_UUID        gattp_uuid, srvc_chg_uuid;
   1925     BOOLEAN         processed = FALSE;
   1926     UINT8           i;
   1927 
   1928     gattp_uuid.len = 2;
   1929     gattp_uuid.uu.uuid16 = UUID_SERVCLASS_GATT_SERVER;
   1930 
   1931     srvc_chg_uuid.len = 2;
   1932     srvc_chg_uuid.uu.uuid16 = GATT_UUID_GATT_SRV_CHGD;
   1933 
   1934     if (bta_gattc_uuid_compare(&p_notify->char_id.srvc_id.id.uuid, &gattp_uuid, TRUE) &&
   1935         bta_gattc_uuid_compare(&p_notify->char_id.char_id.uuid, &srvc_chg_uuid, TRUE))
   1936     {
   1937         processed = TRUE;
   1938         /* mark service handle change pending */
   1939         p_srcb->srvc_hdl_chg = TRUE;
   1940         /* clear up all notification/indication registration */
   1941         bta_gattc_clear_notif_registration(conn_id);
   1942         /* service change indication all received, do discovery update */
   1943         if ( ++ p_srcb->update_count == bta_gattc_num_reg_app())
   1944         {
   1945             /* not an opened connection; or connection busy */
   1946             /* search for first available clcb and start discovery */
   1947             if (p_clcb == NULL || (p_clcb && p_clcb->p_q_cmd != NULL))
   1948             {
   1949                 for (i = 0 ; i < BTA_GATTC_CLCB_MAX; i ++)
   1950                 {
   1951                     if (bta_gattc_cb.clcb[i].in_use &&
   1952                         bta_gattc_cb.clcb[i].p_srcb == p_srcb &&
   1953                         bta_gattc_cb.clcb[i].p_q_cmd == NULL)
   1954                     {
   1955                         p_clcb = &bta_gattc_cb.clcb[i];
   1956                         break;
   1957                     }
   1958                 }
   1959             }
   1960             /* send confirmation here if this is an indication, it should always be */
   1961             GATTC_SendHandleValueConfirm(conn_id, handle);
   1962 
   1963             /* if connection available, refresh cache by doing discovery now */
   1964             if (p_clcb != NULL)
   1965                 bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
   1966         }
   1967         /* notify applicationf or service change */
   1968         if (p_clrcb->p_cback != NULL)
   1969         {
   1970            (* p_clrcb->p_cback)(BTA_GATTC_SRVC_CHG_EVT, (tBTA_GATTC *)p_srcb->server_bda);
   1971         }
   1972 
   1973     }
   1974 
   1975     return processed;
   1976 
   1977 }
   1978 /*******************************************************************************
   1979 **
   1980 ** Function         bta_gattc_proc_other_indication
   1981 **
   1982 ** Description      process all non-service change indication/notification.
   1983 **
   1984 ** Returns          None.
   1985 **
   1986 *******************************************************************************/
   1987 void bta_gattc_proc_other_indication(tBTA_GATTC_CLCB *p_clcb, UINT8 op,
   1988                                      tGATT_CL_COMPLETE *p_data,
   1989                                      tBTA_GATTC_NOTIFY *p_notify)
   1990 {
   1991     APPL_TRACE_DEBUG("bta_gattc_proc_other_indication check \
   1992                        p_data->att_value.handle=%d p_data->handle=%d",
   1993                        p_data->att_value.handle, p_data->handle);
   1994     APPL_TRACE_DEBUG("is_notify", p_notify->is_notify);
   1995 
   1996     p_notify->is_notify = (op == GATTC_OPTYPE_INDICATION) ? FALSE : TRUE;
   1997     p_notify->len = p_data->att_value.len;
   1998     bdcpy(p_notify->bda, p_clcb->bda);
   1999     memcpy(p_notify->value, p_data->att_value.value, p_data->att_value.len);
   2000     p_notify->conn_id = p_clcb->bta_conn_id;
   2001 
   2002     if (p_clcb->p_rcb->p_cback)
   2003         (*p_clcb->p_rcb->p_cback)(BTA_GATTC_NOTIF_EVT,  (tBTA_GATTC *)p_notify);
   2004 
   2005 }
   2006 /*******************************************************************************
   2007 **
   2008 ** Function         bta_gattc_process_indicate
   2009 **
   2010 ** Description      process indication/notification.
   2011 **
   2012 ** Returns          None.
   2013 **
   2014 *******************************************************************************/
   2015 void bta_gattc_process_indicate(UINT16 conn_id, tGATTC_OPTYPE op, tGATT_CL_COMPLETE *p_data)
   2016 {
   2017     UINT16              handle = p_data->att_value.handle;
   2018     tBTA_GATTC_CLCB     *p_clcb ;
   2019     tBTA_GATTC_RCB      *p_clrcb = NULL;
   2020     tBTA_GATTC_SERV     *p_srcb = NULL;
   2021     tBTA_GATTC_NOTIFY   notify;
   2022     BD_ADDR             remote_bda;
   2023     tBTA_GATTC_IF       gatt_if;
   2024     tBTA_TRANSPORT transport;
   2025 
   2026     if (!GATT_GetConnectionInfor(conn_id, &gatt_if, remote_bda, &transport))
   2027     {
   2028         APPL_TRACE_ERROR("indication/notif for unknown app");
   2029         return;
   2030     }
   2031 
   2032     if ((p_clrcb = bta_gattc_cl_get_regcb(gatt_if)) == NULL)
   2033     {
   2034         APPL_TRACE_ERROR("indication/notif for unregistered app");
   2035         return;
   2036     }
   2037 
   2038     if ((p_srcb = bta_gattc_find_srcb(remote_bda)) == NULL)
   2039     {
   2040         APPL_TRACE_ERROR("indication/notif for unknown device, ignore");
   2041         return;
   2042     }
   2043 
   2044     p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
   2045 
   2046     if (bta_gattc_handle2id(p_srcb, handle,
   2047                             &notify.char_id.srvc_id,
   2048                             &notify.char_id.char_id,
   2049                             &notify.descr_type))
   2050     {
   2051         /* if non-service change indication/notification, forward to application */
   2052         if (!bta_gattc_process_srvc_chg_ind(conn_id, p_clrcb, p_srcb, p_clcb, &notify, handle))
   2053         {
   2054             /* if app registered for the notification */
   2055             if (bta_gattc_check_notif_registry(p_clrcb, p_srcb, &notify))
   2056             {
   2057                 /* connection not open yet */
   2058                 if (p_clcb == NULL)
   2059                 {
   2060                     if ((p_clcb = bta_gattc_clcb_alloc(gatt_if, remote_bda, transport)) != NULL)
   2061                     {
   2062                         p_clcb->bta_conn_id = conn_id;
   2063                         p_clcb->transport   = transport;
   2064 
   2065                         bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, NULL);
   2066                     }
   2067                     else
   2068                     {
   2069                         APPL_TRACE_ERROR("No resources");
   2070                     }
   2071                 }
   2072 
   2073                 if (p_clcb != NULL)
   2074                     bta_gattc_proc_other_indication(p_clcb, op, p_data, &notify);
   2075             }
   2076             /* no one intersted and need ack? */
   2077             else if (op == GATTC_OPTYPE_INDICATION)
   2078             {
   2079                 APPL_TRACE_DEBUG("no one interested, ack now");
   2080                 GATTC_SendHandleValueConfirm(conn_id, handle);
   2081             }
   2082         }
   2083     }
   2084     else
   2085     {
   2086         APPL_TRACE_ERROR("Indi/Notif for Unknown handle[0x%04x], can not find in local cache.",
   2087                           handle);
   2088     }
   2089 }
   2090 /*******************************************************************************
   2091 **
   2092 ** Function         bta_gattc_cmpl_cback
   2093 **
   2094 ** Description      client operation complete callback register with BTE GATT.
   2095 **
   2096 ** Returns          None.
   2097 **
   2098 *******************************************************************************/
   2099 static void  bta_gattc_cmpl_cback(UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status,
   2100                                   tGATT_CL_COMPLETE *p_data)
   2101 {
   2102     tBTA_GATTC_CLCB     *p_clcb ;
   2103     tBTA_GATTC_OP_CMPL  *p_buf;
   2104     UINT16              len = sizeof(tBTA_GATTC_OP_CMPL) + sizeof(tGATT_CL_COMPLETE);
   2105 
   2106     APPL_TRACE_DEBUG("bta_gattc_cmpl_cback: conn_id = %d op = %d status = %d",
   2107                       conn_id, op, status);
   2108 
   2109     /* notification and indication processed right away */
   2110     if (op == GATTC_OPTYPE_NOTIFICATION || op == GATTC_OPTYPE_INDICATION)
   2111     {
   2112         bta_gattc_process_indicate(conn_id, op, p_data);
   2113         return;
   2114     }
   2115     /* for all other operation, not expected if w/o connection */
   2116     else if ((p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id)) == NULL)
   2117     {
   2118         APPL_TRACE_ERROR("bta_gattc_cmpl_cback unknown conn_id =  %d, ignore data", conn_id);
   2119         return;
   2120     }
   2121 
   2122     /* if over BR_EDR, inform PM for mode change */
   2123     if (p_clcb->transport == BTA_TRANSPORT_BR_EDR)
   2124     {
   2125         bta_sys_busy(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
   2126         bta_sys_idle(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
   2127     }
   2128 
   2129     if ((p_buf = (tBTA_GATTC_OP_CMPL *) GKI_getbuf(len)) != NULL)
   2130     {
   2131         memset(p_buf, 0, len);
   2132         p_buf->hdr.event = BTA_GATTC_OP_CMPL_EVT;
   2133         p_buf->hdr.layer_specific = conn_id;
   2134         p_buf->status = status;
   2135         p_buf->op_code = op;
   2136 
   2137         if (p_data != NULL)
   2138         {
   2139             p_buf->p_cmpl = (tGATT_CL_COMPLETE *)(p_buf + 1);
   2140             memcpy(p_buf->p_cmpl, p_data, sizeof(tGATT_CL_COMPLETE));
   2141         }
   2142 
   2143         bta_sys_sendmsg(p_buf);
   2144     }
   2145 
   2146     return;
   2147 }
   2148 
   2149 /*******************************************************************************
   2150 **
   2151 ** Function         bta_gattc_cong_cback
   2152 **
   2153 ** Description      congestion callback for BTA GATT client.
   2154 **
   2155 ** Returns          void
   2156 **
   2157 ********************************************************************************/
   2158 static void bta_gattc_cong_cback (UINT16 conn_id, BOOLEAN congested)
   2159 {
   2160     tBTA_GATTC_CLCB *p_clcb;
   2161     tBTA_GATTC cb_data;
   2162 
   2163     if ((p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id)) != NULL)
   2164     {
   2165         if (p_clcb->p_rcb->p_cback)
   2166         {
   2167             cb_data.congest.conn_id = conn_id;
   2168             cb_data.congest.congested = congested;
   2169 
   2170             (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CONGEST_EVT, &cb_data);
   2171         }
   2172     }
   2173 }
   2174 
   2175 #if BLE_INCLUDED == TRUE
   2176 /*******************************************************************************
   2177 **
   2178 ** Function         bta_gattc_init_clcb_conn
   2179 **
   2180 ** Description      Initaite a BTA CLCB connection
   2181 **
   2182 ** Returns          void
   2183 **
   2184 ********************************************************************************/
   2185 void bta_gattc_init_clcb_conn(UINT8 cif, BD_ADDR remote_bda)
   2186 {
   2187     tBTA_GATTC_CLCB     *p_clcb = NULL;
   2188     tBTA_GATTC_DATA     gattc_data;
   2189     UINT16              conn_id;
   2190 
   2191     /* should always get the connection ID */
   2192     if (GATT_GetConnIdIfConnected(cif, remote_bda, &conn_id, BTA_GATT_TRANSPORT_LE) == FALSE)
   2193     {
   2194         APPL_TRACE_ERROR("bta_gattc_init_clcb_conn ERROR: not a connected device");
   2195         return;
   2196     }
   2197 
   2198     /* initaite a new connection here */
   2199     if ((p_clcb = bta_gattc_clcb_alloc(cif, remote_bda, BTA_GATT_TRANSPORT_LE)) != NULL)
   2200     {
   2201         gattc_data.hdr.layer_specific = p_clcb->bta_conn_id = conn_id;
   2202 
   2203         gattc_data.api_conn.client_if = cif;
   2204         memcpy(gattc_data.api_conn.remote_bda, remote_bda, BD_ADDR_LEN);
   2205         gattc_data.api_conn.is_direct = TRUE;
   2206 
   2207         bta_gattc_sm_execute(p_clcb, BTA_GATTC_API_OPEN_EVT, &gattc_data);
   2208     }
   2209     else
   2210     {
   2211         APPL_TRACE_ERROR("No resources");
   2212     }
   2213 }
   2214 /*******************************************************************************
   2215 **
   2216 ** Function         bta_gattc_process_listen_all
   2217 **
   2218 ** Description      process listen all, send open callback to application for all
   2219 **                  connected slave LE link.
   2220 **
   2221 ** Returns          void
   2222 **
   2223 ********************************************************************************/
   2224 void bta_gattc_process_listen_all(UINT8 cif)
   2225 {
   2226     UINT8               i_conn = 0;
   2227     tBTA_GATTC_CONN     *p_conn = &bta_gattc_cb.conn_track[0];
   2228 
   2229     for (i_conn = 0; i_conn < BTA_GATTC_CONN_MAX; i_conn++, p_conn ++)
   2230     {
   2231         if (p_conn->in_use )
   2232         {
   2233             if (bta_gattc_find_clcb_by_cif(cif, p_conn->remote_bda, BTA_GATT_TRANSPORT_LE) == NULL)
   2234             {
   2235                 bta_gattc_init_clcb_conn(cif, p_conn->remote_bda);
   2236             }
   2237             /* else already connected */
   2238         }
   2239     }
   2240 }
   2241 /*******************************************************************************
   2242 **
   2243 ** Function         bta_gattc_listen
   2244 **
   2245 ** Description      Start or stop a listen for connection
   2246 **
   2247 ** Returns          void
   2248 **
   2249 ********************************************************************************/
   2250 void bta_gattc_listen(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg)
   2251 {
   2252     tBTA_GATTC_RCB      *p_clreg = bta_gattc_cl_get_regcb(p_msg->api_listen.client_if);
   2253     tBTA_GATTC          cb_data;
   2254     UNUSED(p_cb);
   2255 
   2256     cb_data.reg_oper.status = BTA_GATT_ERROR;
   2257     cb_data.reg_oper.client_if = p_msg->api_listen.client_if;
   2258 
   2259     if (p_clreg == NULL)
   2260     {
   2261         APPL_TRACE_ERROR("bta_gattc_listen failed, unknown client_if: %d",
   2262                             p_msg->api_listen.client_if);
   2263         return;
   2264     }
   2265     /* mark bg conn record */
   2266     if (bta_gattc_mark_bg_conn(p_msg->api_listen.client_if,
   2267                                (BD_ADDR_PTR) p_msg->api_listen.remote_bda,
   2268                                p_msg->api_listen.start,
   2269                                TRUE))
   2270     {
   2271         if (!GATT_Listen(p_msg->api_listen.client_if,
   2272                          p_msg->api_listen.start,
   2273                          p_msg->api_listen.remote_bda))
   2274         {
   2275             APPL_TRACE_ERROR("Listen failure");
   2276             (*p_clreg->p_cback)(BTA_GATTC_LISTEN_EVT, &cb_data);
   2277         }
   2278         else
   2279         {
   2280             cb_data.status = BTA_GATT_OK;
   2281 
   2282             (*p_clreg->p_cback)(BTA_GATTC_LISTEN_EVT, &cb_data);
   2283 
   2284             if (p_msg->api_listen.start)
   2285             {
   2286                 /* if listen to a specific target */
   2287                 if (p_msg->api_listen.remote_bda != NULL)
   2288                 {
   2289 
   2290                     /* if is a connected remote device */
   2291                     if (L2CA_GetBleConnRole(p_msg->api_listen.remote_bda) == HCI_ROLE_SLAVE &&
   2292                         bta_gattc_find_clcb_by_cif(p_msg->api_listen.client_if,
   2293                                                    p_msg->api_listen.remote_bda,
   2294                                                    BTA_GATT_TRANSPORT_LE) == NULL)
   2295                     {
   2296 
   2297                         bta_gattc_init_clcb_conn(p_msg->api_listen.client_if,
   2298                                                 p_msg->api_listen.remote_bda);
   2299                     }
   2300                 }
   2301                 /* if listen to all */
   2302                 else
   2303                 {
   2304                     APPL_TRACE_ERROR("Listen For All now");
   2305                     /* go through all connected device and send
   2306                     callback for all connected slave connection */
   2307                     bta_gattc_process_listen_all(p_msg->api_listen.client_if);
   2308                 }
   2309             }
   2310         }
   2311     }
   2312 }
   2313 
   2314 /*******************************************************************************
   2315 **
   2316 ** Function         bta_gattc_broadcast
   2317 **
   2318 ** Description      Start or stop broadcasting
   2319 **
   2320 ** Returns          void
   2321 **
   2322 ********************************************************************************/
   2323 void bta_gattc_broadcast(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg)
   2324 {
   2325     tBTA_GATTC_RCB      *p_clreg = bta_gattc_cl_get_regcb(p_msg->api_listen.client_if);
   2326     tBTA_GATTC          cb_data;
   2327     UNUSED(p_cb);
   2328 
   2329     cb_data.reg_oper.client_if = p_msg->api_listen.client_if;
   2330     cb_data.reg_oper.status = BTM_BleBroadcast(p_msg->api_listen.start);
   2331 
   2332     if (p_clreg && p_clreg->p_cback)
   2333         (*p_clreg->p_cback)(BTA_GATTC_LISTEN_EVT, &cb_data);
   2334 }
   2335 #endif
   2336 #endif
   2337