bta_gatts_act.cc revision 258c2538e3b62a8cdb403f2730c45d721e5292b4
1abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn/****************************************************************************** 2abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * 3abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * Copyright (C) 2003-2012 Broadcom Corporation 4abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * 5abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 6abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * you may not use this file except in compliance with the License. 7abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * You may obtain a copy of the License at: 8abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * 9abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 10abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * 11abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * Unless required by applicable law or agreed to in writing, software 12abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 13abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * See the License for the specific language governing permissions and 15abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * limitations under the License. 16abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * 172eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam ******************************************************************************/ 18abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn 194fdcec71dce130be3363dba93e685789797fee8eSteven Ng/****************************************************************************** 204fdcec71dce130be3363dba93e685789797fee8eSteven Ng * 212eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam * This file contains the GATT Server action functions for the state 222eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam * machine. 234fdcec71dce130be3363dba93e685789797fee8eSteven Ng * 24524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav ******************************************************************************/ 2517e9e1933055b207473b488595b2887bfcaea32eJim Miller 263bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 273bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang#include "bt_target.h" 2852c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam 293bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang#if defined(BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) 304037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackborn 31abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn#include "utl.h" 32abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn#include "bt_common.h" 33751de372750336c2dbc6ed656de84b881ede0858Ricky Wai#include "bta_sys.h" 3439b467482d1bf256a111c757e9b7621c6f523271Jason Monk#include "bta_gatts_int.h" 3539b467482d1bf256a111c757e9b7621c6f523271Jason Monk#include "bta_gatts_co.h" 3639b467482d1bf256a111c757e9b7621c6f523271Jason Monk#include "btm_ble_api.h" 37abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn#include "btif/include/btif_debug_conn.h" 385437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roos#include <string.h> 39f9ee84dba4299962742befdd4d390436d82b3c49Xiaohui Chen 4023c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrencestatic void bta_gatts_nv_save_cback(BOOLEAN is_saved, tGATTS_HNDL_RANGE *p_hndl_range); 41d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstromstatic BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req, 42edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam tGATTS_SRV_CHG_RSP *p_rsp); 4339b467482d1bf256a111c757e9b7621c6f523271Jason Monk 4439b467482d1bf256a111c757e9b7621c6f523271Jason Monkstatic void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, 4562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos BOOLEAN connected, tGATT_DISCONN_REASON reason, 4627d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings tGATT_TRANSPORT transport); 473bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangstatic void bta_gatts_send_request_cback (UINT16 conn_id, 48524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav UINT32 trans_id, 494fdcec71dce130be3363dba93e685789797fee8eSteven Ng tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data); 50d16c9b7c3100b7ba653dcd58db036500dd220896Jim Millerstatic void bta_gatts_cong_cback (UINT16 conn_id, BOOLEAN congested); 51265d3c2a0c36251bf8a9f571d7239b6dd404d942Tamas Berghammer 526465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunnestatic tGATT_CBACK bta_gatts_cback = 532eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam{ 542eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam bta_gatts_conn_cback, 552eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam NULL, 562eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam NULL, 572eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam NULL, 582eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam bta_gatts_send_request_cback, 59ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang NULL, 604fdcec71dce130be3363dba93e685789797fee8eSteven Ng bta_gatts_cong_cback 614fdcec71dce130be3363dba93e685789797fee8eSteven Ng}; 629c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka 632eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice LamtGATT_APPL_INFO bta_gatts_nv_cback = 649c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka{ 659c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka bta_gatts_nv_save_cback, 66751de372750336c2dbc6ed656de84b881ede0858Ricky Wai bta_gatts_nv_srv_chg_cback 67751de372750336c2dbc6ed656de84b881ede0858Ricky Wai}; 68263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio 690698a216311acd9ab52224602d1a75c08bf89f04Jim Miller/******************************************************************************* 70abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn** 71abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn** Function bta_gatts_nv_save_cback 7217e9e1933055b207473b488595b2887bfcaea32eJim Miller** 7317e9e1933055b207473b488595b2887bfcaea32eJim Miller** Description NV save callback function. 7452c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam** 7592779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini** Parameter is_add: true is to add a handle range; otherwise is to delete. 7692779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini** Returns none. 774fdcec71dce130be3363dba93e685789797fee8eSteven Ng** 784fdcec71dce130be3363dba93e685789797fee8eSteven Ng*******************************************************************************/ 7992779ce70156031f4fa3b8c2d84305f5b3b44105Udam Sainistatic void bta_gatts_nv_save_cback(BOOLEAN is_add, tGATTS_HNDL_RANGE *p_hndl_range) 8092779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini{ 8117e9e1933055b207473b488595b2887bfcaea32eJim Miller bta_gatts_co_update_handle_range(is_add, (tBTA_GATTS_HNDL_RANGE *)p_hndl_range); 82a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani} 83a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani 84a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani 85a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani/******************************************************************************* 86a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani** 87a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani** Function bta_gatts_nv_srv_chg_cback 8817e9e1933055b207473b488595b2887bfcaea32eJim Miller** 89bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller** Description NV save callback function. 9052c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam** 9152c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam** Parameter is_add: true is to add a handle range; otherwise is to delete. 9252c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam** Returns none. 9352c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam** 9466026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani*******************************************************************************/ 9566026773bbf1d7631743a5b892a4f768c694f868Amith Yamasanistatic BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd, 9666026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani tGATTS_SRV_CHG_REQ *p_req, tGATTS_SRV_CHG_RSP *p_rsp) 9717e9e1933055b207473b488595b2887bfcaea32eJim Miller{ 98edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam return bta_gatts_co_srv_chg((tBTA_GATTS_SRV_CHG_CMD) cmd, 993fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller (tBTA_GATTS_SRV_CHG_REQ *) p_req, 10017e9e1933055b207473b488595b2887bfcaea32eJim Miller (tBTA_GATTS_SRV_CHG_RSP *) p_rsp); 1014fdcec71dce130be3363dba93e685789797fee8eSteven Ng} 10217e9e1933055b207473b488595b2887bfcaea32eJim Miller 10347f1cd4325e839dd33273a451fa052e83789e483Jim Miller 104d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom/******************************************************************************* 1053fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller** 10646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller** Function bta_gatts_enable 10746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller** 1083bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang** Description enable BTA GATTS module. 10917e9e1933055b207473b488595b2887bfcaea32eJim Miller** 110edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** Returns none. 111edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** 112edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam*******************************************************************************/ 113edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lamvoid bta_gatts_enable(tBTA_GATTS_CB *p_cb) 114edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam{ 115edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam UINT8 index=0; 116edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam tBTA_GATTS_HNDL_RANGE handle_range; 117edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam 118edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam if (p_cb->enabled) 119edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam { 120edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam APPL_TRACE_DEBUG("GATTS already enabled."); 121edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam } 122edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam else 123edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam { 124edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam memset(p_cb, 0, sizeof(tBTA_GATTS_CB)); 125edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam 126edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam p_cb->enabled = TRUE; 127edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam 128edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam while ( bta_gatts_co_load_handle_range(index, &handle_range)) 129edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam { 130edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam GATTS_AddHandleRange((tGATTS_HNDL_RANGE *)&handle_range); 1313fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller memset(&handle_range, 0, sizeof(tGATTS_HNDL_RANGE)); 1323fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller index++; 1333fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller } 1344fdcec71dce130be3363dba93e685789797fee8eSteven Ng 1354fdcec71dce130be3363dba93e685789797fee8eSteven Ng APPL_TRACE_DEBUG("bta_gatts_enable: num of handle range added=%d", index); 13680412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett 13717e9e1933055b207473b488595b2887bfcaea32eJim Miller if (!GATTS_NVRegister(&bta_gatts_nv_cback)) 13817e9e1933055b207473b488595b2887bfcaea32eJim Miller { 139d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom APPL_TRACE_ERROR("BTA GATTS NV register failed."); 1406609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales } 1416609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales } 14217e9e1933055b207473b488595b2887bfcaea32eJim Miller} 14347f1cd4325e839dd33273a451fa052e83789e483Jim Miller 14446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller/******************************************************************************* 14546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller** 14662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos** Function bta_gatts_api_disable 147a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales** 1480698a216311acd9ab52224602d1a75c08bf89f04Jim Miller** Description disable BTA GATTS module. 1499218687e4baaf0226ef16b58f78123d979711e5dJim Miller** 150fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri** Returns none. 15192779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini** 152e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic*******************************************************************************/ 1534fdcec71dce130be3363dba93e685789797fee8eSteven Ngvoid bta_gatts_api_disable(tBTA_GATTS_CB *p_cb) 154ae16e55dd5d93db547cbcdb848a98242db8ad9f7Kevin Chyn{ 155edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam UINT8 i; 15617e9e1933055b207473b488595b2887bfcaea32eJim Miller 1578ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini if (p_cb->enabled) 1588ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini { 15917e9e1933055b207473b488595b2887bfcaea32eJim Miller for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++) 1606507613ebcd22e4691c2af92a5c161bd327db336Fan Zhang { 1619d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren if (p_cb->rcb[i].in_use) 1628a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren { 1638a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren GATT_Deregister(p_cb->rcb[i].gatt_if); 1648a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 16517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 16617e9e1933055b207473b488595b2887bfcaea32eJim Miller memset(p_cb, 0, sizeof(tBTA_GATTS_CB)); 16717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 1684fdcec71dce130be3363dba93e685789797fee8eSteven Ng else 169ab50807d1edacb4fca5447525bb5270a853eaafcJeff Sharkey { 17017e9e1933055b207473b488595b2887bfcaea32eJim Miller APPL_TRACE_ERROR("GATTS not enabled"); 171d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 17217e9e1933055b207473b488595b2887bfcaea32eJim Miller} 1730698a216311acd9ab52224602d1a75c08bf89f04Jim Miller 1744fdcec71dce130be3363dba93e685789797fee8eSteven Ng/******************************************************************************* 1754fdcec71dce130be3363dba93e685789797fee8eSteven Ng** 17617e9e1933055b207473b488595b2887bfcaea32eJim Miller** Function bta_gatts_register 177c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett** 178c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett** Description register an application. 179c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett** 18066026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani** Returns none. 18166026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani** 18240e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov*******************************************************************************/ 18340e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafovvoid bta_gatts_register(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) 18466026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani{ 18592779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini tBTA_GATTS_INT_START_IF *p_buf; 186c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett tBTA_GATTS cb_data; 1876609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales tBTA_GATT_STATUS status = BTA_GATT_OK; 1886609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales UINT8 i, first_unuse = 0xff; 1896609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales 1906609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales if (p_cb->enabled == FALSE) 191c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam { 192c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam bta_gatts_enable(p_cb); 19362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos } 19462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos 195ae16e55dd5d93db547cbcdb848a98242db8ad9f7Kevin Chyn for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++) 1966609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales { 19717e9e1933055b207473b488595b2887bfcaea32eJim Miller if (p_cb->rcb[i].in_use) 19817e9e1933055b207473b488595b2887bfcaea32eJim Miller { 19947f1cd4325e839dd33273a451fa052e83789e483Jim Miller if (bta_gatts_uuid_compare(p_cb->rcb[i].app_uuid, p_msg->api_reg.app_uuid)) 20046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller { 20146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller APPL_TRACE_ERROR("application already registered."); 20246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller status = BTA_GATT_DUP_REG; 20340e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov break; 20440e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov } 20540e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov } 20640e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov } 20717e9e1933055b207473b488595b2887bfcaea32eJim Miller 208bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller if (status == BTA_GATT_OK) 2098f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak { 2108f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++) 2118f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak { 2128f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak if (first_unuse == 0xff && !p_cb->rcb[i].in_use) 2138f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak { 214ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz first_unuse = i; 215ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz break; 2168f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak } 217ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz } 218edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam 2194fdcec71dce130be3363dba93e685789797fee8eSteven Ng cb_data.reg_oper.server_if = BTA_GATTS_INVALID_IF; 220788671647c6d615684d159a94ffb5b4367df6896Robin Lee// btla-specific ++ 221bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra memcpy(&cb_data.reg_oper.uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID)); 222bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra// btla-specific -- 223bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra if (first_unuse != 0xff) 224bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra { 225e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic APPL_TRACE_ERROR("register application first_unuse rcb_idx = %d", first_unuse); 226e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic 22747f1cd4325e839dd33273a451fa052e83789e483Jim Miller p_cb->rcb[first_unuse].in_use = TRUE; 2282bb62380449da124cd36fac80d6072ad6c4d0592Maurice Lam p_cb->rcb[first_unuse].p_cback = p_msg->api_reg.p_cback; 22962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos memcpy(&p_cb->rcb[first_unuse].app_uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID)); 23062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos cb_data.reg_oper.server_if = 23162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos p_cb->rcb[first_unuse].gatt_if = 23262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos GATT_Register(&p_msg->api_reg.app_uuid, &bta_gatts_cback); 23347f1cd4325e839dd33273a451fa052e83789e483Jim Miller if ( !p_cb->rcb[first_unuse].gatt_if) 2346370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler { 2356370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler status = BTA_GATT_NO_RESOURCES; 236788671647c6d615684d159a94ffb5b4367df6896Robin Lee } 237788671647c6d615684d159a94ffb5b4367df6896Robin Lee else 2384bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai { 2394bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai if ((p_buf = 2404bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai (tBTA_GATTS_INT_START_IF *) osi_getbuf(sizeof(tBTA_GATTS_INT_START_IF))) != NULL) 241fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri { 24217e9e1933055b207473b488595b2887bfcaea32eJim Miller p_buf->hdr.event = BTA_GATTS_INT_START_IF_EVT; 2432bb62380449da124cd36fac80d6072ad6c4d0592Maurice Lam p_buf->server_if = p_cb->rcb[first_unuse].gatt_if; 24447f1cd4325e839dd33273a451fa052e83789e483Jim Miller 24547f1cd4325e839dd33273a451fa052e83789e483Jim Miller bta_sys_sendmsg(p_buf); 24617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 247bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller else 2488ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini { 2498ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini status = BTA_GATT_NO_RESOURCES; 2508ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini memset( &p_cb->rcb[first_unuse], 0 , sizeof(tBTA_GATTS_RCB)); 2518ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini } 25287fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam } 25339b467482d1bf256a111c757e9b7621c6f523271Jason Monk } 2544fdcec71dce130be3363dba93e685789797fee8eSteven Ng else 2554fdcec71dce130be3363dba93e685789797fee8eSteven Ng { 2564fdcec71dce130be3363dba93e685789797fee8eSteven Ng status = BTA_GATT_NO_RESOURCES; 2574fdcec71dce130be3363dba93e685789797fee8eSteven Ng } 25887fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam 25987fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam } 26087fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam cb_data.reg_oper.status = status; 26187fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam if (p_msg->api_reg.p_cback) 26239b467482d1bf256a111c757e9b7621c6f523271Jason Monk (*p_msg->api_reg.p_cback)(BTA_GATTS_REG_EVT, &cb_data); 26317e9e1933055b207473b488595b2887bfcaea32eJim Miller} 26427d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings 265fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri 2663bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang/******************************************************************************* 2673bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang** 2683bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang** Function bta_gatts_start_if 2693bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang** 2704fdcec71dce130be3363dba93e685789797fee8eSteven Ng** Description start an application interface. 271436256c36d69549c77320d073bef27649c1b1d6eSteven Ng** 272436256c36d69549c77320d073bef27649c1b1d6eSteven Ng** Returns none. 2734fdcec71dce130be3363dba93e685789797fee8eSteven Ng** 2748f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak*******************************************************************************/ 2758f41b9b665369356aae5a2410ebc62e79b9122a2Tony Makvoid bta_gatts_start_if(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) 276436256c36d69549c77320d073bef27649c1b1d6eSteven Ng{ 27740e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov UNUSED(p_cb); 27840e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov 27940e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov if (bta_gatts_find_app_rcb_by_app_if(p_msg->int_start_if.server_if)) 28040e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov { 2814fdcec71dce130be3363dba93e685789797fee8eSteven Ng GATT_StartIf(p_msg->int_start_if.server_if); 2824fdcec71dce130be3363dba93e685789797fee8eSteven Ng } 28317e9e1933055b207473b488595b2887bfcaea32eJim Miller else 2843bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang { 28517e9e1933055b207473b488595b2887bfcaea32eJim Miller APPL_TRACE_ERROR("Unable to start app.: Unknown interface =%d", 286bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller p_msg->int_start_if.server_if ); 287bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 28846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller} 28946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller/******************************************************************************* 29046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller** 29146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller** Function bta_gatts_deregister 29246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller** 29346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller** Description deregister an application. 29446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller** 295a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales** Returns none. 296a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales** 29746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller*******************************************************************************/ 298146fc11958ae93d4c97ce83839188ece762f3275Andrei Kapishnikovvoid bta_gatts_deregister(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) 299f9ee84dba4299962742befdd4d390436d82b3c49Xiaohui Chen{ 30093bcfcb14d42ea0884b922ae1a4d84a6955ed835Clara Bayarri tBTA_GATT_STATUS status = BTA_GATT_ERROR; 301f9ee84dba4299962742befdd4d390436d82b3c49Xiaohui Chen tBTA_GATTS_CBACK *p_cback = NULL; 302fb4c583dba1fb8885ff9369bdab916eaa61b42bdPaul Lawrence UINT8 i; 303146fc11958ae93d4c97ce83839188ece762f3275Andrei Kapishnikov tBTA_GATTS cb_data; 30446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller 30546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller cb_data.reg_oper.server_if = p_msg->api_dereg.server_if; 306edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini cb_data.reg_oper.status = status; 307edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini 3082eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++) 30962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos { 31062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos if (p_cb->rcb[i].in_use && p_cb->rcb[i].gatt_if == p_msg->api_dereg.server_if) 31162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos { 312ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam p_cback = p_cb->rcb[i].p_cback; 3130698a216311acd9ab52224602d1a75c08bf89f04Jim Miller status = BTA_GATT_OK; 3140698a216311acd9ab52224602d1a75c08bf89f04Jim Miller 3150698a216311acd9ab52224602d1a75c08bf89f04Jim Miller /* deregister the app */ 316ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam GATT_Deregister(p_cb->rcb[i].gatt_if); 3170698a216311acd9ab52224602d1a75c08bf89f04Jim Miller 318edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini /* reset cb */ 319edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini memset(&p_cb->rcb[i], 0, sizeof(tBTA_GATTS_RCB)); 320c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam cb_data.reg_oper.status = status; 321c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam break; 32292779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini } 323378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng } 324378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng 325378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng if (p_cback) 326378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng { 327378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng (*p_cback)(BTA_GATTS_DEREG_EVT, &cb_data); 32846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller } 32962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos else 33062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos { 33162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos APPL_TRACE_ERROR("application not registered."); 33262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos } 33362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos} 334edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam/******************************************************************************* 33546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller** 33646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller** Function bta_gatts_create_srvc 33746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller** 33817e9e1933055b207473b488595b2887bfcaea32eJim Miller** Description action function to create a service. 33917e9e1933055b207473b488595b2887bfcaea32eJim Miller** 34017e9e1933055b207473b488595b2887bfcaea32eJim Miller** Returns none. 34147f1cd4325e839dd33273a451fa052e83789e483Jim Miller** 34217e9e1933055b207473b488595b2887bfcaea32eJim Miller*******************************************************************************/ 34317e9e1933055b207473b488595b2887bfcaea32eJim Millervoid bta_gatts_create_srvc(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) 344a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales{ 3452bb62380449da124cd36fac80d6072ad6c4d0592Maurice Lam UINT8 rcb_idx; 34662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos tBTA_GATTS cb_data; 34762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos UINT8 srvc_idx; 34862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos UINT16 service_id = 0; 34962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos 35062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos cb_data.create.status = BTA_GATT_ERROR; 35162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos 35262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos rcb_idx = bta_gatts_find_app_rcb_idx_by_app_if(p_cb, p_msg->api_create_svc.server_if); 35362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos 354e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam APPL_TRACE_ERROR("create service rcb_idx = %d", rcb_idx); 355e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam 35677181e947860056fb77d24ab9fa9e86365b244e6Adrian Roos if (rcb_idx != BTA_GATTS_INVALID_APP) 357e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam { 358e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam if ((srvc_idx = bta_gatts_alloc_srvc_cb(p_cb, rcb_idx)) != BTA_GATTS_INVALID_APP) 359edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam { 360edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam /* create the service now */ 361edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam service_id = GATTS_CreateService (p_cb->rcb[rcb_idx].gatt_if, 362edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam &p_msg->api_create_svc.service_uuid, 363edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam p_msg->api_create_svc.inst, 364edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam p_msg->api_create_svc.num_handle, 365edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam p_msg->api_create_svc.is_pri); 366edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam 367edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam if (service_id != 0) 368e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam { 3694fdcec71dce130be3363dba93e685789797fee8eSteven Ng memcpy(&p_cb->srvc_cb[srvc_idx].service_uuid, 3704fdcec71dce130be3363dba93e685789797fee8eSteven Ng &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID)); 371d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini p_cb->srvc_cb[srvc_idx].service_id = service_id; 3724fdcec71dce130be3363dba93e685789797fee8eSteven Ng p_cb->srvc_cb[srvc_idx].inst_num = p_msg->api_create_svc.inst; 3734fdcec71dce130be3363dba93e685789797fee8eSteven Ng p_cb->srvc_cb[srvc_idx].idx = srvc_idx; 3744fdcec71dce130be3363dba93e685789797fee8eSteven Ng 3758f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak cb_data.create.status = BTA_GATT_OK; 3768f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak cb_data.create.service_id = service_id; 3774fdcec71dce130be3363dba93e685789797fee8eSteven Ng// btla-specific ++ 3784fdcec71dce130be3363dba93e685789797fee8eSteven Ng cb_data.create.is_primary = p_msg->api_create_svc.is_pri; 3794fdcec71dce130be3363dba93e685789797fee8eSteven Ng// btla-specific -- 3804fdcec71dce130be3363dba93e685789797fee8eSteven Ng cb_data.create.server_if = p_cb->rcb[rcb_idx].gatt_if; 3814fdcec71dce130be3363dba93e685789797fee8eSteven Ng } 3824fdcec71dce130be3363dba93e685789797fee8eSteven Ng else 3834fdcec71dce130be3363dba93e685789797fee8eSteven Ng { 3844fdcec71dce130be3363dba93e685789797fee8eSteven Ng cb_data.status = BTA_GATT_ERROR; 38517e9e1933055b207473b488595b2887bfcaea32eJim Miller memset(&p_cb->srvc_cb[srvc_idx], 0, sizeof(tBTA_GATTS_SRVC_CB)); 38617e9e1933055b207473b488595b2887bfcaea32eJim Miller APPL_TRACE_ERROR("service creation failed."); 38717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 38817e9e1933055b207473b488595b2887bfcaea32eJim Miller// btla-specific ++ 38962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos memcpy(&cb_data.create.uuid, &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID)); 39062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos cb_data.create.svc_instance= p_msg->api_create_svc.inst; 39162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos// btla-specific -- 392bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 393bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller if (p_cb->rcb[rcb_idx].p_cback) 394d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini (* p_cb->rcb[rcb_idx].p_cback)(BTA_GATTS_CREATE_EVT, &cb_data); 395d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini } 396d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini else /* application not registered */ 397d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini { 39817e9e1933055b207473b488595b2887bfcaea32eJim Miller APPL_TRACE_ERROR("Application not registered"); 39917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 40017e9e1933055b207473b488595b2887bfcaea32eJim Miller} 40117e9e1933055b207473b488595b2887bfcaea32eJim Miller/******************************************************************************* 40217e9e1933055b207473b488595b2887bfcaea32eJim Miller** 40347f1cd4325e839dd33273a451fa052e83789e483Jim Miller** Function bta_gatts_add_include_srvc 40446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller** 40546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller** Description action function to add an included service. 40640e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov** 40740e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov** Returns none. 40840e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov** 40917e9e1933055b207473b488595b2887bfcaea32eJim Miller*******************************************************************************/ 410bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millervoid bta_gatts_add_include_srvc(tBTA_GATTS_SRVC_CB *p_srvc_cb,tBTA_GATTS_DATA * p_msg) 4112bb62380449da124cd36fac80d6072ad6c4d0592Maurice Lam{ 4125541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx]; 4135541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller UINT16 attr_id = 0; 41417e9e1933055b207473b488595b2887bfcaea32eJim Miller tBTA_GATTS cb_data; 4156370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler 4165541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller attr_id = GATTS_AddIncludeService(p_msg->api_add_incl_srvc.hdr.layer_specific, 417edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam p_msg->api_add_incl_srvc.included_service_id); 4183fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller 4193fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller cb_data.add_result.server_if = p_rcb->gatt_if; 42017e9e1933055b207473b488595b2887bfcaea32eJim Miller cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific; 42117e9e1933055b207473b488595b2887bfcaea32eJim Miller cb_data.add_result.attr_id = attr_id; 42217e9e1933055b207473b488595b2887bfcaea32eJim Miller 42317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (attr_id) 4248ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini { 4253fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller cb_data.add_result.status = BTA_GATT_OK; 426bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini } 4279a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk else 428524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav { 4292bb62380449da124cd36fac80d6072ad6c4d0592Maurice Lam cb_data.add_result.status = BTA_GATT_ERROR; 4302bb62380449da124cd36fac80d6072ad6c4d0592Maurice Lam } 431edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam 432bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller if (p_rcb->p_cback) 433abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn (*p_rcb->p_cback)(BTA_GATTS_ADD_INCL_SRVC_EVT, &cb_data); 434bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller} 4358ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini/******************************************************************************* 4368ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini** 437a77652fea94fca598d530e40a815ca0c8e8c0d15Jeff Sharkey** Function bta_gatts_add_char 438a77652fea94fca598d530e40a815ca0c8e8c0d15Jeff Sharkey** 439edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** Description action function to add characteristic. 440159dff63a5e8e1286f0d42d400b64d43fb104649Jeff Sharkey** 441edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** Returns none. 442edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** 4438ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini*******************************************************************************/ 4448ef4c620031973187eefc1f1f1a330e8fd26696dUdam Sainivoid bta_gatts_add_char(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg) 445bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini{ 446bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx]; 447edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam UINT16 attr_id = 0; 448edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam tBTA_GATTS cb_data; 449edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam 450edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam attr_id = GATTS_AddCharacteristic(p_msg->api_add_char.hdr.layer_specific, 451edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam &p_msg->api_add_char.char_uuid, 452bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini p_msg->api_add_char.perm, 453e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic p_msg->api_add_char.property); 454e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic cb_data.add_result.server_if = p_rcb->gatt_if; 455edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific; 456edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam cb_data.add_result.attr_id = attr_id; 457e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic// btla-specific ++ 458edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam memcpy(&cb_data.add_result.char_uuid, &p_msg->api_add_char.char_uuid, sizeof(tBT_UUID)); 459e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic// btla-specific -- 4604fdcec71dce130be3363dba93e685789797fee8eSteven Ng 4614fdcec71dce130be3363dba93e685789797fee8eSteven Ng if (attr_id) 4624fdcec71dce130be3363dba93e685789797fee8eSteven Ng { 4634fdcec71dce130be3363dba93e685789797fee8eSteven Ng cb_data.add_result.status = BTA_GATT_OK; 464bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini } 465bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini else 466edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam { 467edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam cb_data.add_result.status = BTA_GATT_ERROR; 468edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam } 469edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam 470edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam if (p_rcb->p_cback) 471edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam (*p_rcb->p_cback)(BTA_GATTS_ADD_CHAR_EVT, &cb_data); 472edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam} 473edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam/******************************************************************************* 474edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** 475edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** Function bta_gatts_add_char_descr 476edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** 477edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** Description action function to add characteristic descriptor. 478edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** 479edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** Returns none. 480edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** 481edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam*******************************************************************************/ 482edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lamvoid bta_gatts_add_char_descr(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg) 483edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam{ 484edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx]; 485edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam UINT16 attr_id = 0; 486edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam tBTA_GATTS cb_data; 4879a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk 4889a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk attr_id = GATTS_AddCharDescriptor(p_msg->api_add_char_descr.hdr.layer_specific, 4899a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk p_msg->api_add_char_descr.perm, 4909a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk &p_msg->api_add_char_descr.descr_uuid); 4919a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk 4929a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk cb_data.add_result.server_if = p_rcb->gatt_if; 4939a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific; 4949a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk cb_data.add_result.attr_id = attr_id; 4959a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk// btla-specific ++ 496e07c947ea35b07eb354dd43068a5670dd6cce2efJason Monk memcpy(&cb_data.add_result.char_uuid, &p_msg->api_add_char_descr.descr_uuid, sizeof(tBT_UUID)); 497e07c947ea35b07eb354dd43068a5670dd6cce2efJason Monk// btla-specific -- 4987402b2514358e02a0e0adde982b6deb8552dc28aClara Bayarri 499edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam if (attr_id) 5009a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk { 501edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam cb_data.add_result.status = BTA_GATT_OK; 502edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam } 503edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam else 504edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam { 505d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom cb_data.add_result.status = BTA_GATT_ERROR; 506d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom } 50717e9e1933055b207473b488595b2887bfcaea32eJim Miller 508df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang if (p_rcb->p_cback) 509df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang (*p_rcb->p_cback)(BTA_GATTS_ADD_CHAR_DESCR_EVT, &cb_data); 510df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang 511df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang} 5123fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller/******************************************************************************* 5133fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller** 514df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang** Function bta_gatts_delete_service 5153fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller** 5163fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller** Description action function to delete a service. 517df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang** 518df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang** Returns none. 519df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang** 52017e9e1933055b207473b488595b2887bfcaea32eJim Miller*******************************************************************************/ 52117e9e1933055b207473b488595b2887bfcaea32eJim Millervoid bta_gatts_delete_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg) 52217e9e1933055b207473b488595b2887bfcaea32eJim Miller{ 523df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx]; 52417e9e1933055b207473b488595b2887bfcaea32eJim Miller tBTA_GATTS cb_data; 525df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang 526f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos cb_data.srvc_oper.server_if = p_rcb->gatt_if; 527cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani cb_data.srvc_oper.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific; 528783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller 52925c3c54c03dab4bd14dbe92ac48e85df9c15bd68Tony Mak if (GATTS_DeleteService(p_rcb->gatt_if, 5309c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka &p_srvc_cb->service_uuid, 531f755baf1c3b8fcbcee68720c8367e03381fffb4bSudheer Shanka p_srvc_cb->inst_num)) 532edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam { 533edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam cb_data.srvc_oper.status = BTA_GATT_OK; 534edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam memset(p_srvc_cb, 0, sizeof(tBTA_GATTS_SRVC_CB)); 535edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam } 5369c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka else 537edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam { 538edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam cb_data.srvc_oper.status = BTA_GATT_ERROR; 539edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam } 540edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam 541df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang if (p_rcb->p_cback) 542edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam (*p_rcb->p_cback)(BTA_GATTS_DELELTE_EVT, &cb_data); 543df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang 544f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos} 545cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani/******************************************************************************* 5469c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka** 5479c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka** Function bta_gatts_start_service 5485541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller** 5499c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka** Description action function to start a service. 5509c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka** 5519c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka** Returns none. 55217e9e1933055b207473b488595b2887bfcaea32eJim Miller** 55317e9e1933055b207473b488595b2887bfcaea32eJim Miller*******************************************************************************/ 5549c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankavoid bta_gatts_start_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg) 5559c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka{ 55617e9e1933055b207473b488595b2887bfcaea32eJim Miller tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx]; 557bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller tBTA_GATTS cb_data; 558bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller 559bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller cb_data.srvc_oper.server_if = p_rcb->gatt_if; 560bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller cb_data.srvc_oper.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific; 561524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav 56223c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence if (GATTS_StartService(p_rcb->gatt_if, 56323c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence p_srvc_cb->service_id, 56423c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence p_msg->api_start.transport) == GATT_SUCCESS) 56523c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence { 56623c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence APPL_TRACE_DEBUG("bta_gatts_start_service service_id= %d", p_srvc_cb->service_id); 56723c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence cb_data.srvc_oper.status = BTA_GATT_OK; 56823c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence } 56940ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav else 57040ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav { 57140ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav cb_data.srvc_oper.status = BTA_GATT_ERROR; 572524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav } 573524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav 574524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav if (p_rcb->p_cback) 575524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav (*p_rcb->p_cback)(BTA_GATTS_START_EVT, &cb_data); 576524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav 577edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam} 578edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam/******************************************************************************* 579edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** 580edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** Function bta_gatts_stop_service 581524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav** 582524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav** Description action function to stop a service. 5832eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam** 5842eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam** Returns none. 5856b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam** 5866b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam*******************************************************************************/ 5872eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lamvoid bta_gatts_stop_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg) 5882eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam{ 5892eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx]; 5902eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam tBTA_GATTS cb_data; 5912eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam UNUSED(p_msg); 592b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam 5932eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam GATTS_StopService(p_srvc_cb->service_id); 5942eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam cb_data.srvc_oper.server_if = p_rcb->gatt_if; 5952eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam cb_data.srvc_oper.service_id = p_srvc_cb->service_id; 59640e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov cb_data.srvc_oper.status = BTA_GATT_OK; 59740e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov APPL_TRACE_ERROR("bta_gatts_stop_service service_id= %d", p_srvc_cb->service_id); 5982eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam 5992eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam if (p_rcb->p_cback) 6002eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam (*p_rcb->p_cback)(BTA_GATTS_STOP_EVT, &cb_data); 6016609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales 6026609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales} 6032eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam/******************************************************************************* 6042eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam** 6052eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam** Function bta_gatts_send_rsp 606b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam** 6072eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam** Description GATTS send response. 6082eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam** 6092eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam** Returns none. 61040e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov** 61140e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov*******************************************************************************/ 6122eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lamvoid bta_gatts_send_rsp (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) 6132eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam{ 6142eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam UNUSED(p_cb); 615a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales 616a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales if (GATTS_SendRsp (p_msg->api_rsp.hdr.layer_specific, 617ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam p_msg->api_rsp.trans_id, 618edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini p_msg->api_rsp.status, 619edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini (tGATTS_RSP *)p_msg->api_rsp.p_rsp) != GATT_SUCCESS) 620edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini { 621ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam APPL_TRACE_ERROR("Sending response failed"); 622ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam } 6235541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller 62417e9e1933055b207473b488595b2887bfcaea32eJim Miller} 62517e9e1933055b207473b488595b2887bfcaea32eJim Miller/******************************************************************************* 62617e9e1933055b207473b488595b2887bfcaea32eJim Miller** 62717e9e1933055b207473b488595b2887bfcaea32eJim Miller** Function bta_gatts_indicate_handle 6286370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler** 62917e9e1933055b207473b488595b2887bfcaea32eJim Miller** Description GATTS send handle value indication or notification. 630edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** 631edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** Returns none. 632edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam** 63317e9e1933055b207473b488595b2887bfcaea32eJim Miller*******************************************************************************/ 63417e9e1933055b207473b488595b2887bfcaea32eJim Millervoid bta_gatts_indicate_handle (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) 635edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam{ 6366370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler tBTA_GATTS_SRVC_CB *p_srvc_cb; 63717e9e1933055b207473b488595b2887bfcaea32eJim Miller tBTA_GATTS_RCB *p_rcb = NULL; 6386370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler tBTA_GATT_STATUS status = BTA_GATT_ILLEGAL_PARAMETER; 63917e9e1933055b207473b488595b2887bfcaea32eJim Miller tGATT_IF gatt_if; 640bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller BD_ADDR remote_bda; 641edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam tBTA_TRANSPORT transport; 6422eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam tBTA_GATTS cb_data; 643edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini 644edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam p_srvc_cb = bta_gatts_find_srvc_cb_by_attr_id (p_cb, p_msg->api_indicate.attr_id); 645edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam 646edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam if (p_srvc_cb ) 647edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam { 6484fdcec71dce130be3363dba93e685789797fee8eSteven Ng if (GATT_GetConnectionInfor(p_msg->api_indicate.hdr.layer_specific, 6494fdcec71dce130be3363dba93e685789797fee8eSteven Ng &gatt_if, remote_bda, &transport)) 6504fdcec71dce130be3363dba93e685789797fee8eSteven Ng { 6514fdcec71dce130be3363dba93e685789797fee8eSteven Ng p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if); 652edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini 653edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini if (p_msg->api_indicate.need_confirm) 654edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini 655edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini status = GATTS_HandleValueIndication (p_msg->api_indicate.hdr.layer_specific, 6564bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai p_msg->api_indicate.attr_id, 65779b4ebffebb48449d5d2126795f6c729eea25ec4Rubin Xu p_msg->api_indicate.len, 658edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini p_msg->api_indicate.value); 659edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini else 6604fdcec71dce130be3363dba93e685789797fee8eSteven Ng status = GATTS_HandleValueNotification (p_msg->api_indicate.hdr.layer_specific, 661edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini p_msg->api_indicate.attr_id, 662751de372750336c2dbc6ed656de84b881ede0858Ricky Wai p_msg->api_indicate.len, 663edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini p_msg->api_indicate.value); 664edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini 665c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross /* if over BR_EDR, inform PM for mode change */ 6662eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam if (transport == BTA_TRANSPORT_BR_EDR) 667edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini { 668e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda); 6692eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda); 670e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic } 67125c3c54c03dab4bd14dbe92ac48e85df9c15bd68Tony Mak } 67217e9e1933055b207473b488595b2887bfcaea32eJim Miller else 67317e9e1933055b207473b488595b2887bfcaea32eJim Miller { 67417e9e1933055b207473b488595b2887bfcaea32eJim Miller APPL_TRACE_ERROR("Unknown connection ID: %d fail sending notification", 67517e9e1933055b207473b488595b2887bfcaea32eJim Miller p_msg->api_indicate.hdr.layer_specific); 6762eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam } 67717e9e1933055b207473b488595b2887bfcaea32eJim Miller 6782eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam if ((status != GATT_SUCCESS || !p_msg->api_indicate.need_confirm) && 67917e9e1933055b207473b488595b2887bfcaea32eJim Miller p_rcb && p_cb->rcb[p_srvc_cb->rcb_idx].p_cback) 68092779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini { 68192779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini cb_data.req_data.status = status; 68292779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini cb_data.req_data.conn_id = p_msg->api_indicate.hdr.layer_specific; 683edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini 684abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn (*p_rcb->p_cback)(BTA_GATTS_CONF_EVT, &cb_data); 685b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani } 686751de372750336c2dbc6ed656de84b881ede0858Ricky Wai } 687dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai else 688dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai { 689dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai APPL_TRACE_ERROR("Not an registered servce attribute ID: 0x%04x", 690dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai p_msg->api_indicate.attr_id); 691dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai } 692dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai} 693dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai 694dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai 695dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai/******************************************************************************* 696dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai** 697dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai** Function bta_gatts_open 6987569bb18815437a2f656fc7ff4d57274c5055477Charles He** 6997569bb18815437a2f656fc7ff4d57274c5055477Charles He** Description 7007569bb18815437a2f656fc7ff4d57274c5055477Charles He** 7017569bb18815437a2f656fc7ff4d57274c5055477Charles He** Returns none. 7027569bb18815437a2f656fc7ff4d57274c5055477Charles He** 703751de372750336c2dbc6ed656de84b881ede0858Ricky Wai*******************************************************************************/ 704eb8962d2734984d6e16f87261c01d8080ff16757Clara Bayarrivoid bta_gatts_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) 705dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai{ 7067569bb18815437a2f656fc7ff4d57274c5055477Charles He tBTA_GATTS_RCB *p_rcb=NULL; 7077569bb18815437a2f656fc7ff4d57274c5055477Charles He tBTA_GATT_STATUS status= BTA_GATT_ERROR; 708dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai UINT16 conn_id; 709dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai UNUSED(p_cb); 710751de372750336c2dbc6ed656de84b881ede0858Ricky Wai 711dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_open.server_if)) != NULL) 712dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai { 713dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai /* should always get the connection ID */ 714dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai if (GATT_Connect(p_rcb->gatt_if, p_msg->api_open.remote_bda, 715dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai p_msg->api_open.is_direct, p_msg->api_open.transport)) 716dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai { 7175a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini status = BTA_GATT_OK; 7185a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini 7195a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini if (GATT_GetConnIdIfConnected(p_rcb->gatt_if, p_msg->api_open.remote_bda, 7205a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini &conn_id, p_msg->api_open.transport)) 7215a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini { 7225a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini status = BTA_GATT_ALREADY_OPEN; 7239218687e4baaf0226ef16b58f78123d979711e5dJim Miller } 7249218687e4baaf0226ef16b58f78123d979711e5dJim Miller } 7259218687e4baaf0226ef16b58f78123d979711e5dJim Miller } 726751de372750336c2dbc6ed656de84b881ede0858Ricky Wai else 7278d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey { 7288d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_open.server_if); 7298d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey } 730751de372750336c2dbc6ed656de84b881ede0858Ricky Wai 731ae16e55dd5d93db547cbcdb848a98242db8ad9f7Kevin Chyn if (p_rcb && p_rcb->p_cback) 732751de372750336c2dbc6ed656de84b881ede0858Ricky Wai (*p_rcb->p_cback)(BTA_GATTS_OPEN_EVT, (tBTA_GATTS *)&status); 733ae16e55dd5d93db547cbcdb848a98242db8ad9f7Kevin Chyn 734751de372750336c2dbc6ed656de84b881ede0858Ricky Wai} 735751de372750336c2dbc6ed656de84b881ede0858Ricky Wai/******************************************************************************* 736751de372750336c2dbc6ed656de84b881ede0858Ricky Wai** 737751de372750336c2dbc6ed656de84b881ede0858Ricky Wai** Function bta_gatts_cancel_open 738751de372750336c2dbc6ed656de84b881ede0858Ricky Wai** 739751de372750336c2dbc6ed656de84b881ede0858Ricky Wai** Description 740751de372750336c2dbc6ed656de84b881ede0858Ricky Wai** 741751de372750336c2dbc6ed656de84b881ede0858Ricky Wai** Returns none. 742751de372750336c2dbc6ed656de84b881ede0858Ricky Wai** 743751de372750336c2dbc6ed656de84b881ede0858Ricky Wai*******************************************************************************/ 744751de372750336c2dbc6ed656de84b881ede0858Ricky Waivoid bta_gatts_cancel_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) 745751de372750336c2dbc6ed656de84b881ede0858Ricky Wai{ 746751de372750336c2dbc6ed656de84b881ede0858Ricky Wai tBTA_GATTS_RCB *p_rcb; 747751de372750336c2dbc6ed656de84b881ede0858Ricky Wai tBTA_GATT_STATUS status= BTA_GATT_ERROR; 748751de372750336c2dbc6ed656de84b881ede0858Ricky Wai UNUSED(p_cb); 749751de372750336c2dbc6ed656de84b881ede0858Ricky Wai 7509218687e4baaf0226ef16b58f78123d979711e5dJim Miller if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_cancel_open.server_if)) != NULL) 7519218687e4baaf0226ef16b58f78123d979711e5dJim Miller { 7529218687e4baaf0226ef16b58f78123d979711e5dJim Miller if (!GATT_CancelConnect(p_rcb->gatt_if, p_msg->api_cancel_open.remote_bda, 7539218687e4baaf0226ef16b58f78123d979711e5dJim Miller p_msg->api_cancel_open.is_direct)) 7549218687e4baaf0226ef16b58f78123d979711e5dJim Miller { 755b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani APPL_TRACE_ERROR("bta_gatts_cancel_open failed for open request"); 756b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani } 757b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani else 758b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani { 759b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani status= BTA_GATT_OK; 76034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri } 761788671647c6d615684d159a94ffb5b4367df6896Robin Lee } 76234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri else 76334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri { 76434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_cancel_open.server_if); 76534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri } 76638c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos 7678d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey if (p_rcb && p_rcb->p_cback) 7688d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey (*p_rcb->p_cback)(BTA_GATTS_CANCEL_OPEN_EVT, (tBTA_GATTS *)&status); 7698d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey} 7708d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey/******************************************************************************* 7718d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey** 7728d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey** Function bta_gatts_close 773788671647c6d615684d159a94ffb5b4367df6896Robin Lee** 774fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri** Description 7753bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang** 77634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri** Returns none. 77734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri** 77834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri*******************************************************************************/ 77934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarrivoid bta_gatts_close (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) 78034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri{ 78134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri tBTA_GATTS_RCB *p_rcb; 78234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri tBTA_GATT_STATUS status= BTA_GATT_ERROR; 78334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri tGATT_IF gatt_if; 78434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri BD_ADDR remote_bda; 78534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri tBTA_GATT_TRANSPORT transport; 7863bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 7873bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang UNUSED(p_cb); 78834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri 78934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri if (GATT_GetConnectionInfor(p_msg->hdr.layer_specific, &gatt_if, remote_bda, &transport)) 79034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri { 79134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri if (GATT_Disconnect(p_msg->hdr.layer_specific) != GATT_SUCCESS) 79234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri { 79334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri APPL_TRACE_ERROR("bta_gatts_close fail conn_id=%d", p_msg->hdr.layer_specific); 79434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri } 79534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri else 79634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri { 7973bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang status= BTA_GATT_OK; 7983bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 7993bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 800e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if); 80134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri 80234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri if (p_rcb && p_rcb->p_cback) 80334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri { 80434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri if (transport == BTA_TRANSPORT_BR_EDR) 80534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri bta_sys_conn_close( BTA_ID_GATTS ,BTA_ALL_APP_ID, remote_bda); 80634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri 80734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri (*p_rcb->p_cback)(BTA_GATTS_CLOSE_EVT, (tBTA_GATTS *)&status); 80834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri } 80934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri } 81034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri else 8113bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang { 81234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri APPL_TRACE_ERROR("Unknown connection ID: %d", p_msg->hdr.layer_specific); 81334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri } 81434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri 81534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri} 81634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri/******************************************************************************* 81734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri** 81834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri** Function bta_gatts_listen 81934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri** 82034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri** Description Start or stop listening for LE connection on a GATT server 82134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri** 8223bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang** Returns none. 8233bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang** 8243bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang*******************************************************************************/ 8253bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangvoid bta_gatts_listen(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) 826edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam{ 827edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam tBTA_GATTS_RCB *p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_listen.server_if); 8283bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang tBTA_GATTS cb_data; 8293bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang UNUSED(p_cb); 8303bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 8313bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang cb_data.reg_oper.status = BTA_GATT_OK; 8323bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang cb_data.reg_oper.server_if = p_msg->api_listen.server_if; 833edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam 834edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam if (p_rcb == NULL) 835edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam { 836edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam APPL_TRACE_ERROR("Unknown GATTS application"); 837edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam return; 838edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam } 839edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam 840edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam if (!GATT_Listen(p_msg->api_listen.server_if, 841edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam p_msg->api_listen.start, 842edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam p_msg->api_listen.remote_bda)) 843edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam { 844edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam cb_data.status = BTA_GATT_ERROR; 845edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam APPL_TRACE_ERROR("bta_gatts_listen Listen failed"); 846edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam } 847edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam 848edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam if (p_rcb->p_cback) 849edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam (*p_rcb->p_cback)(BTA_GATTS_LISTEN_EVT, &cb_data); 8503bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang} 851edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam 852edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam/******************************************************************************* 8533bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang** 8543bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang** Function bta_gatts_request_cback 8553bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang** 85634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri** Description GATTS attribute request callback. 85738c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos** 8583bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang** Returns none. 85934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri** 86034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri*******************************************************************************/ 8613bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangstatic void bta_gatts_send_request_cback (UINT16 conn_id, 8623bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang UINT32 trans_id, 8633bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data) 864ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang{ 8653bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang tBTA_GATTS cb_data; 86634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri tBTA_GATTS_RCB *p_rcb; 86738c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos tGATT_IF gatt_if; 8683bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang tBTA_GATT_TRANSPORT transport; 8693bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 87034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri memset(&cb_data, 0 , sizeof(tBTA_GATTS)); 87134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri 8723bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport)) 8733bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang { 8743bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if); 87534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri 87638c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos APPL_TRACE_DEBUG ("bta_gatts_send_request_cback conn_id=%d trans_id=%d req_type=%d", 8773bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang conn_id, trans_id, req_type); 8783bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 8793bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang if (p_rcb && p_rcb->p_cback) 8803bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang { 8813bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang /* if over BR_EDR, inform PM for mode change */ 8823bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang if (transport == BTA_TRANSPORT_BR_EDR) 8833bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang { 8843bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda); 8853bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda); 8863bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 8873bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 8883bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang cb_data.req_data.conn_id = conn_id; 8893bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang cb_data.req_data.trans_id = trans_id; 8903bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang cb_data.req_data.p_data = (tBTA_GATTS_REQ_DATA *)p_data; 8913bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 8923bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang (*p_rcb->p_cback)(req_type, &cb_data); 8933bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang } 8943bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang else 89534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri { 89638c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos APPL_TRACE_ERROR("connection request on gatt_if[%d] is not interested", gatt_if); 89738c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos } 898edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam } 899edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam else 900edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam { 901edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam APPL_TRACE_ERROR("request received on unknown connectino ID: %d", conn_id); 902edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam } 903edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam} 9043bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang 9053bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang/******************************************************************************* 906ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang** 907ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang** Function bta_gatts_conn_cback 908ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang** 909ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang** Description connection callback. 910ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang** 9113bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang** Returns none. 912abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn** 913abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn*******************************************************************************/ 914static void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, 915 BOOLEAN connected, tGATT_DISCONN_REASON reason, 916 tGATT_TRANSPORT transport) 917{ 918 tBTA_GATTS cb_data; 919 UINT8 evt = connected ? BTA_GATTS_CONNECT_EVT: BTA_GATTS_DISCONNECT_EVT; 920 tBTA_GATTS_RCB *p_reg; 921 922 APPL_TRACE_DEBUG ("bta_gatts_conn_cback gatt_if=%d conn_id=%d connected=%d reason = 0x%04d", 923 gatt_if, conn_id, connected, reason); 924 APPL_TRACE_DEBUG("bta_gatts_conn_cback bda :%02x-%02x-%02x-%02x-%02x-%02x ", 925 bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); 926 927 bt_bdaddr_t bdaddr; 928 bdcpy(bdaddr.address, bda); 929 if (connected) 930 btif_debug_conn_state(bdaddr, BTIF_DEBUG_CONNECTED, GATT_CONN_UNKNOWN); 931 else 932 btif_debug_conn_state(bdaddr, BTIF_DEBUG_DISCONNECTED, reason); 933 934 p_reg = bta_gatts_find_app_rcb_by_app_if(gatt_if); 935 936 if (p_reg && p_reg->p_cback) 937 { 938 /* there is no RM for GATT */ 939 if (transport == BTA_TRANSPORT_BR_EDR) 940 { 941 if (connected) 942 bta_sys_conn_open(BTA_ID_GATTS, BTA_ALL_APP_ID, bda); 943 else 944 bta_sys_conn_close( BTA_ID_GATTS ,BTA_ALL_APP_ID, bda); 945 } 946 947 cb_data.conn.conn_id = conn_id; 948 cb_data.conn.server_if = gatt_if; 949 cb_data.conn.reason = reason; 950 cb_data.conn.transport = transport; 951 memcpy(cb_data.conn.remote_bda, bda, BD_ADDR_LEN); 952 (*p_reg->p_cback)(evt, &cb_data); 953 } 954 else 955 { 956 APPL_TRACE_ERROR("bta_gatts_conn_cback server_if=%d not found",gatt_if); 957 } 958} 959 960/******************************************************************************* 961** 962** Function bta_gatts_cong_cback 963** 964** Description congestion callback. 965** 966** Returns none. 967** 968*******************************************************************************/ 969static void bta_gatts_cong_cback (UINT16 conn_id, BOOLEAN congested) 970{ 971 tBTA_GATTS_RCB *p_rcb; 972 tGATT_IF gatt_if; 973 tBTA_GATT_TRANSPORT transport; 974 tBTA_GATTS cb_data; 975 976 if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport)) 977 { 978 p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if); 979 980 if (p_rcb && p_rcb->p_cback) 981 { 982 cb_data.congest.conn_id = conn_id; 983 cb_data.congest.congested = congested; 984 985 (*p_rcb->p_cback)(BTA_GATTS_CONGEST_EVT, &cb_data); 986 } 987 } 988} 989#endif /* BTA_GATT_INCLUDED */ 990