bta_gatts_act.cc revision cd1fd07f1306e08fe048682dd5918987e579f937
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 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
28e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_GATT_INCLUDED == TRUE)
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include <string.h>
31258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_gatts_co.h"
33cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bta_gatts_int.h"
34cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bta_sys.h"
3589f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach#include "btif/include/btif_debug_conn.h"
36cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "btm_ble_api.h"
37d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h"
38cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "utl.h"
39cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
40cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gatts_nv_save_cback(bool is_saved,
41cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                    tGATTS_HNDL_RANGE* p_hndl_range);
42cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic bool bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd,
43cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                       tGATTS_SRV_CHG_REQ* p_req,
44cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                       tGATTS_SRV_CHG_RSP* p_rsp);
45cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
46cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gatts_conn_cback(tGATT_IF gatt_if, BD_ADDR bda,
47cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 uint16_t conn_id, bool connected,
48cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 tGATT_DISCONN_REASON reason,
49cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 tGATT_TRANSPORT transport);
50cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gatts_send_request_cback(uint16_t conn_id, uint32_t trans_id,
51cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                         tGATTS_REQ_TYPE req_type,
52cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                         tGATTS_DATA* p_data);
53cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gatts_cong_cback(uint16_t conn_id, bool congested);
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic tGATT_CBACK bta_gatts_cback = {
56cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gatts_conn_cback, NULL, NULL, NULL, bta_gatts_send_request_cback, NULL,
57cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gatts_cong_cback};
58cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
59cd1fd07f1306e08fe048682dd5918987e579f937Myles WatsontGATT_APPL_INFO bta_gatts_nv_cback = {bta_gatts_nv_save_cback,
60cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                      bta_gatts_nv_srv_chg_cback};
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_nv_save_cback
658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      NV save callback function.
678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
68cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Parameter        is_add: true is to add a handle range; otherwise is to
69cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *delete.
708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
73cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gatts_nv_save_cback(bool is_add,
74cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                    tGATTS_HNDL_RANGE* p_hndl_range) {
75cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_gatts_co_update_handle_range(is_add,
76cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                   (tBTA_GATTS_HNDL_RANGE*)p_hndl_range);
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_nv_srv_chg_cback
828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      NV save callback function.
848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
85cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Parameter        is_add: true is to add a handle range; otherwise is to
86cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *delete.
878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
90e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic bool bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd,
91cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                       tGATTS_SRV_CHG_REQ* p_req,
92cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                       tGATTS_SRV_CHG_RSP* p_rsp) {
93cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return bta_gatts_co_srv_chg((tBTA_GATTS_SRV_CHG_CMD)cmd,
94cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              (tBTA_GATTS_SRV_CHG_REQ*)p_req,
95cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              (tBTA_GATTS_SRV_CHG_RSP*)p_rsp);
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_enable
1018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      enable BTA GATTS module.
1038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
1058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
107cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_enable(tBTA_GATTS_CB* p_cb) {
108cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t index = 0;
109cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_HNDL_RANGE handle_range;
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
111cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_cb->enabled) {
112cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_DEBUG("GATTS already enabled.");
113cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
114cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memset(p_cb, 0, sizeof(tBTA_GATTS_CB));
115e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
116cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_cb->enabled = true;
117e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
118cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    while (bta_gatts_co_load_handle_range(index, &handle_range)) {
119cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      GATTS_AddHandleRange((tGATTS_HNDL_RANGE*)&handle_range);
120cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      memset(&handle_range, 0, sizeof(tGATTS_HNDL_RANGE));
121cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      index++;
122cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
123cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
124cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_DEBUG("bta_gatts_enable: num of handle range added=%d", index);
125e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
126cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (!GATTS_NVRegister(&bta_gatts_nv_cback)) {
127cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      APPL_TRACE_ERROR("BTA GATTS NV register failed.");
128e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    }
129cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
130e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach}
131e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
132e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach/*******************************************************************************
1338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_api_disable
1358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      disable BTA GATTS module.
1378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
1398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
141cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_api_disable(tBTA_GATTS_CB* p_cb) {
142cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t i;
143cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
144cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_cb->enabled) {
145cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i++) {
146cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (p_cb->rcb[i].in_use) {
147cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        GATT_Deregister(p_cb->rcb[i].gatt_if);
148cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
150cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memset(p_cb, 0, sizeof(tBTA_GATTS_CB));
151cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
152cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("GATTS not enabled");
153cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
155e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_register
1598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      register an application.
1618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
1638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
165cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_register(tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_msg) {
166cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS cb_data;
167cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATT_STATUS status = BTA_GATT_OK;
168cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t i, first_unuse = 0xff;
169cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
170cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_cb->enabled == false) {
171cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_gatts_enable(p_cb);
172cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
173cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
174cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i++) {
175cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_cb->rcb[i].in_use) {
176cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (bta_gatts_uuid_compare(p_cb->rcb[i].app_uuid,
177cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 p_msg->api_reg.app_uuid)) {
178cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        APPL_TRACE_ERROR("application already registered.");
179cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        status = BTA_GATT_DUP_REG;
180cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        break;
181cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
182e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    }
183cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
184cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
185cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (status == BTA_GATT_OK) {
186cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i++) {
187cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (first_unuse == 0xff && !p_cb->rcb[i].in_use) {
188cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        first_unuse = i;
189cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        break;
190cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
193cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.reg_oper.server_if = BTA_GATTS_INVALID_IF;
194cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memcpy(&cb_data.reg_oper.uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID));
195cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (first_unuse != 0xff) {
196cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      APPL_TRACE_ERROR("register application first_unuse rcb_idx = %d",
197cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                       first_unuse);
198cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
199cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_cb->rcb[first_unuse].in_use = true;
200cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_cb->rcb[first_unuse].p_cback = p_msg->api_reg.p_cback;
201cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      memcpy(&p_cb->rcb[first_unuse].app_uuid, &p_msg->api_reg.app_uuid,
202cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson             sizeof(tBT_UUID));
203cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.reg_oper.server_if = p_cb->rcb[first_unuse].gatt_if =
204cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          GATT_Register(&p_msg->api_reg.app_uuid, &bta_gatts_cback);
205cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (!p_cb->rcb[first_unuse].gatt_if) {
206cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        status = BTA_GATT_NO_RESOURCES;
207cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      } else {
208cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        tBTA_GATTS_INT_START_IF* p_buf = (tBTA_GATTS_INT_START_IF*)osi_malloc(
209cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            sizeof(tBTA_GATTS_INT_START_IF));
210cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_buf->hdr.event = BTA_GATTS_INT_START_IF_EVT;
211cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_buf->server_if = p_cb->rcb[first_unuse].gatt_if;
212cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
213cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_sys_sendmsg(p_buf);
214cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
215cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else {
216cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      status = BTA_GATT_NO_RESOURCES;
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
218cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
219cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.reg_oper.status = status;
220cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_msg->api_reg.p_cback)
221cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    (*p_msg->api_reg.p_cback)(BTA_GATTS_REG_EVT, &cb_data);
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_start_if
2278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      start an application interface.
2298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
2318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
233cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_start_if(UNUSED_ATTR tBTA_GATTS_CB* p_cb,
234cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                        tBTA_GATTS_DATA* p_msg) {
235cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (bta_gatts_find_app_rcb_by_app_if(p_msg->int_start_if.server_if)) {
236cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    GATT_StartIf(p_msg->int_start_if.server_if);
237cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
238cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("Unable to start app.: Unknown interface =%d",
239cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                     p_msg->int_start_if.server_if);
240cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_deregister
2458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      deregister an application.
2478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
2498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
251cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_deregister(tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_msg) {
252cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATT_STATUS status = BTA_GATT_ERROR;
253cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_CBACK* p_cback = NULL;
254cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t i;
255cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS cb_data;
256cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
257cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.reg_oper.server_if = p_msg->api_dereg.server_if;
258cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.reg_oper.status = status;
259cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
260cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i++) {
261cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_cb->rcb[i].in_use &&
262cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_cb->rcb[i].gatt_if == p_msg->api_dereg.server_if) {
263cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_cback = p_cb->rcb[i].p_cback;
264cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      status = BTA_GATT_OK;
265cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
266cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* deregister the app */
267cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      GATT_Deregister(p_cb->rcb[i].gatt_if);
268cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
269cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* reset cb */
270cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      memset(&p_cb->rcb[i], 0, sizeof(tBTA_GATTS_RCB));
271cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.reg_oper.status = status;
272cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      break;
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
274cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
276cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_cback) {
277cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    (*p_cback)(BTA_GATTS_DEREG_EVT, &cb_data);
278cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
279cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("application not registered.");
280cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_delete_service
2868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      action function to delete a service.
2888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
2908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
292cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_delete_service(tBTA_GATTS_SRVC_CB* p_srvc_cb,
293cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              tBTA_GATTS_DATA* p_msg) {
294cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_RCB* p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
295cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS cb_data;
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
297cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.srvc_oper.server_if = p_rcb->gatt_if;
298cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  // cb_data.srvc_oper.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
300cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (GATTS_DeleteService(p_rcb->gatt_if, &p_srvc_cb->service_uuid,
301cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                          p_srvc_cb->service_id)) {
302cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.srvc_oper.status = BTA_GATT_OK;
303cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memset(p_srvc_cb, 0, sizeof(tBTA_GATTS_SRVC_CB));
304cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
305cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.srvc_oper.status = BTA_GATT_ERROR;
306cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
307cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
308cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_rcb->p_cback) (*p_rcb->p_cback)(BTA_GATTS_DELELTE_EVT, &cb_data);
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_stop_service
3148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      action function to stop a service.
3168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
3188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
320cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_stop_service(tBTA_GATTS_SRVC_CB* p_srvc_cb,
321cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            UNUSED_ATTR tBTA_GATTS_DATA* p_msg) {
322cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_RCB* p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
323cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS cb_data;
324cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
325cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  GATTS_StopService(p_srvc_cb->service_id);
326cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.srvc_oper.server_if = p_rcb->gatt_if;
327cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.srvc_oper.service_id = p_srvc_cb->service_id;
328cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  cb_data.srvc_oper.status = BTA_GATT_OK;
329cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_ERROR("bta_gatts_stop_service service_id= %d",
330cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                   p_srvc_cb->service_id);
331cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
332cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_rcb->p_cback) (*p_rcb->p_cback)(BTA_GATTS_STOP_EVT, &cb_data);
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_send_rsp
3378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      GATTS send response.
3398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
3418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
343cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_send_rsp(UNUSED_ATTR tBTA_GATTS_CB* p_cb,
344cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                        tBTA_GATTS_DATA* p_msg) {
345cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (GATTS_SendRsp(p_msg->api_rsp.hdr.layer_specific, p_msg->api_rsp.trans_id,
346cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                    p_msg->api_rsp.status,
347cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                    (tGATTS_RSP*)p_msg->api_rsp.p_rsp) != GATT_SUCCESS) {
348cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("Sending response failed");
349cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_indicate_handle
3548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      GATTS send handle value indication or notification.
3568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
3588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
360cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_indicate_handle(tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_msg) {
361cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_SRVC_CB* p_srvc_cb;
362cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_RCB* p_rcb = NULL;
363cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATT_STATUS status = BTA_GATT_ILLEGAL_PARAMETER;
364cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tGATT_IF gatt_if;
365cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  BD_ADDR remote_bda;
366cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_TRANSPORT transport;
367cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS cb_data;
368cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
369cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_srvc_cb =
370cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_gatts_find_srvc_cb_by_attr_id(p_cb, p_msg->api_indicate.attr_id);
371cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
372cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_srvc_cb) {
373cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (GATT_GetConnectionInfor(p_msg->api_indicate.hdr.layer_specific,
374cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                &gatt_if, remote_bda, &transport)) {
375cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
376cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
377cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (p_msg->api_indicate.need_confirm)
378cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
379cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        status = GATTS_HandleValueIndication(
380cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            p_msg->api_indicate.hdr.layer_specific, p_msg->api_indicate.attr_id,
381cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            p_msg->api_indicate.len, p_msg->api_indicate.value);
382cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      else
383cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        status = GATTS_HandleValueNotification(
384cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            p_msg->api_indicate.hdr.layer_specific, p_msg->api_indicate.attr_id,
385cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            p_msg->api_indicate.len, p_msg->api_indicate.value);
386cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
387cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* if over BR_EDR, inform PM for mode change */
388cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (transport == BTA_TRANSPORT_BR_EDR) {
389cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda);
390cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda);
391cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
392cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else {
393cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      APPL_TRACE_ERROR("Unknown connection ID: %d fail sending notification",
394cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                       p_msg->api_indicate.hdr.layer_specific);
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
396cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
397cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if ((status != GATT_SUCCESS || !p_msg->api_indicate.need_confirm) &&
398cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        p_rcb && p_cb->rcb[p_srvc_cb->rcb_idx].p_cback) {
399cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.req_data.status = status;
400cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.req_data.conn_id = p_msg->api_indicate.hdr.layer_specific;
401cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
402cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (*p_rcb->p_cback)(BTA_GATTS_CONF_EVT, &cb_data);
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
404cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
405cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("Not an registered servce attribute ID: 0x%04x",
406cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                     p_msg->api_indicate.attr_id);
407cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_open
4138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description
4158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
4178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
419cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_open(UNUSED_ATTR tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_msg) {
420cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_RCB* p_rcb = NULL;
421cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATT_STATUS status = BTA_GATT_ERROR;
422cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint16_t conn_id;
423cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
424cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_open.server_if)) !=
425cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      NULL) {
426cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* should always get the connection ID */
427cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (GATT_Connect(p_rcb->gatt_if, p_msg->api_open.remote_bda,
428cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                     p_msg->api_open.is_direct, p_msg->api_open.transport,
429cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                     false)) {
430cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      status = BTA_GATT_OK;
431cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
432cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (GATT_GetConnIdIfConnected(p_rcb->gatt_if, p_msg->api_open.remote_bda,
433cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                    &conn_id, p_msg->api_open.transport)) {
434cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        status = BTA_GATT_ALREADY_OPEN;
435cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
437cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
438cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_open.server_if);
439cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
441cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_rcb && p_rcb->p_cback)
442cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    (*p_rcb->p_cback)(BTA_GATTS_OPEN_EVT, (tBTA_GATTS*)&status);
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_cancel_open
4478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description
4498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
4518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
453cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_cancel_open(UNUSED_ATTR tBTA_GATTS_CB* p_cb,
454cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                           tBTA_GATTS_DATA* p_msg) {
455cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_RCB* p_rcb;
456cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATT_STATUS status = BTA_GATT_ERROR;
457cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
458cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(
459cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson           p_msg->api_cancel_open.server_if)) != NULL) {
460cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (!GATT_CancelConnect(p_rcb->gatt_if, p_msg->api_cancel_open.remote_bda,
461cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            p_msg->api_cancel_open.is_direct)) {
462cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      APPL_TRACE_ERROR("bta_gatts_cancel_open failed for open request");
463cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else {
464cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      status = BTA_GATT_OK;
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
466cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
467cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_cancel_open.server_if);
468cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
470cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_rcb && p_rcb->p_cback)
471cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    (*p_rcb->p_cback)(BTA_GATTS_CANCEL_OPEN_EVT, (tBTA_GATTS*)&status);
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_close
4768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description
4788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
4808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
482cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_gatts_close(UNUSED_ATTR tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_msg) {
483cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_RCB* p_rcb;
484cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATT_STATUS status = BTA_GATT_ERROR;
485cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tGATT_IF gatt_if;
486cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  BD_ADDR remote_bda;
487cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATT_TRANSPORT transport;
488cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
489cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (GATT_GetConnectionInfor(p_msg->hdr.layer_specific, &gatt_if, remote_bda,
490cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              &transport)) {
491cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (GATT_Disconnect(p_msg->hdr.layer_specific) != GATT_SUCCESS) {
492cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      APPL_TRACE_ERROR("bta_gatts_close fail conn_id=%d",
493cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                       p_msg->hdr.layer_specific);
494cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else {
495cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      status = BTA_GATT_OK;
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
498cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
499cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
500cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_rcb && p_rcb->p_cback) {
501cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (transport == BTA_TRANSPORT_BR_EDR)
502cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_sys_conn_close(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda);
503cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
504cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (*p_rcb->p_cback)(BTA_GATTS_CLOSE_EVT, (tBTA_GATTS*)&status);
505cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
506cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
507cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("Unknown connection ID: %d", p_msg->hdr.layer_specific);
508cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_request_cback
5148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      GATTS attribute request callback.
5168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
5188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
520cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gatts_send_request_cback(uint16_t conn_id, uint32_t trans_id,
521cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                         tGATTS_REQ_TYPE req_type,
522cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                         tGATTS_DATA* p_data) {
523cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS cb_data;
524cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_RCB* p_rcb;
525cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tGATT_IF gatt_if;
526cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATT_TRANSPORT transport;
527cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
528cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  memset(&cb_data, 0, sizeof(tBTA_GATTS));
529cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
530cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda,
531cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              &transport)) {
532cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
533cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
534cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_DEBUG("%s: conn_id=%d trans_id=%d req_type=%d", __func__,
535cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                     conn_id, trans_id, req_type);
536cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
537cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_rcb && p_rcb->p_cback) {
538cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      /* if over BR_EDR, inform PM for mode change */
539cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (transport == BTA_TRANSPORT_BR_EDR) {
540cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda);
541cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda);
542cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
543cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
544cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.req_data.conn_id = conn_id;
545cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.req_data.trans_id = trans_id;
546cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.req_data.p_data = (tBTA_GATTS_REQ_DATA*)p_data;
547cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
548cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (*p_rcb->p_cback)(req_type, &cb_data);
549cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else {
550cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      APPL_TRACE_ERROR("connection request on gatt_if[%d] is not interested",
551cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                       gatt_if);
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
553cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
554cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("request received on unknown connectino ID: %d", conn_id);
555cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_conn_cback
5618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      connection callback.
5638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
5658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
567cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gatts_conn_cback(tGATT_IF gatt_if, BD_ADDR bda,
568cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 uint16_t conn_id, bool connected,
569cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 tGATT_DISCONN_REASON reason,
570cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                 tGATT_TRANSPORT transport) {
571cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS cb_data;
572cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t evt = connected ? BTA_GATTS_CONNECT_EVT : BTA_GATTS_DISCONNECT_EVT;
573cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_RCB* p_reg;
574cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
575cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG(
576cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      "bta_gatts_conn_cback gatt_if=%d conn_id=%d connected=%d reason = 0x%04d",
577cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      gatt_if, conn_id, connected, reason);
578cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("bta_gatts_conn_cback  bda :%02x-%02x-%02x-%02x-%02x-%02x ",
579cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                   bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
580cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
581cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bt_bdaddr_t bdaddr;
582cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bdcpy(bdaddr.address, bda);
583cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (connected)
584cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    btif_debug_conn_state(bdaddr, BTIF_DEBUG_CONNECTED, GATT_CONN_UNKNOWN);
585cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  else
586cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    btif_debug_conn_state(bdaddr, BTIF_DEBUG_DISCONNECTED, reason);
587cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
588cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_reg = bta_gatts_find_app_rcb_by_app_if(gatt_if);
589cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
590cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_reg && p_reg->p_cback) {
591cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* there is no RM for GATT */
592cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (transport == BTA_TRANSPORT_BR_EDR) {
593cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (connected)
594cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_sys_conn_open(BTA_ID_GATTS, BTA_ALL_APP_ID, bda);
595cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      else
596cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_sys_conn_close(BTA_ID_GATTS, BTA_ALL_APP_ID, bda);
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
598cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
599cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.conn.conn_id = conn_id;
600cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.conn.server_if = gatt_if;
601cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.conn.reason = reason;
602cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    cb_data.conn.transport = transport;
603cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    memcpy(cb_data.conn.remote_bda, bda, BD_ADDR_LEN);
604cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    (*p_reg->p_cback)(evt, &cb_data);
605cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
606cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_ERROR("bta_gatts_conn_cback server_if=%d not found", gatt_if);
607cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
60917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
61017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach/*******************************************************************************
6118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_gatts_cong_cback
6138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      congestion callback.
6158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          none.
6178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
619cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_gatts_cong_cback(uint16_t conn_id, bool congested) {
620cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS_RCB* p_rcb;
621cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tGATT_IF gatt_if;
622cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATT_TRANSPORT transport;
623cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_GATTS cb_data;
624cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
625cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda,
626cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              &transport)) {
627cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
628cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
629cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_rcb && p_rcb->p_cback) {
630cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.congest.conn_id = conn_id;
631cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      cb_data.congest.congested = congested;
632cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
633cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (*p_rcb->p_cback)(BTA_GATTS_CONGEST_EVT, &cb_data);
63417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach    }
635cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
63617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach}
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_GATT_INCLUDED */
638