15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2003-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This file contains the GATT client action functions for the state
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  machine.
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2649120dc867c7818511b5afec461dfc97d17eef58Marie Janssen#define LOG_TAG "bt_bta_gattc"
2749120dc867c7818511b5afec461dfc97d17eef58Marie Janssen
28db554581079863974af8e1289646f5deea6fc044Marie Janssen#include <string.h>
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski#include <base/callback.h>
31cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bt_common.h"
32db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "bt_target.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_gattc_int.h"
34db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "bta_sys.h"
35db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "btif/include/btif_debug_conn.h"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h"
37db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "osi/include/log.h"
38d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h"
3920c68408686ba4fd4d17e21957616e1c60a913b3Pavlin Radoslavov#include "stack/l2cap/l2c_int.h"
40db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "utl.h"
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE)
4336b686527892172cb44091d160b7d2806d49fc76Zhihai Xu#include "bta_hh_int.h"
4436b686527892172cb44091d160b7d2806d49fc76Zhihai Xu#endif
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *  Constants
488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/
49cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gattc_conn_cback(tGATT_IF gattc_if, BD_ADDR bda,
50cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 uint16_t conn_id, bool connected,
51cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 tGATT_DISCONN_REASON reason,
527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                 tBT_TRANSPORT transport);
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gattc_cmpl_cback(uint16_t conn_id, tGATTC_OPTYPE op,
55cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 tGATT_STATUS status,
56cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 tGATT_CL_COMPLETE* p_data);
57e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_gattc_cmpl_sendmsg(uint16_t conn_id, tGATTC_OPTYPE op,
587b4fdb40e81a68d254f6bf7cefbc385d978fb9d0Pavlin Radoslavov                                   tBTA_GATT_STATUS status,
59cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                   tGATT_CL_COMPLETE* p_data);
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
61cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gattc_deregister_cmpl(tBTA_GATTC_RCB* p_clreg);
627051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xustatic void bta_gattc_enc_cmpl_cback(tGATT_IF gattc_if, BD_ADDR bda);
63cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gattc_cong_cback(uint16_t conn_id, bool congested);
64eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowskistatic void bta_gattc_phy_update_cback(tGATT_IF gatt_if, uint16_t conn_id,
65eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski                                       uint8_t tx_phy, uint8_t rx_phy,
66eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski                                       uint8_t status);
67b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowskistatic void bta_gattc_conn_update_cback(tGATT_IF gatt_if, uint16_t conn_id,
68b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski                                        uint16_t interval, uint16_t latency,
69b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski                                        uint16_t timeout, uint8_t status);
70cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
71cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic tGATT_CBACK bta_gattc_cl_cback = {bta_gattc_conn_cback,
72cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                         bta_gattc_cmpl_cback,
73cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                         bta_gattc_disc_res_cback,
74cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                         bta_gattc_disc_cmpl_cback,
75cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                         NULL,
76cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                         bta_gattc_enc_cmpl_cback,
77eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski                                         bta_gattc_cong_cback,
78b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski                                         bta_gattc_phy_update_cback,
79b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski                                         bta_gattc_conn_update_cback};
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* opcode(tGATTC_OPTYPE) order has to be comply with internal event order */
82cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic uint16_t bta_gattc_opcode_to_int_evt[] = {
83cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    BTA_GATTC_API_READ_EVT, BTA_GATTC_API_WRITE_EVT, BTA_GATTC_API_EXEC_EVT,
84cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    BTA_GATTC_API_CFG_MTU_EVT};
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
86cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic const char* bta_gattc_op_code_name[] = {
87cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    "Unknown", "Discovery", "Read",         "Write",
88cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    "Exec",    "Config",    "Notification", "Indication"};
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *  Action Functions
918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
93cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_reset_discover_st(tBTA_GATTC_SERV* p_srcb,
94cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 tBTA_GATT_STATUS status);
95c10b209f62a52d2a782d4d8c97734b6c142f2567Jakub Pawlowski
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_enable
998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Enables GATTC module
1018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
106cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gattc_enable() {
107cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("bta_gattc_enable");
108cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
109cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (bta_gattc_cb.state == BTA_GATTC_STATE_DISABLED) {
110cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* initialize control block */
111cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memset(&bta_gattc_cb, 0, sizeof(tBTA_GATTC_CB));
112cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_cb.state = BTA_GATTC_STATE_ENABLED;
113cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
114cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_DEBUG("GATTC is arelady enabled");
115cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
116e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach}
117e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
118e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach/*******************************************************************************
1198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_disable
1218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Disable GATTC module by cleaning up all active connections
1238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  and deregister all application.
1248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
128cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_disable() {
129cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t i;
130e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
131cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("bta_gattc_disable");
132e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
133cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (bta_gattc_cb.state != BTA_GATTC_STATE_ENABLED) {
134cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("not enabled or disable in pogress");
135cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    return;
136cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
137e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
138cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  for (i = 0; i < BTA_GATTC_CL_MAX; i++) {
139cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (bta_gattc_cb.cl_rcb[i].in_use) {
140cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_cb.state = BTA_GATTC_STATE_DISABLING;
141cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson/* don't deregister HH GATT IF */
142cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson/* HH GATT IF will be deregistered by bta_hh_le_deregister when disable HH */
143e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE)
144cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (!bta_hh_le_is_hh_gatt_if(bta_gattc_cb.cl_rcb[i].client_if)) {
14536b686527892172cb44091d160b7d2806d49fc76Zhihai Xu#endif
146cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_gattc_deregister(&bta_gattc_cb.cl_rcb[i]);
147e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE)
148cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
14936b686527892172cb44091d160b7d2806d49fc76Zhihai Xu#endif
150e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    }
151cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
152e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
153cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* no registered apps, indicate disable completed */
154cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (bta_gattc_cb.state != BTA_GATTC_STATE_DISABLING) {
155cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memset(&bta_gattc_cb, 0, sizeof(tBTA_GATTC_CB));
156cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_cb.state = BTA_GATTC_STATE_DISABLED;
157cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
158e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach}
159e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
160e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach/*******************************************************************************
1618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_register
1638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Register a GATT client application with BTA.
1658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
169221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowskivoid bta_gattc_register(tBT_UUID* p_app_uuid, tBTA_GATTC_CBACK* p_cback,
170221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski                        BtaAppRegisterCallback cb) {
171cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATT_STATUS status = BTA_GATT_NO_RESOURCES;
172221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski  uint8_t client_if = 0;
173cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("bta_gattc_register state %d", bta_gattc_cb.state);
174cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
175cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* check if  GATTC module is already enabled . Else enable */
176cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (bta_gattc_cb.state == BTA_GATTC_STATE_DISABLED) {
177cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_enable();
178cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
179cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* todo need to check duplicate uuid */
180221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski  for (uint8_t i = 0; i < BTA_GATTC_CL_MAX; i++) {
181cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (!bta_gattc_cb.cl_rcb[i].in_use) {
182cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if ((p_app_uuid == NULL) ||
183cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          (bta_gattc_cb.cl_rcb[i].client_if =
184cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson               GATT_Register(p_app_uuid, &bta_gattc_cl_cback)) == 0) {
185cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        APPL_TRACE_ERROR("Register with GATT stack failed.");
186cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        status = BTA_GATT_ERROR;
187cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      } else {
188cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_gattc_cb.cl_rcb[i].in_use = true;
189221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski        bta_gattc_cb.cl_rcb[i].p_cback = p_cback;
190cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        memcpy(&bta_gattc_cb.cl_rcb[i].app_uuid, p_app_uuid, sizeof(tBT_UUID));
191cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
192cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        /* BTA use the same client interface as BTE GATT statck */
193221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski        client_if = bta_gattc_cb.cl_rcb[i].client_if;
194cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
195cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        tBTA_GATTC_INT_START_IF* p_buf = (tBTA_GATTC_INT_START_IF*)osi_malloc(
196cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            sizeof(tBTA_GATTC_INT_START_IF));
197cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_buf->hdr.event = BTA_GATTC_INT_START_IF_EVT;
198cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_buf->client_if = bta_gattc_cb.cl_rcb[i].client_if;
199cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
200cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_sys_sendmsg(p_buf);
201cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        status = BTA_GATT_OK;
202cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        break;
203cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
205cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
2065f63da7ae32d35c42281b999f63e544fec2b705eAndre Eisenbach
207221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski  if (!cb.is_null()) cb.Run(client_if, status);
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_start_if
2128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      start an application interface.
2148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
2168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
218cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_start_if(tBTA_GATTC_DATA* p_msg) {
219cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (bta_gattc_cl_get_regcb(p_msg->int_start_if.client_if) != NULL) {
220cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    GATT_StartIf(p_msg->int_start_if.client_if);
221cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
222cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("Unable to start app.: Unknown interface =%d",
223cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                     p_msg->int_start_if.client_if);
224cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_deregister
2298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      De-Register a GATT client application with BTA.
2318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
2338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
235cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_deregister(tBTA_GATTC_RCB* p_clreg) {
236cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t i;
237cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  BT_HDR buf;
238cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
239cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clreg != NULL) {
240cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* remove bg connection associated with this rcb */
241cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX; i++) {
242cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (bta_gattc_cb.bg_track[i].in_use) {
243cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        if (bta_gattc_cb.bg_track[i].cif_mask &
244cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            (1 << (p_clreg->client_if - 1))) {
245cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          bta_gattc_mark_bg_conn(p_clreg->client_if,
246cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 bta_gattc_cb.bg_track[i].remote_bda, false);
247cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          GATT_CancelConnect(p_clreg->client_if,
248cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                             bta_gattc_cb.bg_track[i].remote_bda, false);
249e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach        }
250cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
251cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
252cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
253cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clreg->num_clcb > 0) {
254cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* close all CLCB related to this app */
255cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      for (i = 0; i < BTA_GATTC_CLCB_MAX; i++) {
256cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        if (bta_gattc_cb.clcb[i].in_use &&
257cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            (bta_gattc_cb.clcb[i].p_rcb == p_clreg)) {
258cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          p_clreg->dereg_pending = true;
259e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
260cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          buf.event = BTA_GATTC_API_CLOSE_EVT;
261cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          buf.layer_specific = bta_gattc_cb.clcb[i].bta_conn_id;
262cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          bta_gattc_close(&bta_gattc_cb.clcb[i], (tBTA_GATTC_DATA*)&buf);
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
264cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
265cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else
266cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_deregister_cmpl(p_clreg);
267cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
2688843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    APPL_TRACE_ERROR("%s: Deregister Failed unknown client cif", __func__);
2698843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    bta_hh_cleanup_disable(BTA_HH_OK);
270cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_process_api_open
2758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      process connect API request.
2778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
2798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
281cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_process_api_open(tBTA_GATTC_DATA* p_msg) {
282cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint16_t event = ((BT_HDR*)p_msg)->event;
283cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_CLCB* p_clcb = NULL;
284cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_RCB* p_clreg = bta_gattc_cl_get_regcb(p_msg->api_conn.client_if);
285cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
286cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clreg != NULL) {
287cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_msg->api_conn.is_direct) {
288f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen      p_clcb = bta_gattc_find_alloc_clcb(p_msg->api_conn.client_if,
289f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen                                         p_msg->api_conn.remote_bda,
290f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen                                         p_msg->api_conn.transport);
291f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen      if (p_clcb != NULL) {
292cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_gattc_sm_execute(p_clcb, event, p_msg);
293cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      } else {
294cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        APPL_TRACE_ERROR("No resources to open a new connection.");
295cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
296cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_gattc_send_open_cback(
297cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            p_clreg, BTA_GATT_NO_RESOURCES, p_msg->api_conn.remote_bda,
298cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            BTA_GATT_INVALID_CONN_ID, p_msg->api_conn.transport, 0);
299cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
300cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else {
301cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_init_bk_conn(&p_msg->api_conn, p_clreg);
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
303cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
304cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("bta_gattc_process_api_open Failed, unknown client_if: %d",
305cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                     p_msg->api_conn.client_if);
306cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_process_api_open_cancel
3118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      process connect API request.
3138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
3158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
317cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_process_api_open_cancel(tBTA_GATTC_DATA* p_msg) {
318cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint16_t event = ((BT_HDR*)p_msg)->event;
319cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_CLCB* p_clcb = NULL;
320cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_RCB* p_clreg;
321cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC cb_data;
322cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
323cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_msg->api_cancel_conn.is_direct) {
324f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen    p_clcb = bta_gattc_find_clcb_by_cif(p_msg->api_cancel_conn.client_if,
325f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen                                        p_msg->api_cancel_conn.remote_bda,
326f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen                                        BTA_GATT_TRANSPORT_LE);
327f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen    if (p_clcb != NULL) {
328cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_sm_execute(p_clcb, event, p_msg);
329cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else {
330cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      APPL_TRACE_ERROR("No such connection need to be cancelled");
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
332cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_clreg = bta_gattc_cl_get_regcb(p_msg->api_cancel_conn.client_if);
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
334cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (p_clreg && p_clreg->p_cback) {
335cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        cb_data.status = BTA_GATT_ERROR;
336cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        (*p_clreg->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
337cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
339cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
340cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_cancel_bk_conn(&p_msg->api_cancel_conn);
341cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3437051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu
3447051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu/*******************************************************************************
3458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_process_enc_cmpl
3478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      process encryption complete message.
3498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
3518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
353cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_process_enc_cmpl(tBTA_GATTC_DATA* p_msg) {
354cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_RCB* p_clreg;
355cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC cb_data;
3567051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu
357cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_clreg = bta_gattc_cl_get_regcb(p_msg->enc_cmpl.client_if);
3587051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu
359cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clreg && p_clreg->p_cback) {
360cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memset(&cb_data, 0, sizeof(tBTA_GATTC));
3617051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu
362cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.enc_cmpl.client_if = p_msg->enc_cmpl.client_if;
363cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bdcpy(cb_data.enc_cmpl.remote_bda, p_msg->enc_cmpl.remote_bda);
3647051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu
365cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    (*p_clreg->p_cback)(BTA_GATTC_ENC_CMPL_CB_EVT, &cb_data);
366cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
3677051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu}
3687051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_cancel_open_error
3728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description
3748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
3768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
378cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_cancel_open_error(tBTA_GATTC_CLCB* p_clcb,
379cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 UNUSED_ATTR tBTA_GATTC_DATA* p_data) {
380cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC cb_data;
3815cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
382cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.status = BTA_GATT_ERROR;
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
384cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clcb && p_clcb->p_rcb && p_clcb->p_rcb->p_cback)
385cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_open_error
3918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description
3938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
3958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
397cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_open_error(tBTA_GATTC_CLCB* p_clcb,
398cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                          UNUSED_ATTR tBTA_GATTC_DATA* p_data) {
399cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_ERROR("Connection already opened. wrong state");
400cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
401cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_gattc_send_open_cback(p_clcb->p_rcb, BTA_GATT_OK, p_clcb->bda,
402cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            p_clcb->bta_conn_id, p_clcb->transport, 0);
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_open_fail
4078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description
4098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
4118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
413cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_open_fail(tBTA_GATTC_CLCB* p_clcb,
414cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                         UNUSED_ATTR tBTA_GATTC_DATA* p_data) {
415cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_gattc_send_open_cback(p_clcb->p_rcb, BTA_GATT_ERROR, p_clcb->bda,
416cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            p_clcb->bta_conn_id, p_clcb->transport, 0);
417cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* open failure, remove clcb */
418cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_gattc_clcb_dealloc(p_clcb);
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_open
4248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Process API connection function.
4268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
4288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
430cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_open(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
431cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_DATA gattc_data;
432cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
433cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* open/hold a connection */
434cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (!GATT_Connect(p_clcb->p_rcb->client_if, p_data->api_conn.remote_bda, true,
435ce54c403203597ba92720f52d47d57189ae37de6Jakub Pawlowski                    p_data->api_conn.transport, p_data->api_conn.opportunistic,
43696fb273d92a31204edcf43ab2594a19876d14056Jakub Pawlowski                    p_data->api_conn.initiating_phys)) {
437cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("Connection open failure");
438cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
439cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_OPEN_FAIL_EVT, p_data);
440cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
441cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* a connected remote device */
442cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (GATT_GetConnIdIfConnected(
443cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            p_clcb->p_rcb->client_if, p_data->api_conn.remote_bda,
444cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            &p_clcb->bta_conn_id, p_data->api_conn.transport)) {
445cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      gattc_data.int_conn.hdr.layer_specific = p_clcb->bta_conn_id;
446cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
447cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, &gattc_data);
448cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
449cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* else wait for the callback event */
450cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_init_bk_conn
4558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Process API Open for a background connection
4578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
4598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
461cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_init_bk_conn(tBTA_GATTC_API_OPEN* p_data,
462cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            tBTA_GATTC_RCB* p_clreg) {
463cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATT_STATUS status = BTA_GATT_NO_RESOURCES;
464cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint16_t conn_id;
465cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_CLCB* p_clcb;
466cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_DATA gattc_data;
467cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
468cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (bta_gattc_mark_bg_conn(p_data->client_if, p_data->remote_bda, true)) {
469cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* always call open to hold a connection */
470cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (!GATT_Connect(p_data->client_if, p_data->remote_bda, false,
471cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                      p_data->transport, false)) {
472cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      uint8_t* bda = (uint8_t*)p_data->remote_bda;
473cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      status = BTA_GATT_ERROR;
474cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      APPL_TRACE_ERROR(
475cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          "%s unable to connect to remote "
476cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          "bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
477cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          __func__, bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
478f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton
479cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else {
480cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      status = BTA_GATT_OK;
481cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
482cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* if is a connected remote device */
483cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (GATT_GetConnIdIfConnected(p_data->client_if, p_data->remote_bda,
484cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                    &conn_id, p_data->transport)) {
485f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen        p_clcb = bta_gattc_find_alloc_clcb(
486f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen            p_data->client_if, p_data->remote_bda, BTA_GATT_TRANSPORT_LE);
487f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen        if (p_clcb != NULL) {
488cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          gattc_data.hdr.layer_specific = p_clcb->bta_conn_id = conn_id;
489cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
490cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          /* open connection */
491cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, &gattc_data);
492cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          status = BTA_GATT_OK;
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
494cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
496cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
498cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* open failure, report OPEN_EVT */
499cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (status != BTA_GATT_OK) {
500cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_send_open_cback(p_clreg, status, p_data->remote_bda,
501cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              BTA_GATT_INVALID_CONN_ID, BTA_GATT_TRANSPORT_LE,
502cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              0);
503cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_cancel_bk_conn
5088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Process API Cancel Open for a background connection
5108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
5128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
514cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_cancel_bk_conn(tBTA_GATTC_API_CANCEL_OPEN* p_data) {
515cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_RCB* p_clreg;
516cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC cb_data;
517cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.status = BTA_GATT_ERROR;
518cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
519cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* remove the device from the bg connection mask */
520cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (bta_gattc_mark_bg_conn(p_data->client_if, p_data->remote_bda, false)) {
521cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (GATT_CancelConnect(p_data->client_if, p_data->remote_bda, false)) {
522cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.status = BTA_GATT_OK;
523cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else {
524cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      APPL_TRACE_ERROR("bta_gattc_cancel_bk_conn failed");
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
526cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
527cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_clreg = bta_gattc_cl_get_regcb(p_data->client_if);
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
529cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clreg && p_clreg->p_cback) {
530cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    (*p_clreg->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
531cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_int_cancel_open_ok
5368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description
5388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
5408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
542cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_cancel_open_ok(tBTA_GATTC_CLCB* p_clcb,
543cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              UNUSED_ATTR tBTA_GATTC_DATA* p_data) {
544cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC cb_data;
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
546cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clcb->p_rcb->p_cback) {
547cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.status = BTA_GATT_OK;
548cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
549cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
550cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
551cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_gattc_clcb_dealloc(p_clcb);
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_cancel_open
5568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description
5588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
5608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
562cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_cancel_open(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
563cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC cb_data;
564cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
565cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (GATT_CancelConnect(p_clcb->p_rcb->client_if,
566cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                         p_data->api_cancel_conn.remote_bda, true)) {
567cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CANCEL_OPEN_OK_EVT, p_data);
568cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
569cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clcb->p_rcb->p_cback) {
570cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.status = BTA_GATT_ERROR;
571cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data);
572cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
573cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_conn
5788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      receive connection callback from stack
5808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
5828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
584cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_conn(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
585cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_IF gatt_if;
586cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("bta_gattc_conn server cache state=%d",
587cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                   p_clcb->p_srcb->state);
588cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
589cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_data != NULL) {
590cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_DEBUG("bta_gattc_conn conn_id=%d", p_data->hdr.layer_specific);
591cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_clcb->bta_conn_id = p_data->int_conn.hdr.layer_specific;
592cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
593cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    GATT_GetConnectionInfor(p_data->hdr.layer_specific, &gatt_if, p_clcb->bda,
594cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            &p_clcb->transport);
595cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
596cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
597cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_clcb->p_srcb->connected = true;
598cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
599cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clcb->p_srcb->mtu == 0) p_clcb->p_srcb->mtu = GATT_DEF_BLE_MTU_SIZE;
600cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
601cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* start database cache if needed */
602cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clcb->p_srcb->p_srvc_cache == NULL ||
603cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_clcb->p_srcb->state != BTA_GATTC_SERV_IDLE) {
604cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE) {
605cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_clcb->p_srcb->state = BTA_GATTC_SERV_LOAD;
606cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (bta_gattc_cache_load(p_clcb)) {
607cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_clcb->p_srcb->state = BTA_GATTC_SERV_IDLE;
608cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_gattc_reset_discover_st(p_clcb->p_srcb, BTA_GATT_OK);
609cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      } else {
610cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_clcb->p_srcb->state = BTA_GATTC_SERV_DISC;
611cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        /* cache load failure, start discovery */
612cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_gattc_start_discover(p_clcb, NULL);
613cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
614cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else /* cache is building */
615cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_clcb->state = BTA_GATTC_DISCOVER_ST;
616cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
617cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
618cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  else {
619cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* a pending service handle change indication */
620cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clcb->p_srcb->srvc_hdl_chg) {
621cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_clcb->p_srcb->srvc_hdl_chg = false;
622cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* start discovery */
623cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
624cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
625cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
626cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
627cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clcb->p_rcb) {
628cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* there is no RM for GATT */
629cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clcb->transport == BTA_TRANSPORT_BR_EDR)
630cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_sys_conn_open(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
632cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_send_open_cback(p_clcb->p_rcb, BTA_GATT_OK, p_clcb->bda,
633cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              p_clcb->bta_conn_id, p_clcb->transport,
634cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              p_clcb->p_srcb->mtu);
635cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
636cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson}
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_close_fail
6408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      close a  connection.
6428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
6448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
646cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_close_fail(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
647cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC cb_data;
648cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
649cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clcb->p_rcb->p_cback) {
650cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memset(&cb_data, 0, sizeof(tBTA_GATTC));
651cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.close.client_if = p_clcb->p_rcb->client_if;
652cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.close.conn_id = p_data->hdr.layer_specific;
653cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bdcpy(cb_data.close.remote_bda, p_clcb->bda);
654cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.close.status = BTA_GATT_ERROR;
655cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.close.reason = BTA_GATT_CONN_NONE;
656cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
657cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CLOSE_EVT, &cb_data);
658cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_api_close
6638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      close a GATTC connection.
6658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
6678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
669cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_close(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
670cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_CBACK* p_cback = p_clcb->p_rcb->p_cback;
671cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_RCB* p_clreg = p_clcb->p_rcb;
672cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC cb_data;
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
674cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("bta_gattc_close conn_id=%d", p_clcb->bta_conn_id);
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
676cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.close.client_if = p_clcb->p_rcb->client_if;
677cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.close.conn_id = p_clcb->bta_conn_id;
678cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.close.reason = p_clcb->reason;
679cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.close.status = p_clcb->status;
680cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bdcpy(cb_data.close.remote_bda, p_clcb->bda);
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
682cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clcb->transport == BTA_TRANSPORT_BR_EDR)
683cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_sys_conn_close(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
684781b5adee20e222ef87b56b72bfcd3f64013e4a0Andre Eisenbach
685cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_gattc_clcb_dealloc(p_clcb);
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
687cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_data->hdr.event == BTA_GATTC_API_CLOSE_EVT) {
688cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.close.status = GATT_Disconnect(p_data->hdr.layer_specific);
689cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else if (p_data->hdr.event == BTA_GATTC_INT_DISCONN_EVT) {
690cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.close.status = p_data->int_conn.reason;
691cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.close.reason = p_data->int_conn.reason;
692cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
693e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
694cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_cback) (*p_cback)(BTA_GATTC_CLOSE_EVT, (tBTA_GATTC*)&cb_data);
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
696cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clreg->num_clcb == 0 && p_clreg->dereg_pending) {
697cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_deregister_cmpl(p_clreg);
698cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_reset_discover_st
7038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      when a SRCB finished discovery, tell all related clcb.
7058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
7078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
709cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_reset_discover_st(tBTA_GATTC_SERV* p_srcb,
710cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 tBTA_GATT_STATUS status) {
711cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t i;
712cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
713cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  for (i = 0; i < BTA_GATTC_CLCB_MAX; i++) {
714cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (bta_gattc_cb.clcb[i].p_srcb == p_srcb) {
715cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_cb.clcb[i].status = status;
716cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_sm_execute(&bta_gattc_cb.clcb[i], BTA_GATTC_DISCOVER_CMPL_EVT,
717cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                           NULL);
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
719cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_disc_close
7248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      close a GATTC connection while in discovery state.
7268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
7288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
730cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_disc_close(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
731cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("%s: Discovery cancel conn_id=%d", __func__,
732cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                   p_clcb->bta_conn_id);
733cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
734cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clcb->disc_active)
735cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_reset_discover_st(p_clcb->p_srcb, BTA_GATT_ERROR);
736cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  else
737cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_clcb->state = BTA_GATTC_CONN_ST;
738cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
739cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  // This function only gets called as the result of a BTA_GATTC_API_CLOSE_EVT
740cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  // while in the BTA_GATTC_DISCOVER_ST state. Once the state changes, the
741cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  // connection itself still needs to be closed to resolve the original event.
742cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clcb->state == BTA_GATTC_CONN_ST) {
743cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_DEBUG(
744cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        "State is back to BTA_GATTC_CONN_ST. "
745cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        "Trigger connection close");
746cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_close(p_clcb, p_data);
747cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
748ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
749ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
7508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_set_discover_st
7528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      when a SRCB start discovery, tell all related clcb and set
7548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  the state.
7558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
7578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
759cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_set_discover_st(tBTA_GATTC_SERV* p_srcb) {
760cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t i;
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
762cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  L2CA_EnableUpdateBleConnParams(p_srcb->server_bda, false);
763cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  for (i = 0; i < BTA_GATTC_CLCB_MAX; i++) {
764cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (bta_gattc_cb.clcb[i].p_srcb == p_srcb) {
765cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_cb.clcb[i].status = BTA_GATT_OK;
766cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_cb.clcb[i].state = BTA_GATTC_DISCOVER_ST;
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
768cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_restart_discover
7738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      process service change in discovery state, mark up the auto
775cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *                  update flag and set status to be discovery cancel for
7761baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  current discovery.
7778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
7798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
781cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_restart_discover(tBTA_GATTC_CLCB* p_clcb,
782cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                UNUSED_ATTR tBTA_GATTC_DATA* p_data) {
783cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_clcb->status = BTA_GATT_CANCEL;
784cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_clcb->auto_update = BTA_GATTC_DISC_WAITING;
785ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
7869426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach
7879426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach/*******************************************************************************
7888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_cfg_mtu
7908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Configure MTU size on the GATT connection.
7928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
7948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
796cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_cfg_mtu(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
797cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATT_STATUS status;
798cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
799cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (bta_gattc_enqueue(p_clcb, p_data)) {
800cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    status = GATTC_ConfigureMTU(p_clcb->bta_conn_id, p_data->api_mtu.mtu);
801cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
802cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* if failed, return callback here */
803cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (status != GATT_SUCCESS && status != GATT_CMD_STARTED) {
804cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* Dequeue the data, if it was enqueued */
805cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (p_clcb->p_q_cmd == p_data) p_clcb->p_q_cmd = NULL;
806cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
807cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_cmpl_sendmsg(p_clcb->bta_conn_id, GATTC_OPTYPE_CONFIG, status,
808cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                             NULL);
8099426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach    }
810cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
8119426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach}
812ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
8138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
8148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_start_discover
8158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
8168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Start a discovery on server.
8178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
8188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
8198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
8208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
821cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_start_discover(tBTA_GATTC_CLCB* p_clcb,
822cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              UNUSED_ATTR tBTA_GATTC_DATA* p_data) {
823cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG(
824cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      "bta_gattc_start_discover conn_id=%d p_clcb->p_srcb->state = %d ",
825cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_clcb->bta_conn_id, p_clcb->p_srcb->state);
826cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
827cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (((p_clcb->p_q_cmd == NULL ||
828cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_clcb->auto_update == BTA_GATTC_REQ_WAITING) &&
829cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson       p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE) ||
830cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_clcb->p_srcb->state == BTA_GATTC_SERV_DISC)
831cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* no pending operation, start discovery right away */
832cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  {
833cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_clcb->auto_update = BTA_GATTC_NO_SCHEDULE;
834cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
835cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clcb->p_srcb != NULL) {
836cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* clear the service change mask */
837cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_clcb->p_srcb->srvc_hdl_chg = false;
838cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_clcb->p_srcb->update_count = 0;
839cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_clcb->p_srcb->state = BTA_GATTC_SERV_DISC_ACT;
840cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
841cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (p_clcb->transport == BTA_TRANSPORT_LE)
842cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        L2CA_EnableUpdateBleConnParams(p_clcb->p_srcb->server_bda, false);
843cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
844cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* set all srcb related clcb into discovery ST */
845cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_set_discover_st(p_clcb->p_srcb);
846cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
847f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen      p_clcb->status = bta_gattc_init_cache(p_clcb->p_srcb);
848f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen      if (p_clcb->status == BTA_GATT_OK) {
849cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_clcb->status = bta_gattc_discover_pri_service(
850cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            p_clcb->bta_conn_id, p_clcb->p_srcb, GATT_DISC_SRVC_ALL);
851cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
852cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (p_clcb->status != BTA_GATT_OK) {
853cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        APPL_TRACE_ERROR("discovery on server failed");
854cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_gattc_reset_discover_st(p_clcb->p_srcb, p_clcb->status);
855cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      } else
856cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_clcb->disc_active = true;
857cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else {
858cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      APPL_TRACE_ERROR("unknown device, can not start discovery");
859ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
860cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
861cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* pending operation, wait until it finishes */
862cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  else {
863cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_clcb->auto_update = BTA_GATTC_DISC_WAITING;
864ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
865cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE)
866cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_clcb->state = BTA_GATTC_CONN_ST; /* set clcb state */
867cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
8718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_disc_cmpl
8728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
8738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      discovery on server is finished
8748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
8758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
8768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
8778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
878cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_disc_cmpl(tBTA_GATTC_CLCB* p_clcb,
879cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                         UNUSED_ATTR tBTA_GATTC_DATA* p_data) {
880cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_DATA* p_q_cmd = p_clcb->p_q_cmd;
8815cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
882cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("bta_gattc_disc_cmpl conn_id=%d", p_clcb->bta_conn_id);
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
884cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clcb->transport == BTA_TRANSPORT_LE)
885cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    L2CA_EnableUpdateBleConnParams(p_clcb->p_srcb->server_bda, true);
886cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_clcb->p_srcb->state = BTA_GATTC_SERV_IDLE;
887cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_clcb->disc_active = false;
888ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
889cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clcb->status != GATT_SUCCESS) {
890cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* clean up cache */
891cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clcb->p_srcb && p_clcb->p_srcb->p_srvc_cache) {
892cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      list_free(p_clcb->p_srcb->p_srvc_cache);
893cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_clcb->p_srcb->p_srvc_cache = NULL;
894b83028d1422a097e57b829155d42882414c7a1eeSubramanian Srinivasan    }
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
896cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* used to reset cache in application */
897cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_cache_reset(p_clcb->p_srcb->server_bda);
898cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
899cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clcb->p_srcb && p_clcb->p_srcb->p_srvc_list) {
900cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* release pending attribute list buffer */
901cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    osi_free_and_reset((void**)&p_clcb->p_srcb->p_srvc_list);
902cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
903cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
904cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING) {
905cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* start discovery again */
906cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_clcb->auto_update = BTA_GATTC_REQ_WAITING;
907cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
908cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
909cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* get any queued command to proceed */
910cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  else if (p_q_cmd != NULL) {
911cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_clcb->p_q_cmd = NULL;
912cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* execute pending operation of link block still present */
913cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (l2cu_find_lcb_by_bd_addr(p_clcb->p_srcb->server_bda, BT_TRANSPORT_LE) !=
914cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        NULL) {
915cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_sm_execute(p_clcb, p_q_cmd->hdr.event, p_q_cmd);
916cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
917cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* if the command executed requeued the cmd, we don't
918cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson     * want to free the underlying buffer that's being
919cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson     * referenced by p_clcb->p_q_cmd
920cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson     */
921cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_q_cmd != p_clcb->p_q_cmd) osi_free_and_reset((void**)&p_q_cmd);
922cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
9268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_read
9278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
9288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Read an attribute
9298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
9308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
9318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
9328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
933cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_read(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
934cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (!bta_gattc_enqueue(p_clcb, p_data)) return;
93514a73093ba78d237959f625fd27bd4edd9f0ff48Jakub Pawlowski
93676f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski  tBTA_GATT_STATUS status;
93776f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski  if (p_data->api_read.handle != 0) {
93876f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski    tGATT_READ_PARAM read_param;
93976f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski    memset(&read_param, 0, sizeof(tGATT_READ_PARAM));
94076f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski    read_param.by_handle.handle = p_data->api_read.handle;
94176f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski    read_param.by_handle.auth_req = p_data->api_read.auth_req;
94276f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski    status = GATTC_Read(p_clcb->bta_conn_id, GATT_READ_BY_HANDLE, &read_param);
94376f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski  } else {
94476f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski    tGATT_READ_PARAM read_param;
94576f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski    memset(&read_param, 0, sizeof(tGATT_READ_BY_TYPE));
94676f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski
94776f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski    read_param.char_type.s_handle = p_data->api_read.s_handle;
94876f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski    read_param.char_type.e_handle = p_data->api_read.e_handle;
94976f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski    read_param.char_type.uuid = p_data->api_read.uuid;
95076f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski    read_param.char_type.auth_req = p_data->api_read.auth_req;
95176f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski    status = GATTC_Read(p_clcb->bta_conn_id, GATT_READ_BY_TYPE, &read_param);
95276f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski  }
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
954cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* read fail */
955cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (status != BTA_GATT_OK) {
956cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* Dequeue the data, if it was enqueued */
957cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clcb->p_q_cmd == p_data) p_clcb->p_q_cmd = NULL;
95814a73093ba78d237959f625fd27bd4edd9f0ff48Jakub Pawlowski
959cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_cmpl_sendmsg(p_clcb->bta_conn_id, GATTC_OPTYPE_READ, status,
960cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                           NULL);
961cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
9658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_read_multi
9668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
9678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      read multiple
9688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
9698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
970ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
971cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_read_multi(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
972cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATT_STATUS status = BTA_GATT_OK;
973cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tGATT_READ_PARAM read_param;
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
975cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (bta_gattc_enqueue(p_clcb, p_data)) {
976cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memset(&read_param, 0, sizeof(tGATT_READ_PARAM));
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
978cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (status == BTA_GATT_OK) {
979cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      read_param.read_multiple.num_handles = p_data->api_read_multi.num_attr;
980cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      read_param.read_multiple.auth_req = p_data->api_read_multi.auth_req;
981cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      memcpy(&read_param.read_multiple.handles, p_data->api_read_multi.handles,
982cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson             sizeof(uint16_t) * p_data->api_read_multi.num_attr);
983cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
984cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      status = GATTC_Read(p_clcb->bta_conn_id, GATT_READ_MULTIPLE, &read_param);
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
986cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
987cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* read fail */
988cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (status != BTA_GATT_OK) {
989cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* Dequeue the data, if it was enqueued */
990cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (p_clcb->p_q_cmd == p_data) p_clcb->p_q_cmd = NULL;
991cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
992cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_cmpl_sendmsg(p_clcb->bta_conn_id, GATTC_OPTYPE_READ, status,
993cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                             NULL);
994cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
995cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
9998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_write
10008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
10018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Write an attribute
10028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
10038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
10048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
10058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1006cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_write(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
1007cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (!bta_gattc_enqueue(p_clcb, p_data)) return;
100814a73093ba78d237959f625fd27bd4edd9f0ff48Jakub Pawlowski
1009cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATT_STATUS status = BTA_GATT_OK;
1010cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tGATT_VALUE attr;
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1012cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  attr.conn_id = p_clcb->bta_conn_id;
1013cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  attr.handle = p_data->api_write.handle;
1014cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  attr.offset = p_data->api_write.offset;
1015cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  attr.len = p_data->api_write.len;
1016cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  attr.auth_req = p_data->api_write.auth_req;
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1018cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_data->api_write.p_value)
1019cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memcpy(attr.value, p_data->api_write.p_value, p_data->api_write.len);
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1021cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  status =
1022cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      GATTC_Write(p_clcb->bta_conn_id, p_data->api_write.write_type, &attr);
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1024cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* write fail */
1025cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (status != BTA_GATT_OK) {
1026cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* Dequeue the data, if it was enqueued */
1027cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clcb->p_q_cmd == p_data) p_clcb->p_q_cmd = NULL;
102814a73093ba78d237959f625fd27bd4edd9f0ff48Jakub Pawlowski
1029cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_cmpl_sendmsg(p_clcb->bta_conn_id, GATTC_OPTYPE_WRITE, status,
1030cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                           NULL);
1031cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
10358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_execute
10368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
10378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      send execute write
10388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
10398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
1040ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1041cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_execute(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
1042cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATT_STATUS status;
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1044cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (bta_gattc_enqueue(p_clcb, p_data)) {
1045cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    status =
1046cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        GATTC_ExecuteWrite(p_clcb->bta_conn_id, p_data->api_exec.is_execute);
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1048cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (status != BTA_GATT_OK) {
1049cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* Dequeue the data, if it was enqueued */
1050cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (p_clcb->p_q_cmd == p_data) p_clcb->p_q_cmd = NULL;
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1052cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_cmpl_sendmsg(p_clcb->bta_conn_id, GATTC_OPTYPE_EXE_WRITE,
1053cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                             status, NULL);
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1055cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
10598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_confirm
10608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
10618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      send handle value confirmation
10628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
10638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
10648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
10658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1066cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_confirm(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
1067cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint16_t handle = p_data->api_confirm.handle;
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1069cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (GATTC_SendHandleValueConfirm(p_data->api_confirm.hdr.layer_specific,
1070cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                   handle) != GATT_SUCCESS) {
1071cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("bta_gattc_confirm to handle [0x%04x] failed", handle);
1072cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
1073cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* if over BR_EDR, inform PM for mode change */
1074cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clcb->transport == BTA_TRANSPORT_BR_EDR) {
1075cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_sys_busy(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
1076cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_sys_idle(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1078cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
10828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_read_cmpl
10838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
10848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      read complete
10858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
10868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
10878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
10888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1089cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_read_cmpl(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_OP_CMPL* p_data) {
1090cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  GATT_READ_OP_CB cb = p_clcb->p_q_cmd->api_read.read_cb;
1091cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  void* my_cb_data = p_clcb->p_q_cmd->api_read.read_cb_data;
1092cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
109376f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski  // if it was read by handle, return the handle requested, if read by UUID, use
109476f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski  // handle returned from remote
1095cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint16_t handle = p_clcb->p_q_cmd->api_read.handle;
109676f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski  if (handle == 0) handle = p_data->p_cmpl->att_value.handle;
109776f2c8678e0f72ddf26b57e3db31c11aa9d88994Jakub Pawlowski
1098cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  osi_free_and_reset((void**)&p_clcb->p_q_cmd);
1099cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1100cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (cb) {
1101cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb(p_clcb->bta_conn_id, p_data->status, handle,
1102cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson       p_data->p_cmpl->att_value.len, p_data->p_cmpl->att_value.value,
1103cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson       my_cb_data);
1104cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_write_cmpl
11098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      write complete
11118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
11138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1115cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_write_cmpl(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_OP_CMPL* p_data) {
1116cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  GATT_WRITE_OP_CB cb = p_clcb->p_q_cmd->api_write.write_cb;
1117cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  void* my_cb_data = p_clcb->p_q_cmd->api_write.write_cb_data;
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1119cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  osi_free_and_reset((void**)&p_clcb->p_q_cmd);
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1121cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (cb) {
1122cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb(p_clcb->bta_conn_id, p_data->status, p_data->p_cmpl->att_value.handle,
1123cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson       my_cb_data);
1124cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_exec_cmpl
11298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      execute write complete
11318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
11338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1135cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_exec_cmpl(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_OP_CMPL* p_data) {
1136cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC cb_data;
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1138cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  osi_free_and_reset((void**)&p_clcb->p_q_cmd);
1139cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_clcb->status = BTA_GATT_OK;
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1141cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* execute complete, callback */
1142cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.exec_cmpl.conn_id = p_clcb->bta_conn_id;
1143cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.exec_cmpl.status = p_data->status;
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1145cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  (*p_clcb->p_rcb->p_cback)(BTA_GATTC_EXEC_EVT, &cb_data);
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11479426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach
11489426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach/*******************************************************************************
11498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_cfg_mtu_cmpl
11518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      configure MTU operation complete
11538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
11558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1157cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_cfg_mtu_cmpl(tBTA_GATTC_CLCB* p_clcb,
1158cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            tBTA_GATTC_OP_CMPL* p_data) {
1159cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC cb_data;
11609426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach
1161cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  osi_free_and_reset((void**)&p_clcb->p_q_cmd);
11629426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach
1163cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_data->p_cmpl && p_data->status == BTA_GATT_OK)
1164cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_clcb->p_srcb->mtu = p_data->p_cmpl->mtu;
11659426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach
1166cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* configure MTU complete, callback */
1167cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_clcb->status = p_data->status;
1168cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.cfg_mtu.conn_id = p_clcb->bta_conn_id;
1169cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.cfg_mtu.status = p_data->status;
1170cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.cfg_mtu.mtu = p_clcb->p_srcb->mtu;
11719426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach
1172cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CFG_MTU_EVT, &cb_data);
11739426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach}
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_op_cmpl
11778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      operation completed.
11798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
11818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1183cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_op_cmpl(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
1184cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t op = (uint8_t)p_data->op_cmpl.op_code;
1185cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t mapped_op = 0;
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1187cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("bta_gattc_op_cmpl op = %d", op);
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1189cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (op == GATTC_OPTYPE_INDICATION || op == GATTC_OPTYPE_NOTIFICATION) {
1190cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("unexpected operation, ignored");
1191cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else if (op >= GATTC_OPTYPE_READ) {
1192cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clcb->p_q_cmd == NULL) {
1193cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      APPL_TRACE_ERROR("No pending command");
1194cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      return;
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1196cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clcb->p_q_cmd->hdr.event !=
1197cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_gattc_opcode_to_int_evt[op - GATTC_OPTYPE_READ]) {
1198cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      mapped_op = p_clcb->p_q_cmd->hdr.event - BTA_GATTC_API_READ_EVT +
1199cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                  GATTC_OPTYPE_READ;
1200cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (mapped_op > GATTC_OPTYPE_INDICATION) mapped_op = 0;
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1202cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      APPL_TRACE_ERROR(
1203cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          "expect op:(%s :0x%04x), receive unexpected operation (%s).",
1204cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          bta_gattc_op_code_name[mapped_op], p_clcb->p_q_cmd->hdr.event,
1205cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          bta_gattc_op_code_name[op]);
1206cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      return;
1207cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12099e5f76c5dd948d545b4355b15fc61a3f14f5a4abJacky Cheung    /* Except for MTU configuration, discard responses if service change
12109e5f76c5dd948d545b4355b15fc61a3f14f5a4abJacky Cheung     * indication is received before operation completed */
1211cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING &&
12129e5f76c5dd948d545b4355b15fc61a3f14f5a4abJacky Cheung        p_clcb->p_srcb->srvc_hdl_chg && op != GATTC_OPTYPE_CONFIG) {
1213cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      APPL_TRACE_DEBUG(
1214cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          "Discard all responses when service change indication is received.");
1215cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_data->op_cmpl.status = GATT_ERROR;
1216cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
121732429188798b1f34fcf2cc609fd70ed85f20264bAndre Eisenbach
1218cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* service handle change void the response, discard it */
1219cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (op == GATTC_OPTYPE_READ)
1220cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_read_cmpl(p_clcb, &p_data->op_cmpl);
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1222cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    else if (op == GATTC_OPTYPE_WRITE)
1223cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_write_cmpl(p_clcb, &p_data->op_cmpl);
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1225cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    else if (op == GATTC_OPTYPE_EXE_WRITE)
1226cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_exec_cmpl(p_clcb, &p_data->op_cmpl);
12279426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach
1228cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    else if (op == GATTC_OPTYPE_CONFIG)
1229cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_cfg_mtu_cmpl(p_clcb, &p_data->op_cmpl);
123032429188798b1f34fcf2cc609fd70ed85f20264bAndre Eisenbach
1231cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING) {
1232cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_clcb->auto_update = BTA_GATTC_REQ_WAITING;
1233cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1235cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
12398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_op_cmpl
12408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
12418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      operation completed.
12428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
12438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
12448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
12458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1246cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_ignore_op_cmpl(UNUSED_ATTR tBTA_GATTC_CLCB* p_clcb,
1247cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              tBTA_GATTC_DATA* p_data) {
1248cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* receive op complete when discovery is started, ignore the response,
1249cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      and wait for discovery finish and resent */
1250cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("bta_gattc_ignore_op_cmpl op = %d",
1251cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                   p_data->hdr.layer_specific);
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
12558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_search
12568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
12578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      start a search in the local server cache
12588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
12598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
12608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
12618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1262cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_search(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
1263cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATT_STATUS status = GATT_INTERNAL_ERROR;
1264cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC cb_data;
1265cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("bta_gattc_search conn_id=%d", p_clcb->bta_conn_id);
1266cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clcb->p_srcb && p_clcb->p_srcb->p_srvc_cache) {
1267cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    status = BTA_GATT_OK;
1268cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* search the local cache of a server device */
1269cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_search_service(p_clcb, p_data->api_search.p_srvc_uuid);
1270cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
1271cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.search_cmpl.status = status;
1272cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.search_cmpl.conn_id = p_clcb->bta_conn_id;
1273cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1274cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* end of search or no server cache available */
1275cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  (*p_clcb->p_rcb->p_cback)(BTA_GATTC_SEARCH_CMPL_EVT, &cb_data);
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
12798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_q_cmd
12808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1281cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      enqueue a command into control block, usually because
12821baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  discovery operation is busy.
12838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
12848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
12858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
12868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1287cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_q_cmd(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) {
1288cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_gattc_enqueue(p_clcb, p_data);
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
12938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_fail
12948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
12958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      report API call failure back to apps
12968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
12978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
12988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
12998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1300cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_fail(tBTA_GATTC_CLCB* p_clcb,
1301cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                    UNUSED_ATTR tBTA_GATTC_DATA* p_data) {
1302cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clcb->status == BTA_GATT_OK) {
1303cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("operation not supported at current state [%d]",
1304cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                     p_clcb->state);
1305cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1307e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
1308e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach/*******************************************************************************
13098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
13108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_deregister_cmpl
13118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
13128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      De-Register a GATT client application with BTA completed.
13138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
13148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
13158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
13168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1317cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gattc_deregister_cmpl(tBTA_GATTC_RCB* p_clreg) {
1318cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_IF client_if = p_clreg->client_if;
1319cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC cb_data;
1320cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_CBACK* p_cback = p_clreg->p_cback;
1321e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
1322cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  memset(&cb_data, 0, sizeof(tBTA_GATTC));
1323e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
1324cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  GATT_Deregister(p_clreg->client_if);
1325cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  memset(p_clreg, 0, sizeof(tBTA_GATTC_RCB));
1326e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
1327cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.reg_oper.client_if = client_if;
1328cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.reg_oper.status = BTA_GATT_OK;
1329e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
1330cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_cback) /* callback with de-register event */
1331cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    (*p_cback)(BTA_GATTC_DEREG_EVT, (tBTA_GATTC*)&cb_data);
1332e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
1333cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (bta_gattc_num_reg_app() == 0 &&
1334cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_cb.state == BTA_GATTC_STATE_DISABLING) {
1335cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_cb.state = BTA_GATTC_STATE_DISABLED;
1336cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
1337e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach}
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
13408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_conn_cback
13418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
13428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      callback functions to GATT client stack.
13438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
13448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
13458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
13468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1347cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gattc_conn_cback(tGATT_IF gattc_if, BD_ADDR bda,
1348cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 uint16_t conn_id, bool connected,
1349cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 tGATT_DISCONN_REASON reason,
1350cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 tBT_TRANSPORT transport) {
1351cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (reason != 0) {
1352cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_WARNING("%s() - cif=%d connected=%d conn_id=%d reason=0x%04x",
1353cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                       __func__, gattc_if, connected, conn_id, reason);
1354cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
1355cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1356cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bt_bdaddr_t bdaddr;
1357cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bdcpy(bdaddr.address, bda);
1358cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (connected)
1359cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    btif_debug_conn_state(bdaddr, BTIF_DEBUG_CONNECTED, GATT_CONN_UNKNOWN);
1360cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  else
1361cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    btif_debug_conn_state(bdaddr, BTIF_DEBUG_DISCONNECTED, reason);
1362cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1363cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_DATA* p_buf =
1364cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_DATA*)osi_calloc(sizeof(tBTA_GATTC_DATA));
1365cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->int_conn.hdr.event =
1366cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      connected ? BTA_GATTC_INT_CONN_EVT : BTA_GATTC_INT_DISCONN_EVT;
1367cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->int_conn.hdr.layer_specific = conn_id;
1368cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->int_conn.client_if = gattc_if;
1369cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->int_conn.role = L2CA_GetBleConnRole(bda);
1370cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->int_conn.reason = reason;
1371cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->int_conn.transport = transport;
1372cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bdcpy(p_buf->int_conn.remote_bda, bda);
1373cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1374cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
137517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach}
13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
13798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_enc_cmpl_cback
13808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
13818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      encryption complete callback function to GATT client stack.
13828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
13838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
13848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
13858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1386cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gattc_enc_cmpl_cback(tGATT_IF gattc_if, BD_ADDR bda) {
1387cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_CLCB* p_clcb =
1388cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_find_clcb_by_cif(gattc_if, bda, BTA_GATT_TRANSPORT_LE);
13897051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu
1390cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clcb == NULL) return;
13917051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu
1392e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE)
1393cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* filter this event just for BTA HH LE GATT client,
1394cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson     In the future, if we want to enable encryption complete event
1395cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson     for all GATT clients, we can remove this code */
1396cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (!bta_hh_le_is_hh_gatt_if(gattc_if)) {
1397cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    return;
1398cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
13997051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu#endif
14007051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu
1401cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("%s: cif = %d", __func__, gattc_if);
14027051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu
1403cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_DATA* p_buf =
1404cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_GATTC_DATA*)osi_calloc(sizeof(tBTA_GATTC_DATA));
1405cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->enc_cmpl.hdr.event = BTA_GATTC_ENC_CMPL_EVT;
1406cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->enc_cmpl.hdr.layer_specific = p_clcb->bta_conn_id;
1407cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->enc_cmpl.client_if = gattc_if;
1408cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bdcpy(p_buf->enc_cmpl.remote_bda, bda);
14097051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu
1410cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
14117051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu}
14127051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu
14137051db3a486aae771d9b5a81c3546790f86ede34Zhihai Xu/*******************************************************************************
14148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
14158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_process_api_refresh
14168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1417cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description      process refresh API to delete cache and start a new
14181baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                  discovery if currently connected.
14198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
14208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
14218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
14228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1423cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_process_api_refresh(tBTA_GATTC_DATA* p_msg) {
1424cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_SERV* p_srvc_cb =
1425cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_find_srvr_cache(p_msg->api_conn.remote_bda);
1426cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_CLCB* p_clcb = &bta_gattc_cb.clcb[0];
1427cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bool found = false;
1428cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t i;
1429cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1430cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_srvc_cb != NULL) {
1431cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* try to find a CLCB */
1432cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_srvc_cb->connected && p_srvc_cb->num_clcb != 0) {
1433cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      for (i = 0; i < BTA_GATTC_CLCB_MAX; i++, p_clcb++) {
1434cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        if (p_clcb->in_use && p_clcb->p_srcb == p_srvc_cb) {
1435cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          found = true;
1436cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
1437ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
1438cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
1439cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (found) {
1440cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
1441cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        return;
1442cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
1443ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
1444cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* in all other cases, mark it and delete the cache */
1445cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_srvc_cb->p_srvc_cache != NULL) {
1446cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      list_free(p_srvc_cb->p_srvc_cache);
1447cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_srvc_cb->p_srvc_cache = NULL;
1448cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
1449cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
1450cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* used to reset cache in application */
1451cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_gattc_cache_reset(p_msg->api_conn.remote_bda);
1452ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
1453ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
14548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
14558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_process_srvc_chg_ind
14568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
14578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      process service change indication.
14588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
14598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
14608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
14618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1462cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonbool bta_gattc_process_srvc_chg_ind(uint16_t conn_id, tBTA_GATTC_RCB* p_clrcb,
1463cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                    tBTA_GATTC_SERV* p_srcb,
1464cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                    tBTA_GATTC_CLCB* p_clcb,
1465cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                    tBTA_GATTC_NOTIFY* p_notify,
1466cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                    tGATT_VALUE* att_value) {
1467cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBT_UUID gattp_uuid, srvc_chg_uuid;
1468cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bool processed = false;
1469cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t i;
1470cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1471cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  gattp_uuid.len = 2;
1472cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  gattp_uuid.uu.uuid16 = UUID_SERVCLASS_GATT_SERVER;
1473cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1474cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  srvc_chg_uuid.len = 2;
1475cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  srvc_chg_uuid.uu.uuid16 = GATT_UUID_GATT_SRV_CHGD;
1476cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1477cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  const tBTA_GATTC_CHARACTERISTIC* p_char =
1478cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_get_characteristic_srcb(p_srcb, p_notify->handle);
1479cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_char &&
1480cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_uuid_compare(&p_char->service->uuid, &gattp_uuid, true) &&
1481cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gattc_uuid_compare(&p_char->uuid, &srvc_chg_uuid, true)) {
1482cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (att_value->len != BTA_GATTC_SERVICE_CHANGED_LEN) {
1483cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      APPL_TRACE_ERROR(
1484cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          "%s: received malformed service changed indication, skipping",
1485cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          __func__);
1486cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      return false;
1487cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
1488cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1489cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    uint8_t* p = att_value->value;
1490cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    uint16_t s_handle = ((uint16_t)(*(p)) + (((uint16_t)(*(p + 1))) << 8));
1491cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    uint16_t e_handle = ((uint16_t)(*(p + 2)) + (((uint16_t)(*(p + 3))) << 8));
1492cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1493cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("%s: service changed s_handle:0x%04x e_handle:0x%04x",
1494cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                     __func__, s_handle, e_handle);
1495cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1496cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    processed = true;
1497cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* mark service handle change pending */
1498cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_srcb->srvc_hdl_chg = true;
1499cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* clear up all notification/indication registration */
1500cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_clear_notif_registration(p_srcb, conn_id, s_handle, e_handle);
1501cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* service change indication all received, do discovery update */
1502cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (++p_srcb->update_count == bta_gattc_num_reg_app()) {
1503cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* not an opened connection; or connection busy */
1504cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* search for first available clcb and start discovery */
1505cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (p_clcb == NULL || (p_clcb && p_clcb->p_q_cmd != NULL)) {
1506cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        for (i = 0; i < BTA_GATTC_CLCB_MAX; i++) {
1507cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          if (bta_gattc_cb.clcb[i].in_use &&
1508cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson              bta_gattc_cb.clcb[i].p_srcb == p_srcb &&
1509cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson              bta_gattc_cb.clcb[i].p_q_cmd == NULL) {
1510cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            p_clcb = &bta_gattc_cb.clcb[i];
1511cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            break;
1512cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          }
15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1514cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
1515cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* send confirmation here if this is an indication, it should always be */
1516cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      GATTC_SendHandleValueConfirm(conn_id, att_value->handle);
15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1518cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* if connection available, refresh cache by doing discovery now */
1519cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (p_clcb != NULL)
1520cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1522cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* notify applicationf or service change */
1523cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clrcb->p_cback != NULL) {
1524cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (*p_clrcb->p_cback)(BTA_GATTC_SRVC_CHG_EVT,
1525cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                          (tBTA_GATTC*)p_srcb->server_bda);
1526cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
1527cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1529cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return processed;
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
15338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_proc_other_indication
15348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
15358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      process all non-service change indication/notification.
15368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
15378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
15388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
15398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1540cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_proc_other_indication(tBTA_GATTC_CLCB* p_clcb, uint8_t op,
1541cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                     tGATT_CL_COMPLETE* p_data,
1542cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                     tBTA_GATTC_NOTIFY* p_notify) {
1543cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG(
1544cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      "bta_gattc_proc_other_indication check \
15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->att_value.handle=%d p_data->handle=%d",
1546cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_data->att_value.handle, p_data->handle);
1547cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("is_notify", p_notify->is_notify);
15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1549cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_notify->is_notify = (op == GATTC_OPTYPE_INDICATION) ? false : true;
1550cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_notify->len = p_data->att_value.len;
1551cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bdcpy(p_notify->bda, p_clcb->bda);
1552cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  memcpy(p_notify->value, p_data->att_value.value, p_data->att_value.len);
1553cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_notify->conn_id = p_clcb->bta_conn_id;
15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1555cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clcb->p_rcb->p_cback)
1556cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    (*p_clcb->p_rcb->p_cback)(BTA_GATTC_NOTIF_EVT, (tBTA_GATTC*)p_notify);
15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
15608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_process_indicate
15618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
15628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      process indication/notification.
15638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
15648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
15658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
15668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1567cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gattc_process_indicate(uint16_t conn_id, tGATTC_OPTYPE op,
1568cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                tGATT_CL_COMPLETE* p_data) {
1569cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint16_t handle = p_data->att_value.handle;
1570cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_CLCB* p_clcb;
1571cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_RCB* p_clrcb = NULL;
1572cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_SERV* p_srcb = NULL;
1573cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_NOTIFY notify;
1574cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  BD_ADDR remote_bda;
1575cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_IF gatt_if;
1576cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_TRANSPORT transport;
1577cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1578cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (!GATT_GetConnectionInfor(conn_id, &gatt_if, remote_bda, &transport)) {
1579cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("%s indication/notif for unknown app", __func__);
1580cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (op == GATTC_OPTYPE_INDICATION)
1581cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      GATTC_SendHandleValueConfirm(conn_id, handle);
1582cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    return;
1583cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
1584cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1585f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  p_clrcb = bta_gattc_cl_get_regcb(gatt_if);
1586f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  if (p_clrcb == NULL) {
1587cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("%s indication/notif for unregistered app", __func__);
1588cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (op == GATTC_OPTYPE_INDICATION)
1589cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      GATTC_SendHandleValueConfirm(conn_id, handle);
1590cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    return;
1591cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
1592cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1593f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  p_srcb = bta_gattc_find_srcb(remote_bda);
1594f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  if (p_srcb == NULL) {
1595cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("%s indication/notif for unknown device, ignore",
1596cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                     __func__);
1597cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (op == GATTC_OPTYPE_INDICATION)
1598cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      GATTC_SendHandleValueConfirm(conn_id, handle);
1599cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    return;
1600cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
1601cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1602cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
1603cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1604cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  notify.handle = handle;
1605cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* if non-service change indication/notification, forward to application */
1606cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (!bta_gattc_process_srvc_chg_ind(conn_id, p_clrcb, p_srcb, p_clcb, &notify,
1607cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                      &p_data->att_value)) {
1608cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* if app registered for the notification */
1609cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (bta_gattc_check_notif_registry(p_clrcb, p_srcb, &notify)) {
1610cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* connection not open yet */
1611cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (p_clcb == NULL) {
1612cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_clcb = bta_gattc_clcb_alloc(gatt_if, remote_bda, transport);
1613cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1614cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        if (p_clcb == NULL) {
1615cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          APPL_TRACE_ERROR("No resources");
1616cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          return;
1617cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        }
16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1619cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_clcb->bta_conn_id = conn_id;
1620cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_clcb->transport = transport;
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1622cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, NULL);
1623cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1625cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (p_clcb != NULL)
1626cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_gattc_proc_other_indication(p_clcb, op, p_data, &notify);
16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1628cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* no one intersted and need ack? */
1629cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    else if (op == GATTC_OPTYPE_INDICATION) {
1630cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      APPL_TRACE_DEBUG("%s no one interested, ack now", __func__);
1631cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      GATTC_SendHandleValueConfirm(conn_id, handle);
1632cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
1633cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
16378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_cmpl_cback
16388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
16398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      client operation complete callback register with BTE GATT.
16408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
16418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
16428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
16438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1644cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gattc_cmpl_cback(uint16_t conn_id, tGATTC_OPTYPE op,
1645cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 tGATT_STATUS status,
1646cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 tGATT_CL_COMPLETE* p_data) {
1647cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_CLCB* p_clcb;
1648cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("bta_gattc_cmpl_cback: conn_id = %d op = %d status = %d",
1649cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                   conn_id, op, status);
1650cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1651cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* notification and indication processed right away */
1652cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (op == GATTC_OPTYPE_NOTIFICATION || op == GATTC_OPTYPE_INDICATION) {
1653cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gattc_process_indicate(conn_id, op, p_data);
1654cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    return;
1655cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
1656cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* for all other operation, not expected if w/o connection */
1657f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  else {
1658f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen    p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
1659f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen    if (p_clcb == NULL) {
1660f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen      APPL_TRACE_ERROR(
1661f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen          "bta_gattc_cmpl_cback unknown conn_id =  %d, ignore data", conn_id);
1662f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen      return;
1663f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen    }
1664cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
1665cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1666cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* if over BR_EDR, inform PM for mode change */
1667cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_clcb->transport == BTA_TRANSPORT_BR_EDR) {
1668cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_sys_busy(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
1669cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_sys_idle(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
1670cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
1671cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1672cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_gattc_cmpl_sendmsg(conn_id, op, status, p_data);
16737b4fdb40e81a68d254f6bf7cefbc385d978fb9d0Pavlin Radoslavov}
16747b4fdb40e81a68d254f6bf7cefbc385d978fb9d0Pavlin Radoslavov
16757b4fdb40e81a68d254f6bf7cefbc385d978fb9d0Pavlin Radoslavov/*******************************************************************************
16768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
16778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_cmpl_sendmsg
16788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
16798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      client operation complete send message
16808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
16818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          None.
16828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
16838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1684e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_gattc_cmpl_sendmsg(uint16_t conn_id, tGATTC_OPTYPE op,
16857b4fdb40e81a68d254f6bf7cefbc385d978fb9d0Pavlin Radoslavov                                   tBTA_GATT_STATUS status,
1686cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                   tGATT_CL_COMPLETE* p_data) {
1687cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  const size_t len = sizeof(tBTA_GATTC_OP_CMPL) + sizeof(tGATT_CL_COMPLETE);
1688cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_OP_CMPL* p_buf = (tBTA_GATTC_OP_CMPL*)osi_calloc(len);
1689717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
1690cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_GATTC_OP_CMPL_EVT;
1691cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = conn_id;
1692cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->status = status;
1693cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->op_code = op;
1694cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1695cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_data != NULL) {
1696cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->p_cmpl = (tGATT_CL_COMPLETE*)(p_buf + 1);
1697cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memcpy(p_buf->p_cmpl, p_data, sizeof(tGATT_CL_COMPLETE));
1698cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
1699cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1700cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
170217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
170317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach/*******************************************************************************
17048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
17058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gattc_cong_cback
17068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
17078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      congestion callback for BTA GATT client.
17088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
17098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
17108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1711ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1712cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gattc_cong_cback(uint16_t conn_id, bool congested) {
1713cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC_CLCB* p_clcb;
1714cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTC cb_data;
1715cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1716f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
1717f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  if (p_clcb != NULL) {
1718cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_clcb->p_rcb->p_cback) {
1719cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.congest.conn_id = conn_id;
1720cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.congest.congested = congested;
1721cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1722cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CONGEST_EVT, &cb_data);
172317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    }
1724cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
172517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach}
1726eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski
1727eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowskistatic void bta_gattc_phy_update_cback(tGATT_IF gatt_if, uint16_t conn_id,
1728eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski                                       uint8_t tx_phy, uint8_t rx_phy,
1729eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski                                       uint8_t status) {
1730eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  tBTA_GATTC_RCB* p_clreg = bta_gattc_cl_get_regcb(gatt_if);
1731eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski
1732eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  if (!p_clreg || !p_clreg->p_cback) {
1733eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski    APPL_TRACE_ERROR("%s: client_if=%d not found", __func__, gatt_if);
1734eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski    return;
1735eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  }
1736eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski
1737eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  tBTA_GATTC cb_data;
1738eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  cb_data.phy_update.conn_id = conn_id;
1739eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  cb_data.phy_update.server_if = gatt_if;
1740eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  cb_data.phy_update.tx_phy = tx_phy;
1741eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  cb_data.phy_update.rx_phy = rx_phy;
1742eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  cb_data.phy_update.status = status;
1743eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  (*p_clreg->p_cback)(BTA_GATTC_PHY_UPDATE_EVT, &cb_data);
1744eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski}
1745b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski
1746b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowskistatic void bta_gattc_conn_update_cback(tGATT_IF gatt_if, uint16_t conn_id,
1747b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski                                        uint16_t interval, uint16_t latency,
1748b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski                                        uint16_t timeout, uint8_t status) {
1749b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  tBTA_GATTC_RCB* p_clreg = bta_gattc_cl_get_regcb(gatt_if);
1750b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski
1751b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  if (!p_clreg || !p_clreg->p_cback) {
1752b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski    APPL_TRACE_ERROR("%s: client_if=%d not found", __func__, gatt_if);
1753b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski    return;
1754b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  }
1755b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski
1756b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  tBTA_GATTC cb_data;
1757b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  cb_data.conn_update.conn_id = conn_id;
1758b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  cb_data.conn_update.interval = interval;
1759b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  cb_data.conn_update.latency = latency;
1760b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  cb_data.conn_update.timeout = timeout;
1761b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  cb_data.conn_update.status = status;
1762b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  (*p_clreg->p_cback)(BTA_GATTC_CONN_UPDATE_EVT, &cb_data);
1763b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski}
1764