15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2003-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains the GATT client utility function. 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2549120dc867c7818511b5afec461dfc97d17eef58Marie Janssen#define LOG_TAG "bt_bta_gattc" 2649120dc867c7818511b5afec461dfc97d17eef58Marie Janssen 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 32fa3c1214f5b006edced961a66c758b8b47b0f482Andre Eisenbach 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_gattc_int.h" 3449a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "bta_sys.h" 35fa3c1214f5b006edced961a66c758b8b47b0f482Andre Eisenbach#include "btcore/include/bdaddr.h" 36258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h" 376975b4d711142b885af479721cada448952c6b41Andre Eisenbach#include "l2c_api.h" 3849a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "utl.h" 3949a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Constants 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const UINT8 base_uuid[LEN_UUID_128] = {0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 476975b4d711142b885af479721cada448952c6b41Andre Eisenbachstatic const BD_ADDR dummy_bda = {0,0,0,0,0,0}; 486975b4d711142b885af479721cada448952c6b41Andre Eisenbach 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gatt_convert_uuid16_to_uuid128 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Convert a 16 bits UUID to be an standard 128 bits one. 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if two uuid match; FALSE otherwise. 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gatt_convert_uuid16_to_uuid128(UINT8 uuid_128[LEN_UUID_128], UINT16 uuid_16) 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = &uuid_128[LEN_UUID_128 - 4]; 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (uuid_128, base_uuid, LEN_UUID_128); 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, uuid_16); 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_uuid_compare 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Compare two UUID to see if they are the same. 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if two uuid match; FALSE otherwise. 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7526f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub PawlowskiBOOLEAN bta_gattc_uuid_compare (const tBT_UUID *p_src, const tBT_UUID *p_tar, BOOLEAN is_precise) 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 su[LEN_UUID_128], tu[LEN_UUID_128]; 7826f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski const UINT8 *ps, *pt; 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* any of the UUID is unspecified */ 816975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (p_src == 0 || p_tar == 0) 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_precise) 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If both are 16-bit, we can do a simple compare */ 906975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (p_src->len == 2 && p_tar->len == 2) 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 926975b4d711142b885af479721cada448952c6b41Andre Eisenbach return p_src->uu.uuid16 == p_tar->uu.uuid16; 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* One or both of the UUIDs is 128-bit */ 966975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (p_src->len == LEN_UUID_16) 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* convert a 16 bits UUID to 128 bits value */ 996975b4d711142b885af479721cada448952c6b41Andre Eisenbach bta_gatt_convert_uuid16_to_uuid128(su, p_src->uu.uuid16); 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps = su; 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1036975b4d711142b885af479721cada448952c6b41Andre Eisenbach ps = p_src->uu.uuid128; 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1056975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (p_tar->len == LEN_UUID_16) 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* convert a 16 bits UUID to 128 bits value */ 1086975b4d711142b885af479721cada448952c6b41Andre Eisenbach bta_gatt_convert_uuid16_to_uuid128(tu, p_tar->uu.uuid16); 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pt = tu; 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1126975b4d711142b885af479721cada448952c6b41Andre Eisenbach pt = p_tar->uu.uuid128; 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(memcmp(ps, pt, LEN_UUID_128) == 0); 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_cl_get_regcb 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description get registration control block by client interface. 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the regcb 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_GATTC_RCB * bta_gattc_cl_get_regcb(UINT8 client_if) 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i = 0; 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_RCB *p_clrcb = &bta_gattc_cb.cl_rcb[0]; 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTA_GATTC_CL_MAX; i ++, p_clrcb ++) 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clrcb->in_use && 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clrcb->client_if == client_if) 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_clrcb; 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return NULL; 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_num_reg_app 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description find the number of registered application. 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the regcb 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 bta_gattc_num_reg_app(void) 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i = 0, j = 0; 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTA_GATTC_CL_MAX; i ++) 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_gattc_cb.cl_rcb[i].in_use) 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project j ++; 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return j; 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_find_clcb_by_cif 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description get clcb by client interface and remote bd adddress 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the clcb 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1688fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi BattatBTA_GATTC_CLCB * bta_gattc_find_clcb_by_cif (UINT8 client_if, BD_ADDR remote_bda, 1698fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta tBTA_TRANSPORT transport) 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CLCB *p_clcb = &bta_gattc_cb.clcb[0]; 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++, p_clcb ++) 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb->in_use && 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->p_rcb->client_if == client_if && 1788fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_clcb->transport == transport && 179ce7b04f96f5e2a083ae46b56f5c69be306b72fc1Andre Eisenbach bdcmp(p_clcb->bda, remote_bda) == 0) 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_clcb; 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return NULL; 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_find_clcb_by_conn_id 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description get clcb by connection ID 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the clcb 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_GATTC_CLCB * bta_gattc_find_clcb_by_conn_id (UINT16 conn_id) 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CLCB *p_clcb = &bta_gattc_cb.clcb[0]; 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++, p_clcb ++) 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb->in_use && 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->bta_conn_id == conn_id) 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_clcb; 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return NULL; 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_clcb_alloc 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description allocate CLCB 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the clcb 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2168fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi BattatBTA_GATTC_CLCB * bta_gattc_clcb_alloc(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, 2178fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta tBTA_TRANSPORT transport) 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i_clcb = 0; 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CLCB *p_clcb = NULL; 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i_clcb = 0; i_clcb < BTA_GATTC_CLCB_MAX; i_clcb++) 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_gattc_cb.clcb[i_clcb].in_use) 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_GATT_DEBUG == TRUE 227e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_gattc_clcb_alloc: found clcb[%d] available",i_clcb); 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb = &bta_gattc_cb.clcb[i_clcb]; 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->in_use = TRUE; 231ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_clcb->status = BTA_GATT_OK; 2328fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_clcb->transport = transport; 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(p_clcb->bda, remote_bda); 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->p_rcb = bta_gattc_cl_get_regcb(client_if); 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_clcb->p_srcb = bta_gattc_find_srcb(remote_bda)) == NULL) 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->p_srcb = bta_gattc_srcb_alloc(remote_bda); 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb->p_rcb != NULL && p_clcb->p_srcb != NULL) 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->p_srcb->num_clcb ++; 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->p_rcb->num_clcb ++; 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* release this clcb if clcb or srcb allocation failed */ 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->in_use = FALSE; 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb = NULL; 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_clcb; 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_find_alloc_clcb 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description find or allocate CLCB if not found. 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the clcb 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2658fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi BattatBTA_GATTC_CLCB *bta_gattc_find_alloc_clcb(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, 2668fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta tBTA_TRANSPORT transport) 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CLCB *p_clcb ; 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2708fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if ((p_clcb = bta_gattc_find_clcb_by_cif(client_if, remote_bda, transport)) == NULL) 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2728fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_clcb = bta_gattc_clcb_alloc(client_if, remote_bda, transport); 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_clcb; 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_clcb_dealloc 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Deallocte a clcb 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the clcb 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_clcb_dealloc(tBTA_GATTC_CLCB *p_clcb) 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2886975b4d711142b885af479721cada448952c6b41Andre Eisenbach tBTA_GATTC_SERV *p_srcb = NULL; 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb) 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2926975b4d711142b885af479721cada448952c6b41Andre Eisenbach p_srcb = p_clcb->p_srcb; 293ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_srcb->num_clcb) 294ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_srcb->num_clcb --; 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb->p_rcb->num_clcb) 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->p_rcb->num_clcb --; 2986975b4d711142b885af479721cada448952c6b41Andre Eisenbach 2996975b4d711142b885af479721cada448952c6b41Andre Eisenbach /* if the srcb is no longer needed, reset the state */ 300ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ( p_srcb->num_clcb == 0) 301ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 302ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_srcb->connected = FALSE; 303ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_srcb->state = BTA_GATTC_SERV_IDLE; 3049291a71c28b2eedff2c1ad760ebe3b3c1f5a6a29Zhihai Xu p_srcb->mtu = 0; 305ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 307abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free_and_reset((void **)&p_clcb->p_q_cmd); 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_clcb, 0, sizeof(tBTA_GATTC_CLCB)); 30920524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov } else { 310e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_gattc_clcb_dealloc p_clcb=NULL"); 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_find_srcb 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 318ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description find server cache by remote bd address currently in use 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the server cache. 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_GATTC_SERV * bta_gattc_find_srcb(BD_ADDR bda) 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_SERV *p_srcb = &bta_gattc_cb.known_server[0]; 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX; i ++, p_srcb ++) 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srcb->in_use && bdcmp(p_srcb->server_bda, bda) == 0) 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_srcb; 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return NULL; 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 335ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 336ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 337ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 338ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function bta_gattc_find_srvr_cache 339ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 340ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description find server cache by remote bd address 341ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 342ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns pointer to the server cache. 343ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 344ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 345ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattatBTA_GATTC_SERV * bta_gattc_find_srvr_cache(BD_ADDR bda) 346ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 347ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTA_GATTC_SERV *p_srcb = &bta_gattc_cb.known_server[0]; 348ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 i; 349ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 350ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX; i ++, p_srcb ++) 351ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 352ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (bdcmp(p_srcb->server_bda, bda) == 0) 353ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return p_srcb; 354ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 355ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return NULL; 356ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_find_scb_by_cid 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description find server control block by connection ID 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the server cache. 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_GATTC_SERV * bta_gattc_find_scb_by_cid (UINT16 conn_id) 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id); 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb) 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_clcb->p_srcb; 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return NULL; 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_srcb_alloc 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description allocate server cache control block 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the server cache. 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_GATTC_SERV * bta_gattc_srcb_alloc(BD_ADDR bda) 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_SERV *p_tcb = &bta_gattc_cb.known_server[0], 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_recycle = NULL; 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN found = FALSE; 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX; i ++, p_tcb ++) 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_tcb->in_use) 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project found = TRUE; 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (!p_tcb->connected) 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_recycle = p_tcb; 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if not found, try to recycle one known device */ 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!found && !p_recycle) 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb = NULL; 407ce7b04f96f5e2a083ae46b56f5c69be306b72fc1Andre Eisenbach else if (!found && p_recycle) 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb = p_recycle; 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb != NULL) 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4124bdc3535a788dc708a1b6c364abf1ee594087494Jakub Pawlowski if (p_tcb->p_srvc_cache != NULL) 4134bdc3535a788dc708a1b6c364abf1ee594087494Jakub Pawlowski list_free(p_tcb->p_srvc_cache); 4144bdc3535a788dc708a1b6c364abf1ee594087494Jakub Pawlowski 415abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free_and_reset((void **)&p_tcb->p_srvc_list); 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_tcb, 0 , sizeof(tBTA_GATTC_SERV)); 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->in_use = TRUE; 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(p_tcb->server_bda, bda); 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_tcb; 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_enqueue 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description enqueue a client request in clcb. 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns success or failure. 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_gattc_enqueue(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43520c68408686ba4fd4d17e21957616e1c60a913b3Pavlin Radoslavov if (p_clcb->p_q_cmd == NULL) 43620c68408686ba4fd4d17e21957616e1c60a913b3Pavlin Radoslavov { 43720c68408686ba4fd4d17e21957616e1c60a913b3Pavlin Radoslavov p_clcb->p_q_cmd = p_data; 43820c68408686ba4fd4d17e21957616e1c60a913b3Pavlin Radoslavov return TRUE; 43920c68408686ba4fd4d17e21957616e1c60a913b3Pavlin Radoslavov } 44072658f48d653be0786ef924bb3abbf7df1ec6592Zhihai Xu 44120c68408686ba4fd4d17e21957616e1c60a913b3Pavlin Radoslavov APPL_TRACE_ERROR ("%s: already has a pending command!!", __func__); 44220c68408686ba4fd4d17e21957616e1c60a913b3Pavlin Radoslavov /* skip the callback now. ----- need to send callback ? */ 44320c68408686ba4fd4d17e21957616e1c60a913b3Pavlin Radoslavov return FALSE; 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 44590715aad34cdead03fc22bc18891c04838e90e87Mike J. Chen 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_check_notif_registry 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description check if the service notificaition has been registered. 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_gattc_check_notif_registry(tBTA_GATTC_RCB *p_clreg, tBTA_GATTC_SERV *p_srcb, 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_NOTIFY *p_notify) 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0 ; i < BTA_GATTC_NOTIF_REG_MAX; i ++) 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clreg->notif_reg[i].in_use && 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcmp(p_clreg->notif_reg[i].remote_bda, p_srcb->server_bda) == 0 && 46426f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski p_clreg->notif_reg[i].handle == p_notify->handle) 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 466e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Notification registered!"); 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_clear_notif_registration 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4775919554fe8e03b87a7c7724238481b85e9cf6630Jakub Pawlowski** Description Clear up the notification registration information by BD_ADDR. 4785919554fe8e03b87a7c7724238481b85e9cf6630Jakub Pawlowski** Where handle is between start_handle and end_handle, and 4795919554fe8e03b87a7c7724238481b85e9cf6630Jakub Pawlowski** start_handle and end_handle are boundaries of service 4805919554fe8e03b87a7c7724238481b85e9cf6630Jakub Pawlowski** containing characteristic. 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4855919554fe8e03b87a7c7724238481b85e9cf6630Jakub Pawlowskivoid bta_gattc_clear_notif_registration(tBTA_GATTC_SERV *p_srcb, UINT16 conn_id, 4865919554fe8e03b87a7c7724238481b85e9cf6630Jakub Pawlowski UINT16 start_handle, UINT16 end_handle) 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR remote_bda; 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_IF gatt_if; 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_RCB *p_clrcb ; 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 4928fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta tGATT_TRANSPORT transport; 4935919554fe8e03b87a7c7724238481b85e9cf6630Jakub Pawlowski UINT16 handle; 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4955919554fe8e03b87a7c7724238481b85e9cf6630Jakub Pawlowski if (GATT_GetConnectionInfor(conn_id, &gatt_if, remote_bda, &transport)) { 4965919554fe8e03b87a7c7724238481b85e9cf6630Jakub Pawlowski if ((p_clrcb = bta_gattc_cl_get_regcb(gatt_if)) != NULL) { 4975919554fe8e03b87a7c7724238481b85e9cf6630Jakub Pawlowski for (i = 0 ; i < BTA_GATTC_NOTIF_REG_MAX; i ++) { 4988fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if (p_clrcb->notif_reg[i].in_use && 4998fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta !bdcmp(p_clrcb->notif_reg[i].remote_bda, remote_bda)) 5005919554fe8e03b87a7c7724238481b85e9cf6630Jakub Pawlowski 5015919554fe8e03b87a7c7724238481b85e9cf6630Jakub Pawlowski /* It's enough to get service or characteristic handle, as 5025919554fe8e03b87a7c7724238481b85e9cf6630Jakub Pawlowski * clear boundaries are always around service. 5035919554fe8e03b87a7c7724238481b85e9cf6630Jakub Pawlowski */ 50426f8828cdb5f02b0b01bafaccd4ad0b0ba9d57abJakub Pawlowski handle = p_clrcb->notif_reg[i].handle; 5055919554fe8e03b87a7c7724238481b85e9cf6630Jakub Pawlowski if (handle >= start_handle && handle <= end_handle) 5065919554fe8e03b87a7c7724238481b85e9cf6630Jakub Pawlowski memset(&p_clrcb->notif_reg[i], 0, sizeof(tBTA_GATTC_NOTIF_REG)); 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5095919554fe8e03b87a7c7724238481b85e9cf6630Jakub Pawlowski } else { 510e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("can not clear indication/notif registration for unknown app"); 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_mark_bg_conn 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description mark background connection status when a bg connection is initiated 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or terminated. 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if success; FALSE otherwise. 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 525ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN bta_gattc_mark_bg_conn (tBTA_GATTC_IF client_if, BD_ADDR_PTR remote_bda_ptr, 526ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BOOLEAN add, BOOLEAN is_listen) 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_BG_TCK *p_bg_tck = &bta_gattc_cb.bg_track[0]; 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i = 0; 530ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTA_GATTC_CIF_MASK *p_cif_mask; 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX; i ++, p_bg_tck ++) 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bg_tck->in_use && 535ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ((remote_bda_ptr != NULL && bdcmp(p_bg_tck->remote_bda, remote_bda_ptr) == 0) || 5366975b4d711142b885af479721cada448952c6b41Andre Eisenbach (remote_bda_ptr == NULL && bdcmp(p_bg_tck->remote_bda, dummy_bda) == 0))) 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 538ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cif_mask = is_listen ? &p_bg_tck->cif_adv_mask : &p_bg_tck->cif_mask; 539ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (add) 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* mask on the cif bit */ 542ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *p_cif_mask |= (1 <<(client_if - 1)); 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 544ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 545ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (client_if != 0) 546ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *p_cif_mask &= (~(1 <<(client_if - 1))); 547ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 548ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *p_cif_mask = 0; 549ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 550ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* no BG connection for this device, make it available */ 551ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_bg_tck->cif_mask == 0 && p_bg_tck->cif_adv_mask == 0) 552ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 553ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memset(p_bg_tck, 0, sizeof(tBTA_GATTC_BG_TCK)); 554ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!add) 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 560fa3c1214f5b006edced961a66c758b8b47b0f482Andre Eisenbach if (remote_bda_ptr) 561fa3c1214f5b006edced961a66c758b8b47b0f482Andre Eisenbach { 562fa3c1214f5b006edced961a66c758b8b47b0f482Andre Eisenbach bdstr_t bdstr = {0}; 563fa3c1214f5b006edced961a66c758b8b47b0f482Andre Eisenbach APPL_TRACE_ERROR("%s unable to find the bg connection mask for: %s", __func__, 564fa3c1214f5b006edced961a66c758b8b47b0f482Andre Eisenbach bdaddr_to_string((bt_bdaddr_t *)remote_bda_ptr, bdstr, sizeof(bdstr))); 565fa3c1214f5b006edced961a66c758b8b47b0f482Andre Eisenbach } 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* adding a new device mask */ 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0, p_bg_tck = &bta_gattc_cb.bg_track[0]; 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i < BTA_GATTC_KNOWN_SR_MAX; i ++, p_bg_tck ++) 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_bg_tck->in_use) 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bg_tck->in_use = TRUE; 576ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (remote_bda_ptr) 577ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdcpy(p_bg_tck->remote_bda, remote_bda_ptr); 578ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 5796975b4d711142b885af479721cada448952c6b41Andre Eisenbach bdcpy(p_bg_tck->remote_bda, dummy_bda); 580ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 581ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cif_mask = is_listen ? &p_bg_tck->cif_adv_mask : &p_bg_tck->cif_mask; 582ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 583ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *p_cif_mask = (1 <<(client_if - 1)); 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 587e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("no available space to mark the bg connection status"); 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_check_bg_conn 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description check if this is a background connection background connection. 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if success; FALSE otherwise. 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 600ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN bta_gattc_check_bg_conn (tBTA_GATTC_IF client_if, BD_ADDR remote_bda, UINT8 role) 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC_BG_TCK *p_bg_tck = &bta_gattc_cb.bg_track[0]; 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i = 0; 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_bg_conn = FALSE; 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 606ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX && !is_bg_conn; i ++, p_bg_tck ++) 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bg_tck->in_use && 609ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (bdcmp(p_bg_tck->remote_bda, remote_bda) == 0 || 6106975b4d711142b885af479721cada448952c6b41Andre Eisenbach bdcmp(p_bg_tck->remote_bda, dummy_bda) == 0)) 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 612ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (((p_bg_tck->cif_mask &(1 <<(client_if - 1))) != 0) && 613ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta role == HCI_ROLE_MASTER) 614ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta is_bg_conn = TRUE; 615ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 616ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (((p_bg_tck->cif_adv_mask &(1 <<(client_if - 1))) != 0) && 617ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta role == HCI_ROLE_SLAVE) 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_bg_conn = TRUE; 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return is_bg_conn; 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_gattc_send_open_cback 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description send open callback 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_gattc_send_open_cback( tBTA_GATTC_RCB *p_clreg, tBTA_GATT_STATUS status, 6338fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta BD_ADDR remote_bda, UINT16 conn_id, 6348fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta tBTA_TRANSPORT transport, UINT16 mtu) 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_GATTC cb_data; 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clreg->p_cback) 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&cb_data, 0, sizeof(tBTA_GATTC)); 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.open.status = status; 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.open.client_if = p_clreg->client_if; 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.open.conn_id = conn_id; 6459291a71c28b2eedff2c1ad760ebe3b3c1f5a6a29Zhihai Xu cb_data.open.mtu = mtu; 6468fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta cb_data.open.transport = transport; 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(cb_data.open.remote_bda, remote_bda); 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_clreg->p_cback)(BTA_GATTC_OPEN_EVT, &cb_data); 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 652ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 653ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 654ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function bta_gattc_conn_alloc 655ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 656ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description allocate connection tracking spot 657ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 658ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns pointer to the clcb 659ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 660ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 661ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattatBTA_GATTC_CONN * bta_gattc_conn_alloc(BD_ADDR remote_bda) 662ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 663ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 i_conn = 0; 664ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTA_GATTC_CONN *p_conn = &bta_gattc_cb.conn_track[0]; 665ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 666ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (i_conn = 0; i_conn < BTA_GATTC_CONN_MAX; i_conn++, p_conn ++) 667ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 668ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!p_conn->in_use) 669ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 670ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BTA_GATT_DEBUG == TRUE 671e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_gattc_conn_alloc: found conn_track[%d] available",i_conn); 672ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 673ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_conn->in_use = TRUE; 674ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdcpy(p_conn->remote_bda, remote_bda); 675ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return p_conn; 676ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 677ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 678ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return NULL; 679ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 680ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 681ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 682ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 683ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function bta_gattc_conn_find 684ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 685ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description allocate connection tracking spot 686ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 687ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns pointer to the clcb 688ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 689ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 690ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattatBTA_GATTC_CONN * bta_gattc_conn_find(BD_ADDR remote_bda) 691ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 692ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 i_conn = 0; 693ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTA_GATTC_CONN *p_conn = &bta_gattc_cb.conn_track[0]; 694ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 695ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (i_conn = 0; i_conn < BTA_GATTC_CONN_MAX; i_conn++, p_conn ++) 696ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 697ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_conn->in_use && bdcmp(remote_bda, p_conn->remote_bda) == 0) 698ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 699ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BTA_GATT_DEBUG == TRUE 700e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_gattc_conn_find: found conn_track[%d] matched",i_conn); 701ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 702ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return p_conn; 703ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 704ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 705ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return NULL; 706ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 708ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 709ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 710ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function bta_gattc_conn_find_alloc 711ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 712ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description find or allocate connection tracking spot 713ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 714ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns pointer to the clcb 715ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 716ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 717ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattatBTA_GATTC_CONN * bta_gattc_conn_find_alloc(BD_ADDR remote_bda) 718ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 719ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTA_GATTC_CONN *p_conn = bta_gattc_conn_find (remote_bda); 720ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 721ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_conn == NULL) 722ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 723ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_conn = bta_gattc_conn_alloc(remote_bda); 724ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 725ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return p_conn; 726ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 728ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 729ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 730ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function bta_gattc_conn_dealloc 731ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 732ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description de-allocate connection tracking spot 733ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 734ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns pointer to the clcb 735ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 736ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 737ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN bta_gattc_conn_dealloc(BD_ADDR remote_bda) 738ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 739ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTA_GATTC_CONN *p_conn = bta_gattc_conn_find (remote_bda); 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 741ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_conn != NULL) 742ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 743ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_conn->in_use = FALSE; 744ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memset(p_conn->remote_bda, 0, BD_ADDR_LEN); 745ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return TRUE; 746ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 747ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return FALSE; 748ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7506975b4d711142b885af479721cada448952c6b41Andre Eisenbach/******************************************************************************* 7516975b4d711142b885af479721cada448952c6b41Andre Eisenbach** 7526975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Function bta_gattc_find_int_conn_clcb 7536975b4d711142b885af479721cada448952c6b41Andre Eisenbach** 7546975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Description try to locate a clcb when an internal connecion event arrives. 7556975b4d711142b885af479721cada448952c6b41Andre Eisenbach** 7566975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Returns pointer to the clcb 7576975b4d711142b885af479721cada448952c6b41Andre Eisenbach** 7586975b4d711142b885af479721cada448952c6b41Andre Eisenbach*******************************************************************************/ 7596975b4d711142b885af479721cada448952c6b41Andre EisenbachtBTA_GATTC_CLCB * bta_gattc_find_int_conn_clcb(tBTA_GATTC_DATA *p_msg) 7606975b4d711142b885af479721cada448952c6b41Andre Eisenbach{ 7616975b4d711142b885af479721cada448952c6b41Andre Eisenbach tBTA_GATTC_CLCB *p_clcb = NULL; 7626975b4d711142b885af479721cada448952c6b41Andre Eisenbach 7636975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (p_msg->int_conn.role == HCI_ROLE_SLAVE) 7646975b4d711142b885af479721cada448952c6b41Andre Eisenbach bta_gattc_conn_find_alloc(p_msg->int_conn.remote_bda); 7656975b4d711142b885af479721cada448952c6b41Andre Eisenbach 7666975b4d711142b885af479721cada448952c6b41Andre Eisenbach /* try to locate a logic channel */ 7676975b4d711142b885af479721cada448952c6b41Andre Eisenbach if ((p_clcb = bta_gattc_find_clcb_by_cif(p_msg->int_conn.client_if, 7688fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_msg->int_conn.remote_bda, 7698fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_msg->int_conn.transport)) == NULL) 7706975b4d711142b885af479721cada448952c6b41Andre Eisenbach { 7716975b4d711142b885af479721cada448952c6b41Andre Eisenbach /* for a background connection or listening connection */ 7728fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if (/*p_msg->int_conn.role == HCI_ROLE_SLAVE || */ 7736975b4d711142b885af479721cada448952c6b41Andre Eisenbach bta_gattc_check_bg_conn(p_msg->int_conn.client_if, 7746975b4d711142b885af479721cada448952c6b41Andre Eisenbach p_msg->int_conn.remote_bda, 7756975b4d711142b885af479721cada448952c6b41Andre Eisenbach p_msg->int_conn.role)) 7766975b4d711142b885af479721cada448952c6b41Andre Eisenbach { 7776975b4d711142b885af479721cada448952c6b41Andre Eisenbach /* allocate a new channel */ 7788fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_clcb = bta_gattc_clcb_alloc(p_msg->int_conn.client_if, 7798fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_msg->int_conn.remote_bda, 7808fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_msg->int_conn.transport); 7816975b4d711142b885af479721cada448952c6b41Andre Eisenbach } 7826975b4d711142b885af479721cada448952c6b41Andre Eisenbach } 7836975b4d711142b885af479721cada448952c6b41Andre Eisenbach return p_clcb; 7846975b4d711142b885af479721cada448952c6b41Andre Eisenbach} 7856975b4d711142b885af479721cada448952c6b41Andre Eisenbach 7866975b4d711142b885af479721cada448952c6b41Andre Eisenbach/******************************************************************************* 7876975b4d711142b885af479721cada448952c6b41Andre Eisenbach** 7886975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Function bta_gattc_find_int_disconn_clcb 7896975b4d711142b885af479721cada448952c6b41Andre Eisenbach** 7906975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Description try to locate a clcb when an internal disconnect callback arrives. 7916975b4d711142b885af479721cada448952c6b41Andre Eisenbach** 7926975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Returns pointer to the clcb 7936975b4d711142b885af479721cada448952c6b41Andre Eisenbach** 7946975b4d711142b885af479721cada448952c6b41Andre Eisenbach*******************************************************************************/ 7956975b4d711142b885af479721cada448952c6b41Andre EisenbachtBTA_GATTC_CLCB * bta_gattc_find_int_disconn_clcb(tBTA_GATTC_DATA *p_msg) 7966975b4d711142b885af479721cada448952c6b41Andre Eisenbach{ 7976975b4d711142b885af479721cada448952c6b41Andre Eisenbach tBTA_GATTC_CLCB *p_clcb = NULL; 7986975b4d711142b885af479721cada448952c6b41Andre Eisenbach 7996975b4d711142b885af479721cada448952c6b41Andre Eisenbach bta_gattc_conn_dealloc(p_msg->int_conn.remote_bda); 8007ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham if ((p_clcb = bta_gattc_find_clcb_by_conn_id(p_msg->int_conn.hdr.layer_specific)) == NULL) 8016975b4d711142b885af479721cada448952c6b41Andre Eisenbach { 8027ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham /* connection attempt failed, send connection callback event */ 8036975b4d711142b885af479721cada448952c6b41Andre Eisenbach p_clcb = bta_gattc_find_clcb_by_cif(p_msg->int_conn.client_if, 8048fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_msg->int_conn.remote_bda, 8058fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_msg->int_conn.transport); 8066975b4d711142b885af479721cada448952c6b41Andre Eisenbach } 8077ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham if (p_clcb == NULL) 8086975b4d711142b885af479721cada448952c6b41Andre Eisenbach { 809e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" disconnection ID: [%d] not used by BTA", 8108fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_msg->int_conn.hdr.layer_specific); 8116975b4d711142b885af479721cada448952c6b41Andre Eisenbach } 8126975b4d711142b885af479721cada448952c6b41Andre Eisenbach return p_clcb; 8136975b4d711142b885af479721cada448952c6b41Andre Eisenbach} 8146975b4d711142b885af479721cada448952c6b41Andre Eisenbach 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_GATT_INCLUDED */ 816