15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35b790feeeb211c42bf78ca3ae9c26aa30e516765Jakub Pawlowski *  Copyright 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 Server 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
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski#include <base/logging.h>
29cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include <string.h>
30258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_gatts_co.h"
32cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bta_gatts_int.h"
33cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bta_sys.h"
3489f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach#include "btif/include/btif_debug_conn.h"
35cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "btm_ble_api.h"
36d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h"
37cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "utl.h"
38cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
392647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowskiusing base::StringPrintf;
402647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski
41cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gatts_nv_save_cback(bool is_saved,
42cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                    tGATTS_HNDL_RANGE* p_hndl_range);
43cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic bool bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd,
44cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                       tGATTS_SRV_CHG_REQ* p_req,
45cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                       tGATTS_SRV_CHG_RSP* p_rsp);
46cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
47a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskistatic void bta_gatts_conn_cback(tGATT_IF gatt_if, const RawAddress& bda,
48cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 uint16_t conn_id, bool connected,
49cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 tGATT_DISCONN_REASON reason,
50cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 tGATT_TRANSPORT transport);
51cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gatts_send_request_cback(uint16_t conn_id, uint32_t trans_id,
52cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                         tGATTS_REQ_TYPE req_type,
53cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                         tGATTS_DATA* p_data);
54cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gatts_cong_cback(uint16_t conn_id, bool congested);
55eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowskistatic void bta_gatts_phy_update_cback(tGATT_IF gatt_if, uint16_t conn_id,
56eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski                                       uint8_t tx_phy, uint8_t rx_phy,
57eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski                                       uint8_t status);
58b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowskistatic void bta_gatts_conn_update_cback(tGATT_IF gatt_if, uint16_t conn_id,
59b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski                                        uint16_t interval, uint16_t latency,
60b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski                                        uint16_t timeout, uint8_t status);
61eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski
62eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowskistatic tGATT_CBACK bta_gatts_cback = {bta_gatts_conn_cback,
63eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski                                      NULL,
64eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski                                      NULL,
65eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski                                      NULL,
66eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski                                      bta_gatts_send_request_cback,
67eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski                                      NULL,
68eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski                                      bta_gatts_cong_cback,
69b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski                                      bta_gatts_phy_update_cback,
70b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski                                      bta_gatts_conn_update_cback};
71cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
72cd1fd07f1306e08fe048682dd5918987e579f937Myles WatsontGATT_APPL_INFO bta_gatts_nv_cback = {bta_gatts_nv_save_cback,
73cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                      bta_gatts_nv_srv_chg_cback};
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_nv_save_cback
788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      NV save callback function.
808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
81cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Parameter        is_add: true is to add a handle range; otherwise is to
821baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                          delete.
838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
86cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gatts_nv_save_cback(bool is_add,
87cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                    tGATTS_HNDL_RANGE* p_hndl_range) {
88cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_gatts_co_update_handle_range(is_add,
89cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                   (tBTA_GATTS_HNDL_RANGE*)p_hndl_range);
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_nv_srv_chg_cback
958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      NV save callback function.
978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
98cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Parameter        is_add: true is to add a handle range; otherwise is to
991baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson *                          delete.
1008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
1018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
103e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic bool bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd,
104cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                       tGATTS_SRV_CHG_REQ* p_req,
105cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                       tGATTS_SRV_CHG_RSP* p_rsp) {
10650ba9031b4551b013fe5f77c8648c85a257365c5Jakub Pawlowski  return bta_gatts_co_srv_chg((tGATTS_SRV_CHG_CMD)cmd,
10750ba9031b4551b013fe5f77c8648c85a257365c5Jakub Pawlowski                              (tGATTS_SRV_CHG_REQ*)p_req,
10850ba9031b4551b013fe5f77c8648c85a257365c5Jakub Pawlowski                              (tGATTS_SRV_CHG_RSP*)p_rsp);
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_enable
1148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      enable BTA GATTS module.
1168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
1188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
120cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_enable(tBTA_GATTS_CB* p_cb) {
121cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t index = 0;
122cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_HNDL_RANGE handle_range;
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
124cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_cb->enabled) {
1252647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    VLOG(1) << "GATTS already enabled.";
126cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
127cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memset(p_cb, 0, sizeof(tBTA_GATTS_CB));
128e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
129cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_cb->enabled = true;
130e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
131cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    while (bta_gatts_co_load_handle_range(index, &handle_range)) {
132cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      GATTS_AddHandleRange((tGATTS_HNDL_RANGE*)&handle_range);
133cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      memset(&handle_range, 0, sizeof(tGATTS_HNDL_RANGE));
134cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      index++;
135cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
136cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
1372647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    VLOG(1) << __func__ << ": num of handle range added:" << +index;
138e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
139cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (!GATTS_NVRegister(&bta_gatts_nv_cback)) {
1402647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski      LOG(ERROR) << "BTA GATTS NV register failed.";
141e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    }
142cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
143e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach}
144e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
145e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach/*******************************************************************************
1468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_api_disable
1488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      disable BTA GATTS module.
1508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
1528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
154cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_api_disable(tBTA_GATTS_CB* p_cb) {
155cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t i;
156cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
157cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_cb->enabled) {
158cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i++) {
159cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (p_cb->rcb[i].in_use) {
160cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        GATT_Deregister(p_cb->rcb[i].gatt_if);
161cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
163cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memset(p_cb, 0, sizeof(tBTA_GATTS_CB));
164cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
1652647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    LOG(ERROR) << "GATTS not enabled";
166cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
168e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_register
1728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      register an application.
1748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
1768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
178cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_register(tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_msg) {
179cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS cb_data;
180e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski  tGATT_STATUS status = GATT_SUCCESS;
181cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t i, first_unuse = 0xff;
182cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
183b749ebde2c6a55569e4e480abda3a4ee3afe2d72Myles Watson  if (!p_cb->enabled) {
184cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gatts_enable(p_cb);
185cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
186cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
187cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i++) {
188cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_cb->rcb[i].in_use) {
189819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski      if (p_cb->rcb[i].app_uuid == p_msg->api_reg.app_uuid) {
1902647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski        LOG(ERROR) << "application already registered.";
191e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski        status = GATT_DUP_REG;
192cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        break;
193cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
194e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    }
195cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
196cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
197e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski  if (status == GATT_SUCCESS) {
198cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i++) {
199cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (first_unuse == 0xff && !p_cb->rcb[i].in_use) {
200cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        first_unuse = i;
201cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        break;
202cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
205cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.reg_oper.server_if = BTA_GATTS_INVALID_IF;
206819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski    cb_data.reg_oper.uuid = p_msg->api_reg.app_uuid;
207cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (first_unuse != 0xff) {
208fdae46505f66759b58e7718b4706894020c8b7a5Jakub Pawlowski      LOG(INFO) << "register application first_unuse rcb_idx=" << +first_unuse;
209cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
210cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_cb->rcb[first_unuse].in_use = true;
211cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_cb->rcb[first_unuse].p_cback = p_msg->api_reg.p_cback;
212819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski      p_cb->rcb[first_unuse].app_uuid = p_msg->api_reg.app_uuid;
213cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.reg_oper.server_if = p_cb->rcb[first_unuse].gatt_if =
214819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski          GATT_Register(p_msg->api_reg.app_uuid, &bta_gatts_cback);
215cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (!p_cb->rcb[first_unuse].gatt_if) {
216e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski        status = GATT_NO_RESOURCES;
217cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      } else {
218cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        tBTA_GATTS_INT_START_IF* p_buf = (tBTA_GATTS_INT_START_IF*)osi_malloc(
219cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            sizeof(tBTA_GATTS_INT_START_IF));
220cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_buf->hdr.event = BTA_GATTS_INT_START_IF_EVT;
221cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_buf->server_if = p_cb->rcb[first_unuse].gatt_if;
222cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
223cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_sys_sendmsg(p_buf);
224cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
225cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else {
226e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski      status = GATT_NO_RESOURCES;
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
228cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
229cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.reg_oper.status = status;
230cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_msg->api_reg.p_cback)
231cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    (*p_msg->api_reg.p_cback)(BTA_GATTS_REG_EVT, &cb_data);
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_start_if
2378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      start an application interface.
2398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
2418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
243cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_start_if(UNUSED_ATTR tBTA_GATTS_CB* p_cb,
244cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                        tBTA_GATTS_DATA* p_msg) {
245cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (bta_gatts_find_app_rcb_by_app_if(p_msg->int_start_if.server_if)) {
246cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    GATT_StartIf(p_msg->int_start_if.server_if);
247cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
2482647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    LOG(ERROR) << "Unable to start app.: Unknown interface="
2492647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski               << +p_msg->int_start_if.server_if;
250cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_deregister
2558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      deregister an application.
2578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
2598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
261cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_deregister(tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_msg) {
262e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski  tGATT_STATUS status = GATT_ERROR;
263cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_CBACK* p_cback = NULL;
264cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t i;
265cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS cb_data;
266cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
267cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.reg_oper.server_if = p_msg->api_dereg.server_if;
268cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.reg_oper.status = status;
269cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
270cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i++) {
271cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_cb->rcb[i].in_use &&
272cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_cb->rcb[i].gatt_if == p_msg->api_dereg.server_if) {
273cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_cback = p_cb->rcb[i].p_cback;
274e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski      status = GATT_SUCCESS;
275cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
276cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* deregister the app */
277cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      GATT_Deregister(p_cb->rcb[i].gatt_if);
278cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
279cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* reset cb */
280cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      memset(&p_cb->rcb[i], 0, sizeof(tBTA_GATTS_RCB));
281cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.reg_oper.status = status;
282cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      break;
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
284cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
286cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_cback) {
287cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    (*p_cback)(BTA_GATTS_DEREG_EVT, &cb_data);
288cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
2892647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    LOG(ERROR) << "application not registered.";
290cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_delete_service
2968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      action function to delete a service.
2988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
3008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
302cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_delete_service(tBTA_GATTS_SRVC_CB* p_srvc_cb,
303cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              tBTA_GATTS_DATA* p_msg) {
304cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_RCB* p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
305cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS cb_data;
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
307cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.srvc_oper.server_if = p_rcb->gatt_if;
3085b96667c28d868a3c93edec0b9d7242532fcfb78Jeremy Klein  cb_data.srvc_oper.service_id = p_srvc_cb->service_id;
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
310cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (GATTS_DeleteService(p_rcb->gatt_if, &p_srvc_cb->service_uuid,
311cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                          p_srvc_cb->service_id)) {
312e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski    cb_data.srvc_oper.status = GATT_SUCCESS;
313cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memset(p_srvc_cb, 0, sizeof(tBTA_GATTS_SRVC_CB));
314cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
315e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski    cb_data.srvc_oper.status = GATT_ERROR;
316cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
317cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
318cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_rcb->p_cback) (*p_rcb->p_cback)(BTA_GATTS_DELELTE_EVT, &cb_data);
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_stop_service
3248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      action function to stop a service.
3268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
3288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
330cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_stop_service(tBTA_GATTS_SRVC_CB* p_srvc_cb,
331cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            UNUSED_ATTR tBTA_GATTS_DATA* p_msg) {
332cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_RCB* p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
333cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS cb_data;
334cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
335cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  GATTS_StopService(p_srvc_cb->service_id);
336cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.srvc_oper.server_if = p_rcb->gatt_if;
337cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.srvc_oper.service_id = p_srvc_cb->service_id;
338e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski  cb_data.srvc_oper.status = GATT_SUCCESS;
3392647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski  LOG(ERROR) << __func__ << " service_id=" << +p_srvc_cb->service_id;
340cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
341cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_rcb->p_cback) (*p_rcb->p_cback)(BTA_GATTS_STOP_EVT, &cb_data);
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_send_rsp
3468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      GATTS send response.
3488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
3508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
352cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_send_rsp(UNUSED_ATTR tBTA_GATTS_CB* p_cb,
353cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                        tBTA_GATTS_DATA* p_msg) {
354cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (GATTS_SendRsp(p_msg->api_rsp.hdr.layer_specific, p_msg->api_rsp.trans_id,
355cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                    p_msg->api_rsp.status,
356cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                    (tGATTS_RSP*)p_msg->api_rsp.p_rsp) != GATT_SUCCESS) {
3572647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    LOG(ERROR) << "Sending response failed";
358cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_indicate_handle
3638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      GATTS send handle value indication or notification.
3658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
3678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
369cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_indicate_handle(tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_msg) {
370cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_SRVC_CB* p_srvc_cb;
371cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_RCB* p_rcb = NULL;
372e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski  tGATT_STATUS status = GATT_ILLEGAL_PARAMETER;
373cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tGATT_IF gatt_if;
374a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski  RawAddress remote_bda;
375cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_TRANSPORT transport;
376cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS cb_data;
377cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
378cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_srvc_cb =
379cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gatts_find_srvc_cb_by_attr_id(p_cb, p_msg->api_indicate.attr_id);
380cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
381cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_srvc_cb) {
382cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (GATT_GetConnectionInfor(p_msg->api_indicate.hdr.layer_specific,
383cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                &gatt_if, remote_bda, &transport)) {
384cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
385cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
386cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (p_msg->api_indicate.need_confirm)
387cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
388cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        status = GATTS_HandleValueIndication(
389cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            p_msg->api_indicate.hdr.layer_specific, p_msg->api_indicate.attr_id,
390cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            p_msg->api_indicate.len, p_msg->api_indicate.value);
391cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      else
392cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        status = GATTS_HandleValueNotification(
393cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            p_msg->api_indicate.hdr.layer_specific, p_msg->api_indicate.attr_id,
394cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            p_msg->api_indicate.len, p_msg->api_indicate.value);
395cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
396cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* if over BR_EDR, inform PM for mode change */
397cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (transport == BTA_TRANSPORT_BR_EDR) {
398c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski        bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda);
399c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski        bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda);
400cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
401cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else {
4022647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski      LOG(ERROR) << "Unknown connection_id="
4032647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski                 << loghex(p_msg->api_indicate.hdr.layer_specific)
4042647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski                 << " fail sending notification";
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
406cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
407cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if ((status != GATT_SUCCESS || !p_msg->api_indicate.need_confirm) &&
408cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_rcb && p_cb->rcb[p_srvc_cb->rcb_idx].p_cback) {
409cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.req_data.status = status;
410cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.req_data.conn_id = p_msg->api_indicate.hdr.layer_specific;
411cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
412cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (*p_rcb->p_cback)(BTA_GATTS_CONF_EVT, &cb_data);
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
414cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
4152647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    LOG(ERROR) << "Not an registered servce attribute ID: "
4162647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski               << loghex(p_msg->api_indicate.attr_id);
417cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_open
4238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description
4258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
4278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
429cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_open(UNUSED_ATTR tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_msg) {
430cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_RCB* p_rcb = NULL;
431e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski  tGATT_STATUS status = GATT_ERROR;
432cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint16_t conn_id;
433cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
434f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_open.server_if);
435f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  if (p_rcb != NULL) {
436cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* should always get the connection ID */
437cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (GATT_Connect(p_rcb->gatt_if, p_msg->api_open.remote_bda,
438cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                     p_msg->api_open.is_direct, p_msg->api_open.transport,
439cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                     false)) {
440e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski      status = GATT_SUCCESS;
441cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
442cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (GATT_GetConnIdIfConnected(p_rcb->gatt_if, p_msg->api_open.remote_bda,
443cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                    &conn_id, p_msg->api_open.transport)) {
444e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski        status = GATT_ALREADY_OPEN;
445cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
447cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
4482647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    LOG(ERROR) << "Inavlid server_if=" << p_msg->api_open.server_if;
449cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4516ef9190de8be01a36a3e409e8253624326bf30eaMyles Watson  if (p_rcb && p_rcb->p_cback) {
4526ef9190de8be01a36a3e409e8253624326bf30eaMyles Watson    tBTA_GATTS bta_gatts;
4536ef9190de8be01a36a3e409e8253624326bf30eaMyles Watson    bta_gatts.status = status;
4546ef9190de8be01a36a3e409e8253624326bf30eaMyles Watson    (*p_rcb->p_cback)(BTA_GATTS_OPEN_EVT, &bta_gatts);
4556ef9190de8be01a36a3e409e8253624326bf30eaMyles Watson  }
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_cancel_open
4608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description
4628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
4648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
466cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_cancel_open(UNUSED_ATTR tBTA_GATTS_CB* p_cb,
467cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                           tBTA_GATTS_DATA* p_msg) {
468cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_RCB* p_rcb;
469e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski  tGATT_STATUS status = GATT_ERROR;
470cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
471f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_cancel_open.server_if);
472f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  if (p_rcb != NULL) {
473cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (!GATT_CancelConnect(p_rcb->gatt_if, p_msg->api_cancel_open.remote_bda,
474cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            p_msg->api_cancel_open.is_direct)) {
4752647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski      LOG(ERROR) << __func__ << ": failed for open request";
476cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else {
477e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski      status = GATT_SUCCESS;
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
479cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
4802647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    LOG(ERROR) << "Inavlid server_if=" << +p_msg->api_cancel_open.server_if;
481cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4836ef9190de8be01a36a3e409e8253624326bf30eaMyles Watson  if (p_rcb && p_rcb->p_cback) {
4846ef9190de8be01a36a3e409e8253624326bf30eaMyles Watson    tBTA_GATTS bta_gatts;
4856ef9190de8be01a36a3e409e8253624326bf30eaMyles Watson    bta_gatts.status = status;
4866ef9190de8be01a36a3e409e8253624326bf30eaMyles Watson    (*p_rcb->p_cback)(BTA_GATTS_CANCEL_OPEN_EVT, &bta_gatts);
4876ef9190de8be01a36a3e409e8253624326bf30eaMyles Watson  }
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_close
4928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description
4948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
4968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
498cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_close(UNUSED_ATTR tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_msg) {
499cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_RCB* p_rcb;
500e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski  tGATT_STATUS status = GATT_ERROR;
501cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tGATT_IF gatt_if;
502a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski  RawAddress remote_bda;
50350ba9031b4551b013fe5f77c8648c85a257365c5Jakub Pawlowski  tGATT_TRANSPORT transport;
504cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
505cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (GATT_GetConnectionInfor(p_msg->hdr.layer_specific, &gatt_if, remote_bda,
506cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              &transport)) {
507cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (GATT_Disconnect(p_msg->hdr.layer_specific) != GATT_SUCCESS) {
5082647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski      LOG(ERROR) << __func__
5092647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski                 << ": fail conn_id=" << loghex(p_msg->hdr.layer_specific);
510cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else {
511e9ef00c3fb2de5077a8ffdb728f1996cc1e9a155Jakub Pawlowski      status = GATT_SUCCESS;
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
514cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
515cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
516cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_rcb && p_rcb->p_cback) {
517cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (transport == BTA_TRANSPORT_BR_EDR)
518c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski        bta_sys_conn_close(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda);
519cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
5206ef9190de8be01a36a3e409e8253624326bf30eaMyles Watson      tBTA_GATTS bta_gatts;
5216ef9190de8be01a36a3e409e8253624326bf30eaMyles Watson      bta_gatts.status = status;
5226ef9190de8be01a36a3e409e8253624326bf30eaMyles Watson      (*p_rcb->p_cback)(BTA_GATTS_CLOSE_EVT, &bta_gatts);
523cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
524cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
5252647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    LOG(ERROR) << "Unknown connection_id=" << loghex(p_msg->hdr.layer_specific);
526cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_request_cback
5328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      GATTS attribute request callback.
5348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
5368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
538cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gatts_send_request_cback(uint16_t conn_id, uint32_t trans_id,
539cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                         tGATTS_REQ_TYPE req_type,
540cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                         tGATTS_DATA* p_data) {
541cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS cb_data;
542cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_RCB* p_rcb;
543cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tGATT_IF gatt_if;
54450ba9031b4551b013fe5f77c8648c85a257365c5Jakub Pawlowski  tGATT_TRANSPORT transport;
545cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
546cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  memset(&cb_data, 0, sizeof(tBTA_GATTS));
547cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
548cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda,
549cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              &transport)) {
550cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
551cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
5522647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    VLOG(1) << __func__ << ": conn_id=" << loghex(conn_id)
5532647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski            << ", trans_id=" << +trans_id << ", req_type=" << +req_type;
554cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
555cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_rcb && p_rcb->p_cback) {
556cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* if over BR_EDR, inform PM for mode change */
557cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (transport == BTA_TRANSPORT_BR_EDR) {
558c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski        bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda);
559c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski        bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda);
560cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
561cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
562cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.req_data.conn_id = conn_id;
563cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.req_data.trans_id = trans_id;
56450ba9031b4551b013fe5f77c8648c85a257365c5Jakub Pawlowski      cb_data.req_data.p_data = (tGATTS_DATA*)p_data;
565cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
566cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (*p_rcb->p_cback)(req_type, &cb_data);
567cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else {
5682647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski      LOG(ERROR) << "connection request on gatt_if=" << +gatt_if
5692647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski                 << " is not interested";
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
571cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
5722647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    LOG(ERROR) << "request received on unknown conn_id=" << loghex(conn_id);
573cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_conn_cback
5798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      connection callback.
5818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
5838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
585a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskistatic void bta_gatts_conn_cback(tGATT_IF gatt_if, const RawAddress& bdaddr,
586cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 uint16_t conn_id, bool connected,
587cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 tGATT_DISCONN_REASON reason,
588cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 tGATT_TRANSPORT transport) {
589cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS cb_data;
590cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t evt = connected ? BTA_GATTS_CONNECT_EVT : BTA_GATTS_DISCONNECT_EVT;
591cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_RCB* p_reg;
592cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
5932647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski  VLOG(1) << __func__ << "  bda=" << bdaddr << " gatt_if= " << gatt_if
5942647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski          << ", conn_id=" << loghex(conn_id) << " connected=" << connected
5952647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski          << ", reason=" << loghex(reason);
596cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
597cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (connected)
598cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    btif_debug_conn_state(bdaddr, BTIF_DEBUG_CONNECTED, GATT_CONN_UNKNOWN);
599cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  else
600cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    btif_debug_conn_state(bdaddr, BTIF_DEBUG_DISCONNECTED, reason);
601cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
602cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_reg = bta_gatts_find_app_rcb_by_app_if(gatt_if);
603cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
604cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_reg && p_reg->p_cback) {
605cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* there is no RM for GATT */
606cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (transport == BTA_TRANSPORT_BR_EDR) {
607cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (connected)
608c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski        bta_sys_conn_open(BTA_ID_GATTS, BTA_ALL_APP_ID, bdaddr);
609cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      else
610c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski        bta_sys_conn_close(BTA_ID_GATTS, BTA_ALL_APP_ID, bdaddr);
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
612cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
613cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.conn.conn_id = conn_id;
614cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.conn.server_if = gatt_if;
615cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.conn.reason = reason;
616cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.conn.transport = transport;
617c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    cb_data.conn.remote_bda = bdaddr;
618cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    (*p_reg->p_cback)(evt, &cb_data);
619cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
6202647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    LOG(ERROR) << __func__ << " server_if=" << +gatt_if << " not found";
621cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
62317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
624eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowskistatic void bta_gatts_phy_update_cback(tGATT_IF gatt_if, uint16_t conn_id,
625eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski                                       uint8_t tx_phy, uint8_t rx_phy,
626eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski                                       uint8_t status) {
627eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  tBTA_GATTS_RCB* p_reg = bta_gatts_find_app_rcb_by_app_if(gatt_if);
628eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  if (!p_reg || !p_reg->p_cback) {
6292647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    LOG(ERROR) << __func__ << ": server_if=" << +gatt_if << " not found";
630eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski    return;
631eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  }
632eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski
633eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  tBTA_GATTS cb_data;
634eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  cb_data.phy_update.conn_id = conn_id;
635eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  cb_data.phy_update.server_if = gatt_if;
636eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  cb_data.phy_update.tx_phy = tx_phy;
637eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  cb_data.phy_update.rx_phy = rx_phy;
638eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  cb_data.phy_update.status = status;
639eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski  (*p_reg->p_cback)(BTA_GATTS_PHY_UPDATE_EVT, &cb_data);
640eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski}
641eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski
642b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowskistatic void bta_gatts_conn_update_cback(tGATT_IF gatt_if, uint16_t conn_id,
643b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski                                        uint16_t interval, uint16_t latency,
644b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski                                        uint16_t timeout, uint8_t status) {
645b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  tBTA_GATTS_RCB* p_reg = bta_gatts_find_app_rcb_by_app_if(gatt_if);
646b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  if (!p_reg || !p_reg->p_cback) {
6472647452211f7beaee19610fe79442828ab2b0ee6Jakub Pawlowski    LOG(ERROR) << __func__ << ": server_if=" << +gatt_if << " not found";
648b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski    return;
649b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  }
650b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski
651b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  tBTA_GATTS cb_data;
652b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  cb_data.conn_update.conn_id = conn_id;
653b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  cb_data.conn_update.server_if = gatt_if;
654b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  cb_data.conn_update.interval = interval;
655b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  cb_data.conn_update.latency = latency;
656b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  cb_data.conn_update.timeout = timeout;
657b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  cb_data.conn_update.status = status;
658b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  (*p_reg->p_cback)(BTA_GATTS_CONN_UPDATE_EVT, &cb_data);
659b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski}
660b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski
66117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach/*******************************************************************************
6628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_cong_cback
6648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      congestion callback.
6668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
6688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
670cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gatts_cong_cback(uint16_t conn_id, bool congested) {
671cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_RCB* p_rcb;
672cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tGATT_IF gatt_if;
67350ba9031b4551b013fe5f77c8648c85a257365c5Jakub Pawlowski  tGATT_TRANSPORT transport;
674cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS cb_data;
675cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
676cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda,
677cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              &transport)) {
678cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
679cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
680cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_rcb && p_rcb->p_cback) {
681cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.congest.conn_id = conn_id;
682cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.congest.congested = congested;
683cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
684cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (*p_rcb->p_cback)(BTA_GATTS_CONGEST_EVT, &cb_data);
68517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    }
686cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
68717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach}
688