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 #define LOG_TAG "bt_bta_gattc"
     27 
     28 #include <string.h>
     29 
     30 #include <base/callback.h>
     31 #include "bt_common.h"
     32 #include "bt_target.h"
     33 #include "bta_gattc_int.h"
     34 #include "bta_sys.h"
     35 #include "btif/include/btif_debug_conn.h"
     36 #include "l2c_api.h"
     37 #include "osi/include/log.h"
     38 #include "osi/include/osi.h"
     39 #include "stack/l2cap/l2c_int.h"
     40 #include "utl.h"
     41 
     42 #if (BTA_HH_LE_INCLUDED == TRUE)
     43 #include "bta_hh_int.h"
     44 #endif
     45 
     46 /*****************************************************************************
     47  *  Constants
     48  ****************************************************************************/
     49 static void bta_gattc_conn_cback(tGATT_IF gattc_if, BD_ADDR bda,
     50                                  uint16_t conn_id, bool connected,
     51                                  tGATT_DISCONN_REASON reason,
     52                                  tBT_TRANSPORT transport);
     53 
     54 static void bta_gattc_cmpl_cback(uint16_t conn_id, tGATTC_OPTYPE op,
     55                                  tGATT_STATUS status,
     56                                  tGATT_CL_COMPLETE* p_data);
     57 static void bta_gattc_cmpl_sendmsg(uint16_t conn_id, tGATTC_OPTYPE op,
     58                                    tBTA_GATT_STATUS status,
     59                                    tGATT_CL_COMPLETE* p_data);
     60 
     61 static void bta_gattc_deregister_cmpl(tBTA_GATTC_RCB* p_clreg);
     62 static void bta_gattc_enc_cmpl_cback(tGATT_IF gattc_if, BD_ADDR bda);
     63 static void bta_gattc_cong_cback(uint16_t conn_id, bool congested);
     64 static void bta_gattc_phy_update_cback(tGATT_IF gatt_if, uint16_t conn_id,
     65                                        uint8_t tx_phy, uint8_t rx_phy,
     66                                        uint8_t status);
     67 static void bta_gattc_conn_update_cback(tGATT_IF gatt_if, uint16_t conn_id,
     68                                         uint16_t interval, uint16_t latency,
     69                                         uint16_t timeout, uint8_t status);
     70 
     71 static tGATT_CBACK bta_gattc_cl_cback = {bta_gattc_conn_cback,
     72                                          bta_gattc_cmpl_cback,
     73                                          bta_gattc_disc_res_cback,
     74                                          bta_gattc_disc_cmpl_cback,
     75                                          NULL,
     76                                          bta_gattc_enc_cmpl_cback,
     77                                          bta_gattc_cong_cback,
     78                                          bta_gattc_phy_update_cback,
     79                                          bta_gattc_conn_update_cback};
     80 
     81 /* opcode(tGATTC_OPTYPE) order has to be comply with internal event order */
     82 static uint16_t bta_gattc_opcode_to_int_evt[] = {
     83     BTA_GATTC_API_READ_EVT, BTA_GATTC_API_WRITE_EVT, BTA_GATTC_API_EXEC_EVT,
     84     BTA_GATTC_API_CFG_MTU_EVT};
     85 
     86 static const char* bta_gattc_op_code_name[] = {
     87     "Unknown", "Discovery", "Read",         "Write",
     88     "Exec",    "Config",    "Notification", "Indication"};
     89 /*****************************************************************************
     90  *  Action Functions
     91  ****************************************************************************/
     92 
     93 void bta_gattc_reset_discover_st(tBTA_GATTC_SERV* p_srcb,
     94                                  tBTA_GATT_STATUS status);
     95 
     96 /*******************************************************************************
     97  *
     98  * Function         bta_gattc_enable
     99  *
    100  * Description      Enables GATTC module
    101  *
    102  *
    103  * Returns          void
    104  *
    105  ******************************************************************************/
    106 static void bta_gattc_enable() {
    107   APPL_TRACE_DEBUG("bta_gattc_enable");
    108 
    109   if (bta_gattc_cb.state == BTA_GATTC_STATE_DISABLED) {
    110     /* initialize control block */
    111     memset(&bta_gattc_cb, 0, sizeof(tBTA_GATTC_CB));
    112     bta_gattc_cb.state = BTA_GATTC_STATE_ENABLED;
    113   } else {
    114     APPL_TRACE_DEBUG("GATTC is arelady enabled");
    115   }
    116 }
    117 
    118 /*******************************************************************************
    119  *
    120  * Function         bta_gattc_disable
    121  *
    122  * Description      Disable GATTC module by cleaning up all active connections
    123  *                  and deregister all application.
    124  *
    125  * Returns          void
    126  *
    127  ******************************************************************************/
    128 void bta_gattc_disable() {
    129   uint8_t i;
    130 
    131   APPL_TRACE_DEBUG("bta_gattc_disable");
    132 
    133   if (bta_gattc_cb.state != BTA_GATTC_STATE_ENABLED) {
    134     APPL_TRACE_ERROR("not enabled or disable in pogress");
    135     return;
    136   }
    137 
    138   for (i = 0; i < BTA_GATTC_CL_MAX; i++) {
    139     if (bta_gattc_cb.cl_rcb[i].in_use) {
    140       bta_gattc_cb.state = BTA_GATTC_STATE_DISABLING;
    141 /* don't deregister HH GATT IF */
    142 /* HH GATT IF will be deregistered by bta_hh_le_deregister when disable HH */
    143 #if (BTA_HH_LE_INCLUDED == TRUE)
    144       if (!bta_hh_le_is_hh_gatt_if(bta_gattc_cb.cl_rcb[i].client_if)) {
    145 #endif
    146         bta_gattc_deregister(&bta_gattc_cb.cl_rcb[i]);
    147 #if (BTA_HH_LE_INCLUDED == TRUE)
    148       }
    149 #endif
    150     }
    151   }
    152 
    153   /* no registered apps, indicate disable completed */
    154   if (bta_gattc_cb.state != BTA_GATTC_STATE_DISABLING) {
    155     memset(&bta_gattc_cb, 0, sizeof(tBTA_GATTC_CB));
    156     bta_gattc_cb.state = BTA_GATTC_STATE_DISABLED;
    157   }
    158 }
    159 
    160 /*******************************************************************************
    161  *
    162  * Function         bta_gattc_register
    163  *
    164  * Description      Register a GATT client application with BTA.
    165  *
    166  * Returns          void
    167  *
    168  ******************************************************************************/
    169 void bta_gattc_register(tBT_UUID* p_app_uuid, tBTA_GATTC_CBACK* p_cback,
    170                         BtaAppRegisterCallback cb) {
    171   tBTA_GATT_STATUS status = BTA_GATT_NO_RESOURCES;
    172   uint8_t client_if = 0;
    173   APPL_TRACE_DEBUG("bta_gattc_register state %d", bta_gattc_cb.state);
    174 
    175   /* check if  GATTC module is already enabled . Else enable */
    176   if (bta_gattc_cb.state == BTA_GATTC_STATE_DISABLED) {
    177     bta_gattc_enable();
    178   }
    179   /* todo need to check duplicate uuid */
    180   for (uint8_t i = 0; i < BTA_GATTC_CL_MAX; i++) {
    181     if (!bta_gattc_cb.cl_rcb[i].in_use) {
    182       if ((p_app_uuid == NULL) ||
    183           (bta_gattc_cb.cl_rcb[i].client_if =
    184                GATT_Register(p_app_uuid, &bta_gattc_cl_cback)) == 0) {
    185         APPL_TRACE_ERROR("Register with GATT stack failed.");
    186         status = BTA_GATT_ERROR;
    187       } else {
    188         bta_gattc_cb.cl_rcb[i].in_use = true;
    189         bta_gattc_cb.cl_rcb[i].p_cback = p_cback;
    190         memcpy(&bta_gattc_cb.cl_rcb[i].app_uuid, p_app_uuid, sizeof(tBT_UUID));
    191 
    192         /* BTA use the same client interface as BTE GATT statck */
    193         client_if = bta_gattc_cb.cl_rcb[i].client_if;
    194 
    195         tBTA_GATTC_INT_START_IF* p_buf = (tBTA_GATTC_INT_START_IF*)osi_malloc(
    196             sizeof(tBTA_GATTC_INT_START_IF));
    197         p_buf->hdr.event = BTA_GATTC_INT_START_IF_EVT;
    198         p_buf->client_if = bta_gattc_cb.cl_rcb[i].client_if;
    199 
    200         bta_sys_sendmsg(p_buf);
    201         status = BTA_GATT_OK;
    202         break;
    203       }
    204     }
    205   }
    206 
    207   if (!cb.is_null()) cb.Run(client_if, status);
    208 }
    209 /*******************************************************************************
    210  *
    211  * Function         bta_gattc_start_if
    212  *
    213  * Description      start an application interface.
    214  *
    215  * Returns          none.
    216  *
    217  ******************************************************************************/
    218 void bta_gattc_start_if(tBTA_GATTC_DATA* p_msg) {
    219   if (bta_gattc_cl_get_regcb(p_msg->int_start_if.client_if) != NULL) {
    220     GATT_StartIf(p_msg->int_start_if.client_if);
    221   } else {
    222     APPL_TRACE_ERROR("Unable to start app.: Unknown interface =%d",
    223                      p_msg->int_start_if.client_if);
    224   }
    225 }
    226 /*******************************************************************************
    227  *
    228  * Function         bta_gattc_deregister
    229  *
    230  * Description      De-Register a GATT client application with BTA.
    231  *
    232  * Returns          void
    233  *
    234  ******************************************************************************/
    235 void bta_gattc_deregister(tBTA_GATTC_RCB* p_clreg) {
    236   uint8_t i;
    237   BT_HDR buf;
    238 
    239   if (p_clreg != NULL) {
    240     /* remove bg connection associated with this rcb */
    241     for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX; i++) {
    242       if (bta_gattc_cb.bg_track[i].in_use) {
    243         if (bta_gattc_cb.bg_track[i].cif_mask &
    244             (1 << (p_clreg->client_if - 1))) {
    245           bta_gattc_mark_bg_conn(p_clreg->client_if,
    246                                  bta_gattc_cb.bg_track[i].remote_bda, false);
    247           GATT_CancelConnect(p_clreg->client_if,
    248                              bta_gattc_cb.bg_track[i].remote_bda, false);
    249         }
    250       }
    251     }
    252 
    253     if (p_clreg->num_clcb > 0) {
    254       /* close all CLCB related to this app */
    255       for (i = 0; i < BTA_GATTC_CLCB_MAX; i++) {
    256         if (bta_gattc_cb.clcb[i].in_use &&
    257             (bta_gattc_cb.clcb[i].p_rcb == p_clreg)) {
    258           p_clreg->dereg_pending = true;
    259 
    260           buf.event = BTA_GATTC_API_CLOSE_EVT;
    261           buf.layer_specific = bta_gattc_cb.clcb[i].bta_conn_id;
    262           bta_gattc_close(&bta_gattc_cb.clcb[i], (tBTA_GATTC_DATA*)&buf);
    263         }
    264       }
    265     } else
    266       bta_gattc_deregister_cmpl(p_clreg);
    267   } else {
    268     APPL_TRACE_ERROR("%s: Deregister Failed unknown client cif", __func__);
    269     bta_hh_cleanup_disable(BTA_HH_OK);
    270   }
    271 }
    272 /*******************************************************************************
    273  *
    274  * Function         bta_gattc_process_api_open
    275  *
    276  * Description      process connect API request.
    277  *
    278  * Returns          void
    279  *
    280  ******************************************************************************/
    281 void bta_gattc_process_api_open(tBTA_GATTC_DATA* p_msg) {
    282   uint16_t event = ((BT_HDR*)p_msg)->event;
    283   tBTA_GATTC_CLCB* p_clcb = NULL;
    284   tBTA_GATTC_RCB* p_clreg = bta_gattc_cl_get_regcb(p_msg->api_conn.client_if);
    285 
    286   if (p_clreg != NULL) {
    287     if (p_msg->api_conn.is_direct) {
    288       p_clcb = bta_gattc_find_alloc_clcb(p_msg->api_conn.client_if,
    289                                          p_msg->api_conn.remote_bda,
    290                                          p_msg->api_conn.transport);
    291       if (p_clcb != NULL) {
    292         bta_gattc_sm_execute(p_clcb, event, p_msg);
    293       } else {
    294         APPL_TRACE_ERROR("No resources to open a new connection.");
    295 
    296         bta_gattc_send_open_cback(
    297             p_clreg, BTA_GATT_NO_RESOURCES, p_msg->api_conn.remote_bda,
    298             BTA_GATT_INVALID_CONN_ID, p_msg->api_conn.transport, 0);
    299       }
    300     } else {
    301       bta_gattc_init_bk_conn(&p_msg->api_conn, p_clreg);
    302     }
    303   } else {
    304     APPL_TRACE_ERROR("bta_gattc_process_api_open Failed, unknown client_if: %d",
    305                      p_msg->api_conn.client_if);
    306   }
    307 }
    308 /*******************************************************************************
    309  *
    310  * Function         bta_gattc_process_api_open_cancel
    311  *
    312  * Description      process connect API request.
    313  *
    314  * Returns          void
    315  *
    316  ******************************************************************************/
    317 void bta_gattc_process_api_open_cancel(tBTA_GATTC_DATA* p_msg) {
    318   uint16_t event = ((BT_HDR*)p_msg)->event;
    319   tBTA_GATTC_CLCB* p_clcb = NULL;
    320   tBTA_GATTC_RCB* p_clreg;
    321   tBTA_GATTC cb_data;
    322 
    323   if (p_msg->api_cancel_conn.is_direct) {
    324     p_clcb = bta_gattc_find_clcb_by_cif(p_msg->api_cancel_conn.client_if,
    325                                         p_msg->api_cancel_conn.remote_bda,
    326                                         BTA_GATT_TRANSPORT_LE);
    327     if (p_clcb != NULL) {
    328       bta_gattc_sm_execute(p_clcb, event, p_msg);
    329     } else {
    330       APPL_TRACE_ERROR("No such connection need to be cancelled");
    331 
    332       p_clreg = bta_gattc_cl_get_regcb(p_msg->api_cancel_conn.client_if);
    333 
    334       if (p_clreg && p_clreg->p_cback) {
    335         cb_data.status = BTA_GATT_ERROR;
    336         (*p_clreg->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
    337       }
    338     }
    339   } else {
    340     bta_gattc_cancel_bk_conn(&p_msg->api_cancel_conn);
    341   }
    342 }
    343 
    344 /*******************************************************************************
    345  *
    346  * Function         bta_gattc_process_enc_cmpl
    347  *
    348  * Description      process encryption complete message.
    349  *
    350  * Returns          void
    351  *
    352  ******************************************************************************/
    353 void bta_gattc_process_enc_cmpl(tBTA_GATTC_DATA* p_msg) {
    354   tBTA_GATTC_RCB* p_clreg;
    355   tBTA_GATTC cb_data;
    356 
    357   p_clreg = bta_gattc_cl_get_regcb(p_msg->enc_cmpl.client_if);
    358 
    359   if (p_clreg && p_clreg->p_cback) {
    360     memset(&cb_data, 0, sizeof(tBTA_GATTC));
    361 
    362     cb_data.enc_cmpl.client_if = p_msg->enc_cmpl.client_if;
    363     bdcpy(cb_data.enc_cmpl.remote_bda, p_msg->enc_cmpl.remote_bda);
    364 
    365     (*p_clreg->p_cback)(BTA_GATTC_ENC_CMPL_CB_EVT, &cb_data);
    366   }
    367 }
    368 
    369 /*******************************************************************************
    370  *
    371  * Function         bta_gattc_cancel_open_error
    372  *
    373  * Description
    374  *
    375  * Returns          void
    376  *
    377  ******************************************************************************/
    378 void bta_gattc_cancel_open_error(tBTA_GATTC_CLCB* p_clcb,
    379                                  UNUSED_ATTR tBTA_GATTC_DATA* p_data) {
    380   tBTA_GATTC cb_data;
    381 
    382   cb_data.status = BTA_GATT_ERROR;
    383 
    384   if (p_clcb && p_clcb->p_rcb && p_clcb->p_rcb->p_cback)
    385     (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
    386 }
    387 
    388 /*******************************************************************************
    389  *
    390  * Function         bta_gattc_open_error
    391  *
    392  * Description
    393  *
    394  * Returns          void
    395  *
    396  ******************************************************************************/
    397 void bta_gattc_open_error(tBTA_GATTC_CLCB* p_clcb,
    398                           UNUSED_ATTR tBTA_GATTC_DATA* p_data) {
    399   APPL_TRACE_ERROR("Connection already opened. wrong state");
    400 
    401   bta_gattc_send_open_cback(p_clcb->p_rcb, BTA_GATT_OK, p_clcb->bda,
    402                             p_clcb->bta_conn_id, p_clcb->transport, 0);
    403 }
    404 /*******************************************************************************
    405  *
    406  * Function         bta_gattc_open_fail
    407  *
    408  * Description
    409  *
    410  * Returns          void
    411  *
    412  ******************************************************************************/
    413 void bta_gattc_open_fail(tBTA_GATTC_CLCB* p_clcb,
    414                          UNUSED_ATTR tBTA_GATTC_DATA* p_data) {
    415   bta_gattc_send_open_cback(p_clcb->p_rcb, BTA_GATT_ERROR, p_clcb->bda,
    416                             p_clcb->bta_conn_id, p_clcb->transport, 0);
    417   /* open failure, remove clcb */
    418   bta_gattc_clcb_dealloc(p_clcb);
    419 }
    420 
    421 /*******************************************************************************
    422  *
    423  * Function         bta_gattc_open
    424  *
    425  * Description      Process API connection function.
    426  *
    427  * Returns          void
    428  *
    429  ******************************************************************************/
    430 void bta_gattc_open(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
    431   tBTA_GATTC_DATA gattc_data;
    432 
    433   /* open/hold a connection */
    434   if (!GATT_Connect(p_clcb->p_rcb->client_if, p_data->api_conn.remote_bda, true,
    435                     p_data->api_conn.transport, p_data->api_conn.opportunistic,
    436                     p_data->api_conn.initiating_phys)) {
    437     APPL_TRACE_ERROR("Connection open failure");
    438 
    439     bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_OPEN_FAIL_EVT, p_data);
    440   } else {
    441     /* a connected remote device */
    442     if (GATT_GetConnIdIfConnected(
    443             p_clcb->p_rcb->client_if, p_data->api_conn.remote_bda,
    444             &p_clcb->bta_conn_id, p_data->api_conn.transport)) {
    445       gattc_data.int_conn.hdr.layer_specific = p_clcb->bta_conn_id;
    446 
    447       bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, &gattc_data);
    448     }
    449     /* else wait for the callback event */
    450   }
    451 }
    452 /*******************************************************************************
    453  *
    454  * Function         bta_gattc_init_bk_conn
    455  *
    456  * Description      Process API Open for a background connection
    457  *
    458  * Returns          void
    459  *
    460  ******************************************************************************/
    461 void bta_gattc_init_bk_conn(tBTA_GATTC_API_OPEN* p_data,
    462                             tBTA_GATTC_RCB* p_clreg) {
    463   tBTA_GATT_STATUS status = BTA_GATT_NO_RESOURCES;
    464   uint16_t conn_id;
    465   tBTA_GATTC_CLCB* p_clcb;
    466   tBTA_GATTC_DATA gattc_data;
    467 
    468   if (bta_gattc_mark_bg_conn(p_data->client_if, p_data->remote_bda, true)) {
    469     /* always call open to hold a connection */
    470     if (!GATT_Connect(p_data->client_if, p_data->remote_bda, false,
    471                       p_data->transport, false)) {
    472       uint8_t* bda = (uint8_t*)p_data->remote_bda;
    473       status = BTA_GATT_ERROR;
    474       APPL_TRACE_ERROR(
    475           "%s unable to connect to remote "
    476           "bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
    477           __func__, bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
    478 
    479     } else {
    480       status = BTA_GATT_OK;
    481 
    482       /* if is a connected remote device */
    483       if (GATT_GetConnIdIfConnected(p_data->client_if, p_data->remote_bda,
    484                                     &conn_id, p_data->transport)) {
    485         p_clcb = bta_gattc_find_alloc_clcb(
    486             p_data->client_if, p_data->remote_bda, BTA_GATT_TRANSPORT_LE);
    487         if (p_clcb != NULL) {
    488           gattc_data.hdr.layer_specific = p_clcb->bta_conn_id = conn_id;
    489 
    490           /* open connection */
    491           bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, &gattc_data);
    492           status = BTA_GATT_OK;
    493         }
    494       }
    495     }
    496   }
    497 
    498   /* open failure, report OPEN_EVT */
    499   if (status != BTA_GATT_OK) {
    500     bta_gattc_send_open_cback(p_clreg, status, p_data->remote_bda,
    501                               BTA_GATT_INVALID_CONN_ID, BTA_GATT_TRANSPORT_LE,
    502                               0);
    503   }
    504 }
    505 /*******************************************************************************
    506  *
    507  * Function         bta_gattc_cancel_bk_conn
    508  *
    509  * Description      Process API Cancel Open for a background connection
    510  *
    511  * Returns          void
    512  *
    513  ******************************************************************************/
    514 void bta_gattc_cancel_bk_conn(tBTA_GATTC_API_CANCEL_OPEN* p_data) {
    515   tBTA_GATTC_RCB* p_clreg;
    516   tBTA_GATTC cb_data;
    517   cb_data.status = BTA_GATT_ERROR;
    518 
    519   /* remove the device from the bg connection mask */
    520   if (bta_gattc_mark_bg_conn(p_data->client_if, p_data->remote_bda, false)) {
    521     if (GATT_CancelConnect(p_data->client_if, p_data->remote_bda, false)) {
    522       cb_data.status = BTA_GATT_OK;
    523     } else {
    524       APPL_TRACE_ERROR("bta_gattc_cancel_bk_conn failed");
    525     }
    526   }
    527   p_clreg = bta_gattc_cl_get_regcb(p_data->client_if);
    528 
    529   if (p_clreg && p_clreg->p_cback) {
    530     (*p_clreg->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
    531   }
    532 }
    533 /*******************************************************************************
    534  *
    535  * Function         bta_gattc_int_cancel_open_ok
    536  *
    537  * Description
    538  *
    539  * Returns          void
    540  *
    541  ******************************************************************************/
    542 void bta_gattc_cancel_open_ok(tBTA_GATTC_CLCB* p_clcb,
    543                               UNUSED_ATTR tBTA_GATTC_DATA* p_data) {
    544   tBTA_GATTC cb_data;
    545 
    546   if (p_clcb->p_rcb->p_cback) {
    547     cb_data.status = BTA_GATT_OK;
    548     (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
    549   }
    550 
    551   bta_gattc_clcb_dealloc(p_clcb);
    552 }
    553 /*******************************************************************************
    554  *
    555  * Function         bta_gattc_cancel_open
    556  *
    557  * Description
    558  *
    559  * Returns          void
    560  *
    561  ******************************************************************************/
    562 void bta_gattc_cancel_open(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
    563   tBTA_GATTC cb_data;
    564 
    565   if (GATT_CancelConnect(p_clcb->p_rcb->client_if,
    566                          p_data->api_cancel_conn.remote_bda, true)) {
    567     bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CANCEL_OPEN_OK_EVT, p_data);
    568   } else {
    569     if (p_clcb->p_rcb->p_cback) {
    570       cb_data.status = BTA_GATT_ERROR;
    571       (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
    572     }
    573   }
    574 }
    575 /*******************************************************************************
    576  *
    577  * Function         bta_gattc_conn
    578  *
    579  * Description      receive connection callback from stack
    580  *
    581  * Returns          void
    582  *
    583  ******************************************************************************/
    584 void bta_gattc_conn(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
    585   tBTA_GATTC_IF gatt_if;
    586   APPL_TRACE_DEBUG("bta_gattc_conn server cache state=%d",
    587                    p_clcb->p_srcb->state);
    588 
    589   if (p_data != NULL) {
    590     APPL_TRACE_DEBUG("bta_gattc_conn conn_id=%d", p_data->hdr.layer_specific);
    591     p_clcb->bta_conn_id = p_data->int_conn.hdr.layer_specific;
    592 
    593     GATT_GetConnectionInfor(p_data->hdr.layer_specific, &gatt_if, p_clcb->bda,
    594                             &p_clcb->transport);
    595   }
    596 
    597   p_clcb->p_srcb->connected = true;
    598 
    599   if (p_clcb->p_srcb->mtu == 0) p_clcb->p_srcb->mtu = GATT_DEF_BLE_MTU_SIZE;
    600 
    601   /* start database cache if needed */
    602   if (p_clcb->p_srcb->p_srvc_cache == NULL ||
    603       p_clcb->p_srcb->state != BTA_GATTC_SERV_IDLE) {
    604     if (p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE) {
    605       p_clcb->p_srcb->state = BTA_GATTC_SERV_LOAD;
    606       if (bta_gattc_cache_load(p_clcb)) {
    607         p_clcb->p_srcb->state = BTA_GATTC_SERV_IDLE;
    608         bta_gattc_reset_discover_st(p_clcb->p_srcb, BTA_GATT_OK);
    609       } else {
    610         p_clcb->p_srcb->state = BTA_GATTC_SERV_DISC;
    611         /* cache load failure, start discovery */
    612         bta_gattc_start_discover(p_clcb, NULL);
    613       }
    614     } else /* cache is building */
    615       p_clcb->state = BTA_GATTC_DISCOVER_ST;
    616   }
    617 
    618   else {
    619     /* a pending service handle change indication */
    620     if (p_clcb->p_srcb->srvc_hdl_chg) {
    621       p_clcb->p_srcb->srvc_hdl_chg = false;
    622       /* start discovery */
    623       bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
    624     }
    625   }
    626 
    627   if (p_clcb->p_rcb) {
    628     /* there is no RM for GATT */
    629     if (p_clcb->transport == BTA_TRANSPORT_BR_EDR)
    630       bta_sys_conn_open(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
    631 
    632     bta_gattc_send_open_cback(p_clcb->p_rcb, BTA_GATT_OK, p_clcb->bda,
    633                               p_clcb->bta_conn_id, p_clcb->transport,
    634                               p_clcb->p_srcb->mtu);
    635   }
    636 }
    637 /*******************************************************************************
    638  *
    639  * Function         bta_gattc_close_fail
    640  *
    641  * Description      close a  connection.
    642  *
    643  * Returns          void
    644  *
    645  ******************************************************************************/
    646 void bta_gattc_close_fail(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
    647   tBTA_GATTC cb_data;
    648 
    649   if (p_clcb->p_rcb->p_cback) {
    650     memset(&cb_data, 0, sizeof(tBTA_GATTC));
    651     cb_data.close.client_if = p_clcb->p_rcb->client_if;
    652     cb_data.close.conn_id = p_data->hdr.layer_specific;
    653     bdcpy(cb_data.close.remote_bda, p_clcb->bda);
    654     cb_data.close.status = BTA_GATT_ERROR;
    655     cb_data.close.reason = BTA_GATT_CONN_NONE;
    656 
    657     (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CLOSE_EVT, &cb_data);
    658   }
    659 }
    660 /*******************************************************************************
    661  *
    662  * Function         bta_gattc_api_close
    663  *
    664  * Description      close a GATTC connection.
    665  *
    666  * Returns          void
    667  *
    668  ******************************************************************************/
    669 void bta_gattc_close(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
    670   tBTA_GATTC_CBACK* p_cback = p_clcb->p_rcb->p_cback;
    671   tBTA_GATTC_RCB* p_clreg = p_clcb->p_rcb;
    672   tBTA_GATTC cb_data;
    673 
    674   APPL_TRACE_DEBUG("bta_gattc_close conn_id=%d", p_clcb->bta_conn_id);
    675 
    676   cb_data.close.client_if = p_clcb->p_rcb->client_if;
    677   cb_data.close.conn_id = p_clcb->bta_conn_id;
    678   cb_data.close.reason = p_clcb->reason;
    679   cb_data.close.status = p_clcb->status;
    680   bdcpy(cb_data.close.remote_bda, p_clcb->bda);
    681 
    682   if (p_clcb->transport == BTA_TRANSPORT_BR_EDR)
    683     bta_sys_conn_close(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
    684 
    685   bta_gattc_clcb_dealloc(p_clcb);
    686 
    687   if (p_data->hdr.event == BTA_GATTC_API_CLOSE_EVT) {
    688     cb_data.close.status = GATT_Disconnect(p_data->hdr.layer_specific);
    689   } else if (p_data->hdr.event == BTA_GATTC_INT_DISCONN_EVT) {
    690     cb_data.close.status = p_data->int_conn.reason;
    691     cb_data.close.reason = p_data->int_conn.reason;
    692   }
    693 
    694   if (p_cback) (*p_cback)(BTA_GATTC_CLOSE_EVT, (tBTA_GATTC*)&cb_data);
    695 
    696   if (p_clreg->num_clcb == 0 && p_clreg->dereg_pending) {
    697     bta_gattc_deregister_cmpl(p_clreg);
    698   }
    699 }
    700 /*******************************************************************************
    701  *
    702  * Function         bta_gattc_reset_discover_st
    703  *
    704  * Description      when a SRCB finished discovery, tell all related clcb.
    705  *
    706  * Returns          None.
    707  *
    708  ******************************************************************************/
    709 void bta_gattc_reset_discover_st(tBTA_GATTC_SERV* p_srcb,
    710                                  tBTA_GATT_STATUS status) {
    711   uint8_t i;
    712 
    713   for (i = 0; i < BTA_GATTC_CLCB_MAX; i++) {
    714     if (bta_gattc_cb.clcb[i].p_srcb == p_srcb) {
    715       bta_gattc_cb.clcb[i].status = status;
    716       bta_gattc_sm_execute(&bta_gattc_cb.clcb[i], BTA_GATTC_DISCOVER_CMPL_EVT,
    717                            NULL);
    718     }
    719   }
    720 }
    721 /*******************************************************************************
    722  *
    723  * Function         bta_gattc_disc_close
    724  *
    725  * Description      close a GATTC connection while in discovery state.
    726  *
    727  * Returns          void
    728  *
    729  ******************************************************************************/
    730 void bta_gattc_disc_close(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
    731   APPL_TRACE_DEBUG("%s: Discovery cancel conn_id=%d", __func__,
    732                    p_clcb->bta_conn_id);
    733 
    734   if (p_clcb->disc_active)
    735     bta_gattc_reset_discover_st(p_clcb->p_srcb, BTA_GATT_ERROR);
    736   else
    737     p_clcb->state = BTA_GATTC_CONN_ST;
    738 
    739   // This function only gets called as the result of a BTA_GATTC_API_CLOSE_EVT
    740   // while in the BTA_GATTC_DISCOVER_ST state. Once the state changes, the
    741   // connection itself still needs to be closed to resolve the original event.
    742   if (p_clcb->state == BTA_GATTC_CONN_ST) {
    743     APPL_TRACE_DEBUG(
    744         "State is back to BTA_GATTC_CONN_ST. "
    745         "Trigger connection close");
    746     bta_gattc_close(p_clcb, p_data);
    747   }
    748 }
    749 /*******************************************************************************
    750  *
    751  * Function         bta_gattc_set_discover_st
    752  *
    753  * Description      when a SRCB start discovery, tell all related clcb and set
    754  *                  the state.
    755  *
    756  * Returns          None.
    757  *
    758  ******************************************************************************/
    759 void bta_gattc_set_discover_st(tBTA_GATTC_SERV* p_srcb) {
    760   uint8_t i;
    761 
    762   L2CA_EnableUpdateBleConnParams(p_srcb->server_bda, false);
    763   for (i = 0; i < BTA_GATTC_CLCB_MAX; i++) {
    764     if (bta_gattc_cb.clcb[i].p_srcb == p_srcb) {
    765       bta_gattc_cb.clcb[i].status = BTA_GATT_OK;
    766       bta_gattc_cb.clcb[i].state = BTA_GATTC_DISCOVER_ST;
    767     }
    768   }
    769 }
    770 /*******************************************************************************
    771  *
    772  * Function         bta_gattc_restart_discover
    773  *
    774  * Description      process service change in discovery state, mark up the auto
    775  *                  update flag and set status to be discovery cancel for
    776  *                  current discovery.
    777  *
    778  * Returns          None.
    779  *
    780  ******************************************************************************/
    781 void bta_gattc_restart_discover(tBTA_GATTC_CLCB* p_clcb,
    782                                 UNUSED_ATTR tBTA_GATTC_DATA* p_data) {
    783   p_clcb->status = BTA_GATT_CANCEL;
    784   p_clcb->auto_update = BTA_GATTC_DISC_WAITING;
    785 }
    786 
    787 /*******************************************************************************
    788  *
    789  * Function         bta_gattc_cfg_mtu
    790  *
    791  * Description      Configure MTU size on the GATT connection.
    792  *
    793  * Returns          None.
    794  *
    795  ******************************************************************************/
    796 void bta_gattc_cfg_mtu(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
    797   tBTA_GATT_STATUS status;
    798 
    799   if (bta_gattc_enqueue(p_clcb, p_data)) {
    800     status = GATTC_ConfigureMTU(p_clcb->bta_conn_id, p_data->api_mtu.mtu);
    801 
    802     /* if failed, return callback here */
    803     if (status != GATT_SUCCESS && status != GATT_CMD_STARTED) {
    804       /* Dequeue the data, if it was enqueued */
    805       if (p_clcb->p_q_cmd == p_data) p_clcb->p_q_cmd = NULL;
    806 
    807       bta_gattc_cmpl_sendmsg(p_clcb->bta_conn_id, GATTC_OPTYPE_CONFIG, status,
    808                              NULL);
    809     }
    810   }
    811 }
    812 /*******************************************************************************
    813  *
    814  * Function         bta_gattc_start_discover
    815  *
    816  * Description      Start a discovery on server.
    817  *
    818  * Returns          None.
    819  *
    820  ******************************************************************************/
    821 void bta_gattc_start_discover(tBTA_GATTC_CLCB* p_clcb,
    822                               UNUSED_ATTR tBTA_GATTC_DATA* p_data) {
    823   APPL_TRACE_DEBUG(
    824       "bta_gattc_start_discover conn_id=%d p_clcb->p_srcb->state = %d ",
    825       p_clcb->bta_conn_id, p_clcb->p_srcb->state);
    826 
    827   if (((p_clcb->p_q_cmd == NULL ||
    828         p_clcb->auto_update == BTA_GATTC_REQ_WAITING) &&
    829        p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE) ||
    830       p_clcb->p_srcb->state == BTA_GATTC_SERV_DISC)
    831   /* no pending operation, start discovery right away */
    832   {
    833     p_clcb->auto_update = BTA_GATTC_NO_SCHEDULE;
    834 
    835     if (p_clcb->p_srcb != NULL) {
    836       /* clear the service change mask */
    837       p_clcb->p_srcb->srvc_hdl_chg = false;
    838       p_clcb->p_srcb->update_count = 0;
    839       p_clcb->p_srcb->state = BTA_GATTC_SERV_DISC_ACT;
    840 
    841       if (p_clcb->transport == BTA_TRANSPORT_LE)
    842         L2CA_EnableUpdateBleConnParams(p_clcb->p_srcb->server_bda, false);
    843 
    844       /* set all srcb related clcb into discovery ST */
    845       bta_gattc_set_discover_st(p_clcb->p_srcb);
    846 
    847       p_clcb->status = bta_gattc_init_cache(p_clcb->p_srcb);
    848       if (p_clcb->status == BTA_GATT_OK) {
    849         p_clcb->status = bta_gattc_discover_pri_service(
    850             p_clcb->bta_conn_id, p_clcb->p_srcb, GATT_DISC_SRVC_ALL);
    851       }
    852       if (p_clcb->status != BTA_GATT_OK) {
    853         APPL_TRACE_ERROR("discovery on server failed");
    854         bta_gattc_reset_discover_st(p_clcb->p_srcb, p_clcb->status);
    855       } else
    856         p_clcb->disc_active = true;
    857     } else {
    858       APPL_TRACE_ERROR("unknown device, can not start discovery");
    859     }
    860   }
    861   /* pending operation, wait until it finishes */
    862   else {
    863     p_clcb->auto_update = BTA_GATTC_DISC_WAITING;
    864 
    865     if (p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE)
    866       p_clcb->state = BTA_GATTC_CONN_ST; /* set clcb state */
    867   }
    868 }
    869 /*******************************************************************************
    870  *
    871  * Function         bta_gattc_disc_cmpl
    872  *
    873  * Description      discovery on server is finished
    874  *
    875  * Returns          None.
    876  *
    877  ******************************************************************************/
    878 void bta_gattc_disc_cmpl(tBTA_GATTC_CLCB* p_clcb,
    879                          UNUSED_ATTR tBTA_GATTC_DATA* p_data) {
    880   tBTA_GATTC_DATA* p_q_cmd = p_clcb->p_q_cmd;
    881 
    882   APPL_TRACE_DEBUG("bta_gattc_disc_cmpl conn_id=%d", p_clcb->bta_conn_id);
    883 
    884   if (p_clcb->transport == BTA_TRANSPORT_LE)
    885     L2CA_EnableUpdateBleConnParams(p_clcb->p_srcb->server_bda, true);
    886   p_clcb->p_srcb->state = BTA_GATTC_SERV_IDLE;
    887   p_clcb->disc_active = false;
    888 
    889   if (p_clcb->status != GATT_SUCCESS) {
    890     /* clean up cache */
    891     if (p_clcb->p_srcb && p_clcb->p_srcb->p_srvc_cache) {
    892       list_free(p_clcb->p_srcb->p_srvc_cache);
    893       p_clcb->p_srcb->p_srvc_cache = NULL;
    894     }
    895 
    896     /* used to reset cache in application */
    897     bta_gattc_cache_reset(p_clcb->p_srcb->server_bda);
    898   }
    899   if (p_clcb->p_srcb && p_clcb->p_srcb->p_srvc_list) {
    900     /* release pending attribute list buffer */
    901     osi_free_and_reset((void**)&p_clcb->p_srcb->p_srvc_list);
    902   }
    903 
    904   if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING) {
    905     /* start discovery again */
    906     p_clcb->auto_update = BTA_GATTC_REQ_WAITING;
    907     bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
    908   }
    909   /* get any queued command to proceed */
    910   else if (p_q_cmd != NULL) {
    911     p_clcb->p_q_cmd = NULL;
    912     /* execute pending operation of link block still present */
    913     if (l2cu_find_lcb_by_bd_addr(p_clcb->p_srcb->server_bda, BT_TRANSPORT_LE) !=
    914         NULL) {
    915       bta_gattc_sm_execute(p_clcb, p_q_cmd->hdr.event, p_q_cmd);
    916     }
    917     /* if the command executed requeued the cmd, we don't
    918      * want to free the underlying buffer that's being
    919      * referenced by p_clcb->p_q_cmd
    920      */
    921     if (p_q_cmd != p_clcb->p_q_cmd) osi_free_and_reset((void**)&p_q_cmd);
    922   }
    923 }
    924 /*******************************************************************************
    925  *
    926  * Function         bta_gattc_read
    927  *
    928  * Description      Read an attribute
    929  *
    930  * Returns          None.
    931  *
    932  ******************************************************************************/
    933 void bta_gattc_read(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
    934   if (!bta_gattc_enqueue(p_clcb, p_data)) return;
    935 
    936   tBTA_GATT_STATUS status;
    937   if (p_data->api_read.handle != 0) {
    938     tGATT_READ_PARAM read_param;
    939     memset(&read_param, 0, sizeof(tGATT_READ_PARAM));
    940     read_param.by_handle.handle = p_data->api_read.handle;
    941     read_param.by_handle.auth_req = p_data->api_read.auth_req;
    942     status = GATTC_Read(p_clcb->bta_conn_id, GATT_READ_BY_HANDLE, &read_param);
    943   } else {
    944     tGATT_READ_PARAM read_param;
    945     memset(&read_param, 0, sizeof(tGATT_READ_BY_TYPE));
    946 
    947     read_param.char_type.s_handle = p_data->api_read.s_handle;
    948     read_param.char_type.e_handle = p_data->api_read.e_handle;
    949     read_param.char_type.uuid = p_data->api_read.uuid;
    950     read_param.char_type.auth_req = p_data->api_read.auth_req;
    951     status = GATTC_Read(p_clcb->bta_conn_id, GATT_READ_BY_TYPE, &read_param);
    952   }
    953 
    954   /* read fail */
    955   if (status != BTA_GATT_OK) {
    956     /* Dequeue the data, if it was enqueued */
    957     if (p_clcb->p_q_cmd == p_data) p_clcb->p_q_cmd = NULL;
    958 
    959     bta_gattc_cmpl_sendmsg(p_clcb->bta_conn_id, GATTC_OPTYPE_READ, status,
    960                            NULL);
    961   }
    962 }
    963 /*******************************************************************************
    964  *
    965  * Function         bta_gattc_read_multi
    966  *
    967  * Description      read multiple
    968  *
    969  * Returns          None.
    970  ******************************************************************************/
    971 void bta_gattc_read_multi(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
    972   tBTA_GATT_STATUS status = BTA_GATT_OK;
    973   tGATT_READ_PARAM read_param;
    974 
    975   if (bta_gattc_enqueue(p_clcb, p_data)) {
    976     memset(&read_param, 0, sizeof(tGATT_READ_PARAM));
    977 
    978     if (status == BTA_GATT_OK) {
    979       read_param.read_multiple.num_handles = p_data->api_read_multi.num_attr;
    980       read_param.read_multiple.auth_req = p_data->api_read_multi.auth_req;
    981       memcpy(&read_param.read_multiple.handles, p_data->api_read_multi.handles,
    982              sizeof(uint16_t) * p_data->api_read_multi.num_attr);
    983 
    984       status = GATTC_Read(p_clcb->bta_conn_id, GATT_READ_MULTIPLE, &read_param);
    985     }
    986 
    987     /* read fail */
    988     if (status != BTA_GATT_OK) {
    989       /* Dequeue the data, if it was enqueued */
    990       if (p_clcb->p_q_cmd == p_data) p_clcb->p_q_cmd = NULL;
    991 
    992       bta_gattc_cmpl_sendmsg(p_clcb->bta_conn_id, GATTC_OPTYPE_READ, status,
    993                              NULL);
    994     }
    995   }
    996 }
    997 /*******************************************************************************
    998  *
    999  * Function         bta_gattc_write
   1000  *
   1001  * Description      Write an attribute
   1002  *
   1003  * Returns          None.
   1004  *
   1005  ******************************************************************************/
   1006 void bta_gattc_write(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
   1007   if (!bta_gattc_enqueue(p_clcb, p_data)) return;
   1008 
   1009   tBTA_GATT_STATUS status = BTA_GATT_OK;
   1010   tGATT_VALUE attr;
   1011 
   1012   attr.conn_id = p_clcb->bta_conn_id;
   1013   attr.handle = p_data->api_write.handle;
   1014   attr.offset = p_data->api_write.offset;
   1015   attr.len = p_data->api_write.len;
   1016   attr.auth_req = p_data->api_write.auth_req;
   1017 
   1018   if (p_data->api_write.p_value)
   1019     memcpy(attr.value, p_data->api_write.p_value, p_data->api_write.len);
   1020 
   1021   status =
   1022       GATTC_Write(p_clcb->bta_conn_id, p_data->api_write.write_type, &attr);
   1023 
   1024   /* write fail */
   1025   if (status != BTA_GATT_OK) {
   1026     /* Dequeue the data, if it was enqueued */
   1027     if (p_clcb->p_q_cmd == p_data) p_clcb->p_q_cmd = NULL;
   1028 
   1029     bta_gattc_cmpl_sendmsg(p_clcb->bta_conn_id, GATTC_OPTYPE_WRITE, status,
   1030                            NULL);
   1031   }
   1032 }
   1033 /*******************************************************************************
   1034  *
   1035  * Function         bta_gattc_execute
   1036  *
   1037  * Description      send execute write
   1038  *
   1039  * Returns          None.
   1040  ******************************************************************************/
   1041 void bta_gattc_execute(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
   1042   tBTA_GATT_STATUS status;
   1043 
   1044   if (bta_gattc_enqueue(p_clcb, p_data)) {
   1045     status =
   1046         GATTC_ExecuteWrite(p_clcb->bta_conn_id, p_data->api_exec.is_execute);
   1047 
   1048     if (status != BTA_GATT_OK) {
   1049       /* Dequeue the data, if it was enqueued */
   1050       if (p_clcb->p_q_cmd == p_data) p_clcb->p_q_cmd = NULL;
   1051 
   1052       bta_gattc_cmpl_sendmsg(p_clcb->bta_conn_id, GATTC_OPTYPE_EXE_WRITE,
   1053                              status, NULL);
   1054     }
   1055   }
   1056 }
   1057 /*******************************************************************************
   1058  *
   1059  * Function         bta_gattc_confirm
   1060  *
   1061  * Description      send handle value confirmation
   1062  *
   1063  * Returns          None.
   1064  *
   1065  ******************************************************************************/
   1066 void bta_gattc_confirm(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
   1067   uint16_t handle = p_data->api_confirm.handle;
   1068 
   1069   if (GATTC_SendHandleValueConfirm(p_data->api_confirm.hdr.layer_specific,
   1070                                    handle) != GATT_SUCCESS) {
   1071     APPL_TRACE_ERROR("bta_gattc_confirm to handle [0x%04x] failed", handle);
   1072   } else {
   1073     /* if over BR_EDR, inform PM for mode change */
   1074     if (p_clcb->transport == BTA_TRANSPORT_BR_EDR) {
   1075       bta_sys_busy(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
   1076       bta_sys_idle(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
   1077     }
   1078   }
   1079 }
   1080 /*******************************************************************************
   1081  *
   1082  * Function         bta_gattc_read_cmpl
   1083  *
   1084  * Description      read complete
   1085  *
   1086  * Returns          None.
   1087  *
   1088  ******************************************************************************/
   1089 void bta_gattc_read_cmpl(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_OP_CMPL* p_data) {
   1090   GATT_READ_OP_CB cb = p_clcb->p_q_cmd->api_read.read_cb;
   1091   void* my_cb_data = p_clcb->p_q_cmd->api_read.read_cb_data;
   1092 
   1093   // if it was read by handle, return the handle requested, if read by UUID, use
   1094   // handle returned from remote
   1095   uint16_t handle = p_clcb->p_q_cmd->api_read.handle;
   1096   if (handle == 0) handle = p_data->p_cmpl->att_value.handle;
   1097 
   1098   osi_free_and_reset((void**)&p_clcb->p_q_cmd);
   1099 
   1100   if (cb) {
   1101     cb(p_clcb->bta_conn_id, p_data->status, handle,
   1102        p_data->p_cmpl->att_value.len, p_data->p_cmpl->att_value.value,
   1103        my_cb_data);
   1104   }
   1105 }
   1106 /*******************************************************************************
   1107  *
   1108  * Function         bta_gattc_write_cmpl
   1109  *
   1110  * Description      write complete
   1111  *
   1112  * Returns          None.
   1113  *
   1114  ******************************************************************************/
   1115 void bta_gattc_write_cmpl(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_OP_CMPL* p_data) {
   1116   GATT_WRITE_OP_CB cb = p_clcb->p_q_cmd->api_write.write_cb;
   1117   void* my_cb_data = p_clcb->p_q_cmd->api_write.write_cb_data;
   1118 
   1119   osi_free_and_reset((void**)&p_clcb->p_q_cmd);
   1120 
   1121   if (cb) {
   1122     cb(p_clcb->bta_conn_id, p_data->status, p_data->p_cmpl->att_value.handle,
   1123        my_cb_data);
   1124   }
   1125 }
   1126 /*******************************************************************************
   1127  *
   1128  * Function         bta_gattc_exec_cmpl
   1129  *
   1130  * Description      execute write complete
   1131  *
   1132  * Returns          None.
   1133  *
   1134  ******************************************************************************/
   1135 void bta_gattc_exec_cmpl(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_OP_CMPL* p_data) {
   1136   tBTA_GATTC cb_data;
   1137 
   1138   osi_free_and_reset((void**)&p_clcb->p_q_cmd);
   1139   p_clcb->status = BTA_GATT_OK;
   1140 
   1141   /* execute complete, callback */
   1142   cb_data.exec_cmpl.conn_id = p_clcb->bta_conn_id;
   1143   cb_data.exec_cmpl.status = p_data->status;
   1144 
   1145   (*p_clcb->p_rcb->p_cback)(BTA_GATTC_EXEC_EVT, &cb_data);
   1146 }
   1147 
   1148 /*******************************************************************************
   1149  *
   1150  * Function         bta_gattc_cfg_mtu_cmpl
   1151  *
   1152  * Description      configure MTU operation complete
   1153  *
   1154  * Returns          None.
   1155  *
   1156  ******************************************************************************/
   1157 void bta_gattc_cfg_mtu_cmpl(tBTA_GATTC_CLCB* p_clcb,
   1158                             tBTA_GATTC_OP_CMPL* p_data) {
   1159   tBTA_GATTC cb_data;
   1160 
   1161   osi_free_and_reset((void**)&p_clcb->p_q_cmd);
   1162 
   1163   if (p_data->p_cmpl && p_data->status == BTA_GATT_OK)
   1164     p_clcb->p_srcb->mtu = p_data->p_cmpl->mtu;
   1165 
   1166   /* configure MTU complete, callback */
   1167   p_clcb->status = p_data->status;
   1168   cb_data.cfg_mtu.conn_id = p_clcb->bta_conn_id;
   1169   cb_data.cfg_mtu.status = p_data->status;
   1170   cb_data.cfg_mtu.mtu = p_clcb->p_srcb->mtu;
   1171 
   1172   (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CFG_MTU_EVT, &cb_data);
   1173 }
   1174 /*******************************************************************************
   1175  *
   1176  * Function         bta_gattc_op_cmpl
   1177  *
   1178  * Description      operation completed.
   1179  *
   1180  * Returns          None.
   1181  *
   1182  ******************************************************************************/
   1183 void bta_gattc_op_cmpl(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
   1184   uint8_t op = (uint8_t)p_data->op_cmpl.op_code;
   1185   uint8_t mapped_op = 0;
   1186 
   1187   APPL_TRACE_DEBUG("bta_gattc_op_cmpl op = %d", op);
   1188 
   1189   if (op == GATTC_OPTYPE_INDICATION || op == GATTC_OPTYPE_NOTIFICATION) {
   1190     APPL_TRACE_ERROR("unexpected operation, ignored");
   1191   } else if (op >= GATTC_OPTYPE_READ) {
   1192     if (p_clcb->p_q_cmd == NULL) {
   1193       APPL_TRACE_ERROR("No pending command");
   1194       return;
   1195     }
   1196     if (p_clcb->p_q_cmd->hdr.event !=
   1197         bta_gattc_opcode_to_int_evt[op - GATTC_OPTYPE_READ]) {
   1198       mapped_op = p_clcb->p_q_cmd->hdr.event - BTA_GATTC_API_READ_EVT +
   1199                   GATTC_OPTYPE_READ;
   1200       if (mapped_op > GATTC_OPTYPE_INDICATION) mapped_op = 0;
   1201 
   1202       APPL_TRACE_ERROR(
   1203           "expect op:(%s :0x%04x), receive unexpected operation (%s).",
   1204           bta_gattc_op_code_name[mapped_op], p_clcb->p_q_cmd->hdr.event,
   1205           bta_gattc_op_code_name[op]);
   1206       return;
   1207     }
   1208 
   1209     /* Except for MTU configuration, discard responses if service change
   1210      * indication is received before operation completed */
   1211     if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING &&
   1212         p_clcb->p_srcb->srvc_hdl_chg && op != GATTC_OPTYPE_CONFIG) {
   1213       APPL_TRACE_DEBUG(
   1214           "Discard all responses when service change indication is received.");
   1215       p_data->op_cmpl.status = GATT_ERROR;
   1216     }
   1217 
   1218     /* service handle change void the response, discard it */
   1219     if (op == GATTC_OPTYPE_READ)
   1220       bta_gattc_read_cmpl(p_clcb, &p_data->op_cmpl);
   1221 
   1222     else if (op == GATTC_OPTYPE_WRITE)
   1223       bta_gattc_write_cmpl(p_clcb, &p_data->op_cmpl);
   1224 
   1225     else if (op == GATTC_OPTYPE_EXE_WRITE)
   1226       bta_gattc_exec_cmpl(p_clcb, &p_data->op_cmpl);
   1227 
   1228     else if (op == GATTC_OPTYPE_CONFIG)
   1229       bta_gattc_cfg_mtu_cmpl(p_clcb, &p_data->op_cmpl);
   1230 
   1231     if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING) {
   1232       p_clcb->auto_update = BTA_GATTC_REQ_WAITING;
   1233       bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
   1234     }
   1235   }
   1236 }
   1237 /*******************************************************************************
   1238  *
   1239  * Function         bta_gattc_op_cmpl
   1240  *
   1241  * Description      operation completed.
   1242  *
   1243  * Returns          None.
   1244  *
   1245  ******************************************************************************/
   1246 void bta_gattc_ignore_op_cmpl(UNUSED_ATTR tBTA_GATTC_CLCB* p_clcb,
   1247                               tBTA_GATTC_DATA* p_data) {
   1248   /* receive op complete when discovery is started, ignore the response,
   1249       and wait for discovery finish and resent */
   1250   APPL_TRACE_DEBUG("bta_gattc_ignore_op_cmpl op = %d",
   1251                    p_data->hdr.layer_specific);
   1252 }
   1253 /*******************************************************************************
   1254  *
   1255  * Function         bta_gattc_search
   1256  *
   1257  * Description      start a search in the local server cache
   1258  *
   1259  * Returns          None.
   1260  *
   1261  ******************************************************************************/
   1262 void bta_gattc_search(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
   1263   tBTA_GATT_STATUS status = GATT_INTERNAL_ERROR;
   1264   tBTA_GATTC cb_data;
   1265   APPL_TRACE_DEBUG("bta_gattc_search conn_id=%d", p_clcb->bta_conn_id);
   1266   if (p_clcb->p_srcb && p_clcb->p_srcb->p_srvc_cache) {
   1267     status = BTA_GATT_OK;
   1268     /* search the local cache of a server device */
   1269     bta_gattc_search_service(p_clcb, p_data->api_search.p_srvc_uuid);
   1270   }
   1271   cb_data.search_cmpl.status = status;
   1272   cb_data.search_cmpl.conn_id = p_clcb->bta_conn_id;
   1273 
   1274   /* end of search or no server cache available */
   1275   (*p_clcb->p_rcb->p_cback)(BTA_GATTC_SEARCH_CMPL_EVT, &cb_data);
   1276 }
   1277 /*******************************************************************************
   1278  *
   1279  * Function         bta_gattc_q_cmd
   1280  *
   1281  * Description      enqueue a command into control block, usually because
   1282  *                  discovery operation is busy.
   1283  *
   1284  * Returns          None.
   1285  *
   1286  ******************************************************************************/
   1287 void bta_gattc_q_cmd(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
   1288   bta_gattc_enqueue(p_clcb, p_data);
   1289 }
   1290 
   1291 /*******************************************************************************
   1292  *
   1293  * Function         bta_gattc_fail
   1294  *
   1295  * Description      report API call failure back to apps
   1296  *
   1297  * Returns          None.
   1298  *
   1299  ******************************************************************************/
   1300 void bta_gattc_fail(tBTA_GATTC_CLCB* p_clcb,
   1301                     UNUSED_ATTR tBTA_GATTC_DATA* p_data) {
   1302   if (p_clcb->status == BTA_GATT_OK) {
   1303     APPL_TRACE_ERROR("operation not supported at current state [%d]",
   1304                      p_clcb->state);
   1305   }
   1306 }
   1307 
   1308 /*******************************************************************************
   1309  *
   1310  * Function         bta_gattc_deregister_cmpl
   1311  *
   1312  * Description      De-Register a GATT client application with BTA completed.
   1313  *
   1314  * Returns          void
   1315  *
   1316  ******************************************************************************/
   1317 static void bta_gattc_deregister_cmpl(tBTA_GATTC_RCB* p_clreg) {
   1318   tBTA_GATTC_IF client_if = p_clreg->client_if;
   1319   tBTA_GATTC cb_data;
   1320   tBTA_GATTC_CBACK* p_cback = p_clreg->p_cback;
   1321 
   1322   memset(&cb_data, 0, sizeof(tBTA_GATTC));
   1323 
   1324   GATT_Deregister(p_clreg->client_if);
   1325   memset(p_clreg, 0, sizeof(tBTA_GATTC_RCB));
   1326 
   1327   cb_data.reg_oper.client_if = client_if;
   1328   cb_data.reg_oper.status = BTA_GATT_OK;
   1329 
   1330   if (p_cback) /* callback with de-register event */
   1331     (*p_cback)(BTA_GATTC_DEREG_EVT, (tBTA_GATTC*)&cb_data);
   1332 
   1333   if (bta_gattc_num_reg_app() == 0 &&
   1334       bta_gattc_cb.state == BTA_GATTC_STATE_DISABLING) {
   1335     bta_gattc_cb.state = BTA_GATTC_STATE_DISABLED;
   1336   }
   1337 }
   1338 /*******************************************************************************
   1339  *
   1340  * Function         bta_gattc_conn_cback
   1341  *
   1342  * Description      callback functions to GATT client stack.
   1343  *
   1344  * Returns          void
   1345  *
   1346  ******************************************************************************/
   1347 static void bta_gattc_conn_cback(tGATT_IF gattc_if, BD_ADDR bda,
   1348                                  uint16_t conn_id, bool connected,
   1349                                  tGATT_DISCONN_REASON reason,
   1350                                  tBT_TRANSPORT transport) {
   1351   if (reason != 0) {
   1352     APPL_TRACE_WARNING("%s() - cif=%d connected=%d conn_id=%d reason=0x%04x",
   1353                        __func__, gattc_if, connected, conn_id, reason);
   1354   }
   1355 
   1356   bt_bdaddr_t bdaddr;
   1357   bdcpy(bdaddr.address, bda);
   1358   if (connected)
   1359     btif_debug_conn_state(bdaddr, BTIF_DEBUG_CONNECTED, GATT_CONN_UNKNOWN);
   1360   else
   1361     btif_debug_conn_state(bdaddr, BTIF_DEBUG_DISCONNECTED, reason);
   1362 
   1363   tBTA_GATTC_DATA* p_buf =
   1364       (tBTA_GATTC_DATA*)osi_calloc(sizeof(tBTA_GATTC_DATA));
   1365   p_buf->int_conn.hdr.event =
   1366       connected ? BTA_GATTC_INT_CONN_EVT : BTA_GATTC_INT_DISCONN_EVT;
   1367   p_buf->int_conn.hdr.layer_specific = conn_id;
   1368   p_buf->int_conn.client_if = gattc_if;
   1369   p_buf->int_conn.role = L2CA_GetBleConnRole(bda);
   1370   p_buf->int_conn.reason = reason;
   1371   p_buf->int_conn.transport = transport;
   1372   bdcpy(p_buf->int_conn.remote_bda, bda);
   1373 
   1374   bta_sys_sendmsg(p_buf);
   1375 }
   1376 
   1377 /*******************************************************************************
   1378  *
   1379  * Function         bta_gattc_enc_cmpl_cback
   1380  *
   1381  * Description      encryption complete callback function to GATT client stack.
   1382  *
   1383  * Returns          void
   1384  *
   1385  ******************************************************************************/
   1386 static void bta_gattc_enc_cmpl_cback(tGATT_IF gattc_if, BD_ADDR bda) {
   1387   tBTA_GATTC_CLCB* p_clcb =
   1388       bta_gattc_find_clcb_by_cif(gattc_if, bda, BTA_GATT_TRANSPORT_LE);
   1389 
   1390   if (p_clcb == NULL) return;
   1391 
   1392 #if (BTA_HH_LE_INCLUDED == TRUE)
   1393   /* filter this event just for BTA HH LE GATT client,
   1394      In the future, if we want to enable encryption complete event
   1395      for all GATT clients, we can remove this code */
   1396   if (!bta_hh_le_is_hh_gatt_if(gattc_if)) {
   1397     return;
   1398   }
   1399 #endif
   1400 
   1401   APPL_TRACE_DEBUG("%s: cif = %d", __func__, gattc_if);
   1402 
   1403   tBTA_GATTC_DATA* p_buf =
   1404       (tBTA_GATTC_DATA*)osi_calloc(sizeof(tBTA_GATTC_DATA));
   1405   p_buf->enc_cmpl.hdr.event = BTA_GATTC_ENC_CMPL_EVT;
   1406   p_buf->enc_cmpl.hdr.layer_specific = p_clcb->bta_conn_id;
   1407   p_buf->enc_cmpl.client_if = gattc_if;
   1408   bdcpy(p_buf->enc_cmpl.remote_bda, bda);
   1409 
   1410   bta_sys_sendmsg(p_buf);
   1411 }
   1412 
   1413 /*******************************************************************************
   1414  *
   1415  * Function         bta_gattc_process_api_refresh
   1416  *
   1417  * Description      process refresh API to delete cache and start a new
   1418  *                  discovery if currently connected.
   1419  *
   1420  * Returns          None.
   1421  *
   1422  ******************************************************************************/
   1423 void bta_gattc_process_api_refresh(tBTA_GATTC_DATA* p_msg) {
   1424   tBTA_GATTC_SERV* p_srvc_cb =
   1425       bta_gattc_find_srvr_cache(p_msg->api_conn.remote_bda);
   1426   tBTA_GATTC_CLCB* p_clcb = &bta_gattc_cb.clcb[0];
   1427   bool found = false;
   1428   uint8_t i;
   1429 
   1430   if (p_srvc_cb != NULL) {
   1431     /* try to find a CLCB */
   1432     if (p_srvc_cb->connected && p_srvc_cb->num_clcb != 0) {
   1433       for (i = 0; i < BTA_GATTC_CLCB_MAX; i++, p_clcb++) {
   1434         if (p_clcb->in_use && p_clcb->p_srcb == p_srvc_cb) {
   1435           found = true;
   1436           break;
   1437         }
   1438       }
   1439       if (found) {
   1440         bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
   1441         return;
   1442       }
   1443     }
   1444     /* in all other cases, mark it and delete the cache */
   1445     if (p_srvc_cb->p_srvc_cache != NULL) {
   1446       list_free(p_srvc_cb->p_srvc_cache);
   1447       p_srvc_cb->p_srvc_cache = NULL;
   1448     }
   1449   }
   1450   /* used to reset cache in application */
   1451   bta_gattc_cache_reset(p_msg->api_conn.remote_bda);
   1452 }
   1453 /*******************************************************************************
   1454  *
   1455  * Function         bta_gattc_process_srvc_chg_ind
   1456  *
   1457  * Description      process service change indication.
   1458  *
   1459  * Returns          None.
   1460  *
   1461  ******************************************************************************/
   1462 bool bta_gattc_process_srvc_chg_ind(uint16_t conn_id, tBTA_GATTC_RCB* p_clrcb,
   1463                                     tBTA_GATTC_SERV* p_srcb,
   1464                                     tBTA_GATTC_CLCB* p_clcb,
   1465                                     tBTA_GATTC_NOTIFY* p_notify,
   1466                                     tGATT_VALUE* att_value) {
   1467   tBT_UUID gattp_uuid, srvc_chg_uuid;
   1468   bool processed = false;
   1469   uint8_t i;
   1470 
   1471   gattp_uuid.len = 2;
   1472   gattp_uuid.uu.uuid16 = UUID_SERVCLASS_GATT_SERVER;
   1473 
   1474   srvc_chg_uuid.len = 2;
   1475   srvc_chg_uuid.uu.uuid16 = GATT_UUID_GATT_SRV_CHGD;
   1476 
   1477   const tBTA_GATTC_CHARACTERISTIC* p_char =
   1478       bta_gattc_get_characteristic_srcb(p_srcb, p_notify->handle);
   1479   if (p_char &&
   1480       bta_gattc_uuid_compare(&p_char->service->uuid, &gattp_uuid, true) &&
   1481       bta_gattc_uuid_compare(&p_char->uuid, &srvc_chg_uuid, true)) {
   1482     if (att_value->len != BTA_GATTC_SERVICE_CHANGED_LEN) {
   1483       APPL_TRACE_ERROR(
   1484           "%s: received malformed service changed indication, skipping",
   1485           __func__);
   1486       return false;
   1487     }
   1488 
   1489     uint8_t* p = att_value->value;
   1490     uint16_t s_handle = ((uint16_t)(*(p)) + (((uint16_t)(*(p + 1))) << 8));
   1491     uint16_t e_handle = ((uint16_t)(*(p + 2)) + (((uint16_t)(*(p + 3))) << 8));
   1492 
   1493     APPL_TRACE_ERROR("%s: service changed s_handle:0x%04x e_handle:0x%04x",
   1494                      __func__, s_handle, e_handle);
   1495 
   1496     processed = true;
   1497     /* mark service handle change pending */
   1498     p_srcb->srvc_hdl_chg = true;
   1499     /* clear up all notification/indication registration */
   1500     bta_gattc_clear_notif_registration(p_srcb, conn_id, s_handle, e_handle);
   1501     /* service change indication all received, do discovery update */
   1502     if (++p_srcb->update_count == bta_gattc_num_reg_app()) {
   1503       /* not an opened connection; or connection busy */
   1504       /* search for first available clcb and start discovery */
   1505       if (p_clcb == NULL || (p_clcb && p_clcb->p_q_cmd != NULL)) {
   1506         for (i = 0; i < BTA_GATTC_CLCB_MAX; i++) {
   1507           if (bta_gattc_cb.clcb[i].in_use &&
   1508               bta_gattc_cb.clcb[i].p_srcb == p_srcb &&
   1509               bta_gattc_cb.clcb[i].p_q_cmd == NULL) {
   1510             p_clcb = &bta_gattc_cb.clcb[i];
   1511             break;
   1512           }
   1513         }
   1514       }
   1515       /* send confirmation here if this is an indication, it should always be */
   1516       GATTC_SendHandleValueConfirm(conn_id, att_value->handle);
   1517 
   1518       /* if connection available, refresh cache by doing discovery now */
   1519       if (p_clcb != NULL)
   1520         bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
   1521     }
   1522     /* notify applicationf or service change */
   1523     if (p_clrcb->p_cback != NULL) {
   1524       (*p_clrcb->p_cback)(BTA_GATTC_SRVC_CHG_EVT,
   1525                           (tBTA_GATTC*)p_srcb->server_bda);
   1526     }
   1527   }
   1528 
   1529   return processed;
   1530 }
   1531 /*******************************************************************************
   1532  *
   1533  * Function         bta_gattc_proc_other_indication
   1534  *
   1535  * Description      process all non-service change indication/notification.
   1536  *
   1537  * Returns          None.
   1538  *
   1539  ******************************************************************************/
   1540 void bta_gattc_proc_other_indication(tBTA_GATTC_CLCB* p_clcb, uint8_t op,
   1541                                      tGATT_CL_COMPLETE* p_data,
   1542                                      tBTA_GATTC_NOTIFY* p_notify) {
   1543   APPL_TRACE_DEBUG(
   1544       "bta_gattc_proc_other_indication check \
   1545                        p_data->att_value.handle=%d p_data->handle=%d",
   1546       p_data->att_value.handle, p_data->handle);
   1547   APPL_TRACE_DEBUG("is_notify", p_notify->is_notify);
   1548 
   1549   p_notify->is_notify = (op == GATTC_OPTYPE_INDICATION) ? false : true;
   1550   p_notify->len = p_data->att_value.len;
   1551   bdcpy(p_notify->bda, p_clcb->bda);
   1552   memcpy(p_notify->value, p_data->att_value.value, p_data->att_value.len);
   1553   p_notify->conn_id = p_clcb->bta_conn_id;
   1554 
   1555   if (p_clcb->p_rcb->p_cback)
   1556     (*p_clcb->p_rcb->p_cback)(BTA_GATTC_NOTIF_EVT, (tBTA_GATTC*)p_notify);
   1557 }
   1558 /*******************************************************************************
   1559  *
   1560  * Function         bta_gattc_process_indicate
   1561  *
   1562  * Description      process indication/notification.
   1563  *
   1564  * Returns          None.
   1565  *
   1566  ******************************************************************************/
   1567 void bta_gattc_process_indicate(uint16_t conn_id, tGATTC_OPTYPE op,
   1568                                 tGATT_CL_COMPLETE* p_data) {
   1569   uint16_t handle = p_data->att_value.handle;
   1570   tBTA_GATTC_CLCB* p_clcb;
   1571   tBTA_GATTC_RCB* p_clrcb = NULL;
   1572   tBTA_GATTC_SERV* p_srcb = NULL;
   1573   tBTA_GATTC_NOTIFY notify;
   1574   BD_ADDR remote_bda;
   1575   tBTA_GATTC_IF gatt_if;
   1576   tBTA_TRANSPORT transport;
   1577 
   1578   if (!GATT_GetConnectionInfor(conn_id, &gatt_if, remote_bda, &transport)) {
   1579     APPL_TRACE_ERROR("%s indication/notif for unknown app", __func__);
   1580     if (op == GATTC_OPTYPE_INDICATION)
   1581       GATTC_SendHandleValueConfirm(conn_id, handle);
   1582     return;
   1583   }
   1584 
   1585   p_clrcb = bta_gattc_cl_get_regcb(gatt_if);
   1586   if (p_clrcb == NULL) {
   1587     APPL_TRACE_ERROR("%s indication/notif for unregistered app", __func__);
   1588     if (op == GATTC_OPTYPE_INDICATION)
   1589       GATTC_SendHandleValueConfirm(conn_id, handle);
   1590     return;
   1591   }
   1592 
   1593   p_srcb = bta_gattc_find_srcb(remote_bda);
   1594   if (p_srcb == NULL) {
   1595     APPL_TRACE_ERROR("%s indication/notif for unknown device, ignore",
   1596                      __func__);
   1597     if (op == GATTC_OPTYPE_INDICATION)
   1598       GATTC_SendHandleValueConfirm(conn_id, handle);
   1599     return;
   1600   }
   1601 
   1602   p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
   1603 
   1604   notify.handle = handle;
   1605   /* if non-service change indication/notification, forward to application */
   1606   if (!bta_gattc_process_srvc_chg_ind(conn_id, p_clrcb, p_srcb, p_clcb, &notify,
   1607                                       &p_data->att_value)) {
   1608     /* if app registered for the notification */
   1609     if (bta_gattc_check_notif_registry(p_clrcb, p_srcb, &notify)) {
   1610       /* connection not open yet */
   1611       if (p_clcb == NULL) {
   1612         p_clcb = bta_gattc_clcb_alloc(gatt_if, remote_bda, transport);
   1613 
   1614         if (p_clcb == NULL) {
   1615           APPL_TRACE_ERROR("No resources");
   1616           return;
   1617         }
   1618 
   1619         p_clcb->bta_conn_id = conn_id;
   1620         p_clcb->transport = transport;
   1621 
   1622         bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, NULL);
   1623       }
   1624 
   1625       if (p_clcb != NULL)
   1626         bta_gattc_proc_other_indication(p_clcb, op, p_data, &notify);
   1627     }
   1628     /* no one intersted and need ack? */
   1629     else if (op == GATTC_OPTYPE_INDICATION) {
   1630       APPL_TRACE_DEBUG("%s no one interested, ack now", __func__);
   1631       GATTC_SendHandleValueConfirm(conn_id, handle);
   1632     }
   1633   }
   1634 }
   1635 /*******************************************************************************
   1636  *
   1637  * Function         bta_gattc_cmpl_cback
   1638  *
   1639  * Description      client operation complete callback register with BTE GATT.
   1640  *
   1641  * Returns          None.
   1642  *
   1643  ******************************************************************************/
   1644 static void bta_gattc_cmpl_cback(uint16_t conn_id, tGATTC_OPTYPE op,
   1645                                  tGATT_STATUS status,
   1646                                  tGATT_CL_COMPLETE* p_data) {
   1647   tBTA_GATTC_CLCB* p_clcb;
   1648   APPL_TRACE_DEBUG("bta_gattc_cmpl_cback: conn_id = %d op = %d status = %d",
   1649                    conn_id, op, status);
   1650 
   1651   /* notification and indication processed right away */
   1652   if (op == GATTC_OPTYPE_NOTIFICATION || op == GATTC_OPTYPE_INDICATION) {
   1653     bta_gattc_process_indicate(conn_id, op, p_data);
   1654     return;
   1655   }
   1656   /* for all other operation, not expected if w/o connection */
   1657   else {
   1658     p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
   1659     if (p_clcb == NULL) {
   1660       APPL_TRACE_ERROR(
   1661           "bta_gattc_cmpl_cback unknown conn_id =  %d, ignore data", conn_id);
   1662       return;
   1663     }
   1664   }
   1665 
   1666   /* if over BR_EDR, inform PM for mode change */
   1667   if (p_clcb->transport == BTA_TRANSPORT_BR_EDR) {
   1668     bta_sys_busy(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
   1669     bta_sys_idle(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
   1670   }
   1671 
   1672   bta_gattc_cmpl_sendmsg(conn_id, op, status, p_data);
   1673 }
   1674 
   1675 /*******************************************************************************
   1676  *
   1677  * Function         bta_gattc_cmpl_sendmsg
   1678  *
   1679  * Description      client operation complete send message
   1680  *
   1681  * Returns          None.
   1682  *
   1683  ******************************************************************************/
   1684 static void bta_gattc_cmpl_sendmsg(uint16_t conn_id, tGATTC_OPTYPE op,
   1685                                    tBTA_GATT_STATUS status,
   1686                                    tGATT_CL_COMPLETE* p_data) {
   1687   const size_t len = sizeof(tBTA_GATTC_OP_CMPL) + sizeof(tGATT_CL_COMPLETE);
   1688   tBTA_GATTC_OP_CMPL* p_buf = (tBTA_GATTC_OP_CMPL*)osi_calloc(len);
   1689 
   1690   p_buf->hdr.event = BTA_GATTC_OP_CMPL_EVT;
   1691   p_buf->hdr.layer_specific = conn_id;
   1692   p_buf->status = status;
   1693   p_buf->op_code = op;
   1694 
   1695   if (p_data != NULL) {
   1696     p_buf->p_cmpl = (tGATT_CL_COMPLETE*)(p_buf + 1);
   1697     memcpy(p_buf->p_cmpl, p_data, sizeof(tGATT_CL_COMPLETE));
   1698   }
   1699 
   1700   bta_sys_sendmsg(p_buf);
   1701 }
   1702 
   1703 /*******************************************************************************
   1704  *
   1705  * Function         bta_gattc_cong_cback
   1706  *
   1707  * Description      congestion callback for BTA GATT client.
   1708  *
   1709  * Returns          void
   1710  *
   1711  ******************************************************************************/
   1712 static void bta_gattc_cong_cback(uint16_t conn_id, bool congested) {
   1713   tBTA_GATTC_CLCB* p_clcb;
   1714   tBTA_GATTC cb_data;
   1715 
   1716   p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
   1717   if (p_clcb != NULL) {
   1718     if (p_clcb->p_rcb->p_cback) {
   1719       cb_data.congest.conn_id = conn_id;
   1720       cb_data.congest.congested = congested;
   1721 
   1722       (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CONGEST_EVT, &cb_data);
   1723     }
   1724   }
   1725 }
   1726 
   1727 static void bta_gattc_phy_update_cback(tGATT_IF gatt_if, uint16_t conn_id,
   1728                                        uint8_t tx_phy, uint8_t rx_phy,
   1729                                        uint8_t status) {
   1730   tBTA_GATTC_RCB* p_clreg = bta_gattc_cl_get_regcb(gatt_if);
   1731 
   1732   if (!p_clreg || !p_clreg->p_cback) {
   1733     APPL_TRACE_ERROR("%s: client_if=%d not found", __func__, gatt_if);
   1734     return;
   1735   }
   1736 
   1737   tBTA_GATTC cb_data;
   1738   cb_data.phy_update.conn_id = conn_id;
   1739   cb_data.phy_update.server_if = gatt_if;
   1740   cb_data.phy_update.tx_phy = tx_phy;
   1741   cb_data.phy_update.rx_phy = rx_phy;
   1742   cb_data.phy_update.status = status;
   1743   (*p_clreg->p_cback)(BTA_GATTC_PHY_UPDATE_EVT, &cb_data);
   1744 }
   1745 
   1746 static void bta_gattc_conn_update_cback(tGATT_IF gatt_if, uint16_t conn_id,
   1747                                         uint16_t interval, uint16_t latency,
   1748                                         uint16_t timeout, uint8_t status) {
   1749   tBTA_GATTC_RCB* p_clreg = bta_gattc_cl_get_regcb(gatt_if);
   1750 
   1751   if (!p_clreg || !p_clreg->p_cback) {
   1752     APPL_TRACE_ERROR("%s: client_if=%d not found", __func__, gatt_if);
   1753     return;
   1754   }
   1755 
   1756   tBTA_GATTC cb_data;
   1757   cb_data.conn_update.conn_id = conn_id;
   1758   cb_data.conn_update.interval = interval;
   1759   cb_data.conn_update.latency = latency;
   1760   cb_data.conn_update.timeout = timeout;
   1761   cb_data.conn_update.status = status;
   1762   (*p_clreg->p_cback)(BTA_GATTC_CONN_UPDATE_EVT, &cb_data);
   1763 }
   1764