15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2009-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 GATT utility functions 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 255cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include <string.h> 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "stdio.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "gki.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "l2cdefs.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "gatt_int.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "gatt_api.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "gattdefs.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "sdp_api.h" 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "btm_int.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* check if [x, y] and [a, b] have overlapping range */ 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #define GATT_VALIDATE_HANDLE_RANGE(x, y, a, b) (y >= a && x <= b) 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #define GATT_GET_NEXT_VALID_HANDLE(x) (((x)/10 + 1) * 10) 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst char * const op_code_name[] = 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "UNKNOWN", 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_RSP_ERROR", 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_REQ_MTU", 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_RSP_MTU", 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_REQ_READ_INFO", 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_RSP_READ_INFO", 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_REQ_FIND_TYPE_VALUE", 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_RSP_FIND_TYPE_VALUE", 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_REQ_READ_BY_TYPE", 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_RSP_READ_BY_TYPE", 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_REQ_READ", 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_RSP_READ", 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_REQ_READ_BLOB", 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_RSP_READ_BLOB", 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "GATT_REQ_READ_MULTI", 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "GATT_RSP_READ_MULTI", 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "GATT_REQ_READ_BY_GRP_TYPE", 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "GATT_RSP_READ_BY_GRP_TYPE", 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_REQ_WRITE", 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_RSP_WRITE", 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_CMD_WRITE", 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_SIGN_CMD_WRITE", 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_REQ_PREPARE_WRITE", 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_RSP_PREPARE_WRITE", 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_REQ_EXEC_WRITE", 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_RSP_EXEC_WRITE", 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "Reserved", 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_HANDLE_VALUE_NOTIF", 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "Reserved", 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_HANDLE_VALUE_IND", 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_HANDLE_VALUE_CONF", 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "ATT_OP_CODE_MAX" 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const UINT8 base_uuid[LEN_UUID_128] = {0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_free_pending_ind 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Free all pending indications 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_free_pending_ind(tGATT_TCB *p_tcb) 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 94b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_free_pending_ind"); 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* release all queued indications */ 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_tcb->pending_ind_q.p_first) 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (GKI_dequeue (&p_tcb->pending_ind_q)); 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 102ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gatt_free_pending_enc_queue 103ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 104ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Free all buffers in pending encyption queue 105ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 106ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns None 107ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 108ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 109ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid gatt_free_pending_enc_queue(tGATT_TCB *p_tcb) 110ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 111b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_free_pending_enc_queue"); 112ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* release all queued indications */ 113ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta while (p_tcb->pending_enc_clcb.p_first) 114ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_freebuf (GKI_dequeue (&p_tcb->pending_enc_clcb)); 115ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 116ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 117ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 118ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_delete_dev_from_srv_chg_clt_list 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Delete a device from the service changed client lit 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_delete_dev_from_srv_chg_clt_list(BD_ADDR bd_addr) 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_SRV_CHG *p_buf; 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_SRV_CHG_REQ req; 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 131b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("gatt_delete_dev_from_srv_chg_clt_list"); 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = gatt_is_bda_in_the_srv_chg_clt_list(bd_addr)) != NULL) 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_cb.cb_info.p_srv_chg_callback) 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* delete from NV */ 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(req.srv_chg.bda, bd_addr, BD_ADDR_LEN); 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_REMOVE_CLIENT,&req, NULL); 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (GKI_remove_from_queue (&gatt_cb.srv_chg_clt_q, p_buf)); 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_set_srv_chg 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Set the service changed flag to TRUE 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_set_srv_chg(void) 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_SRV_CHG *p_buf = (tGATTS_SRV_CHG *)GKI_getfirst(&gatt_cb.srv_chg_clt_q); 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_SRV_CHG_REQ req; 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 159b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("gatt_set_srv_chg"); 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_buf) 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 162b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("found a srv_chg clt"); 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_buf->srv_changed) 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 165b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("set srv_changed to TRUE"); 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->srv_changed= TRUE; 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&req.srv_chg, p_buf, sizeof(tGATTS_SRV_CHG)); 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_cb.cb_info.p_srv_chg_callback) 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_UPDATE_CLIENT,&req, NULL); 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf = (tGATTS_SRV_CHG *)GKI_getnext(p_buf); 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_sr_is_new_srv_chg 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Find the app id in on the new service changed list 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the found new service changed item othwerwise NULL 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATTS_PENDING_NEW_SRV_START *gatt_sr_is_new_srv_chg(tBT_UUID *p_app_uuid128, tBT_UUID *p_svc_uuid, UINT16 svc_inst) 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_HNDL_RANGE *p; 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_PENDING_NEW_SRV_START *p_buf = (tGATTS_PENDING_NEW_SRV_START *)GKI_getfirst(&gatt_cb.pending_new_srv_start_q); 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_buf != NULL) 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = p_buf->p_new_srv_start; 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( gatt_uuid_compare (*p_app_uuid128, p->app_uuid128) 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && gatt_uuid_compare (*p_svc_uuid, p->svc_uuid) 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (svc_inst == p->svc_inst) ) 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 196b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("gatt_sr_is_new_srv_chg: Yes"); 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf = (tGATTS_PENDING_NEW_SRV_START *)GKI_getnext(p_buf); 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_add_pending_ind 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Add a pending indication 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the current pending indication buffer, NULL no buffer available 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_VALUE *gatt_add_pending_ind(tGATT_TCB *p_tcb, tGATT_VALUE *p_ind) 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_VALUE *p_buf; 218b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("gatt_add_pending_ind"); 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (tGATT_VALUE *)GKI_getbuf((UINT16)sizeof(tGATT_VALUE))) != NULL) 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 221b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("enqueue a pending indication"); 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_buf, p_ind, sizeof(tGATT_VALUE)); 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enqueue (&p_tcb->pending_ind_q, p_buf); 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_add_pending_new_srv_start 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Add a pending new srv start to the new service start queue 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the new service start buffer, NULL no buffer available 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATTS_PENDING_NEW_SRV_START *gatt_add_pending_new_srv_start(tGATTS_HNDL_RANGE *p_new_srv_start) 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_PENDING_NEW_SRV_START *p_buf; 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 242b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("gatt_add_pending_new_srv_start"); 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (tGATTS_PENDING_NEW_SRV_START *)GKI_getbuf((UINT16)sizeof(tGATTS_PENDING_NEW_SRV_START))) != NULL) 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 245b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("enqueue a new pending new srv start"); 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->p_new_srv_start = p_new_srv_start; 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enqueue (&gatt_cb.pending_new_srv_start_q, p_buf); 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_add_srv_chg_clt 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Add a service chnage client to the service change client queue 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the service change client buffer; Null no buffer available 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATTS_SRV_CHG *gatt_add_srv_chg_clt(tGATTS_SRV_CHG *p_srv_chg) 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_SRV_CHG *p_buf; 265b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("gatt_add_srv_chg_clt"); 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (tGATTS_SRV_CHG *)GKI_getbuf((UINT16)sizeof(tGATTS_SRV_CHG))) != NULL) 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 268b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("enqueue a srv chg client"); 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_buf, p_srv_chg, sizeof(tGATTS_SRV_CHG)); 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enqueue (&gatt_cb.srv_chg_clt_q, p_buf); 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 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 gatt_alloc_hdl_buffer 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Allocate a handle buufer 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the allocated buffer, NULL no buffer available 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_HDL_LIST_ELEM *gatt_alloc_hdl_buffer(void) 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_CB *p_cb = &gatt_cb; 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_HDL_LIST_ELEM * p_elem= &p_cb->hdl_list[0]; 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_SR_PROFILES; i++, p_elem ++) 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_cb->hdl_list[i].in_use) 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_elem, 0, sizeof(tGATT_HDL_LIST_ELEM)); 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_elem->in_use = TRUE; 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_elem; 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return NULL; 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_find_hdl_buffer_by_handle 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Find handle range buffer by service handle. 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the buffer, NULL no buffer available 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_HDL_LIST_ELEM *gatt_find_hdl_buffer_by_handle(UINT16 handle) 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_HDL_LIST_INFO *p_list_info= &gatt_cb.hdl_list_info; 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_HDL_LIST_ELEM *p_list = NULL; 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list = p_list_info->p_first; 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_list != NULL) 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_list->in_use && p_list->asgn_range.s_handle == handle) 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_list); 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list = p_list->p_next; 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return NULL; 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_find_hdl_buffer_by_app_id 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Find handle range buffer by app ID, service and service instance ID. 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the buffer, NULL no buffer available 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_HDL_LIST_ELEM *gatt_find_hdl_buffer_by_app_id (tBT_UUID *p_app_uuid128, 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID *p_svc_uuid, 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 svc_inst) 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_HDL_LIST_INFO *p_list_info= &gatt_cb.hdl_list_info; 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_HDL_LIST_ELEM *p_list = NULL; 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list = p_list_info->p_first; 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_list != NULL) 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( gatt_uuid_compare (*p_app_uuid128, p_list->asgn_range.app_uuid128) 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && gatt_uuid_compare (*p_svc_uuid, p_list->asgn_range.svc_uuid) 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (svc_inst == p_list->asgn_range.svc_inst) ) 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 355b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("Already allocated handles for this service before!!"); 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_list); 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list = p_list->p_next; 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return NULL; 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_free_hdl_buffer 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description free a handle buffer 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_free_hdl_buffer(tGATT_HDL_LIST_ELEM *p) 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p) 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p->svc_db.svc_buffer.p_first) 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (GKI_dequeue (&p->svc_db.svc_buffer)); 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p, 0, sizeof(tGATT_HDL_LIST_ELEM)); 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_free_srvc_db_buffer_app_id 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description free the service attribute database buffers by the owner of the 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** service app ID. 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_free_srvc_db_buffer_app_id(tBT_UUID *p_app_id) 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_HDL_LIST_ELEM *p_elem = &gatt_cb.hdl_list[0]; 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_SR_PROFILES; i ++, p_elem ++) 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp(p_app_id, &p_elem->asgn_range.app_uuid128, sizeof(tBT_UUID)) == 0) 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_elem->svc_db.svc_buffer.p_first) 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (GKI_dequeue (&p_elem->svc_db.svc_buffer)); 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_elem->svc_db.mem_free = 0; 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_elem->svc_db.p_attr_list = p_elem->svc_db.p_free_mem = NULL; 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_is_last_attribute 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Check this is the last attribute of the specified value or not 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE - yes this is the last attribute 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_is_last_attribute(tGATT_SRV_LIST_INFO *p_list, tGATT_SRV_LIST_ELEM *p_start, tBT_UUID value) 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SRV_LIST_ELEM *p_srv= p_start->p_next; 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_last_attribute = TRUE; 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SR_REG *p_rcb = NULL; 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID *p_svc_uuid; 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->p_last_primary = NULL; 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_srv) 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb = GATT_GET_SR_REG_PTR(p_srv->i_sreg); 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_svc_uuid = gatts_get_service_uuid (p_rcb->p_db); 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_uuid_compare(value, *p_svc_uuid)) 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_last_attribute = FALSE; 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srv = p_srv->p_next; 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return is_last_attribute; 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_update_last_pri_srv_info 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Update the the last primary info for the service list info 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_update_last_pri_srv_info(tGATT_SRV_LIST_INFO *p_list) 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SRV_LIST_ELEM *p_srv= p_list->p_first; 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->p_last_primary = NULL; 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_srv) 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srv->is_primary) 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->p_last_primary = p_srv; 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srv = p_srv->p_next; 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatts_update_srv_list_elem 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description update an element in the service list. 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatts_update_srv_list_elem(UINT8 i_sreg, UINT16 handle, BOOLEAN is_primary) 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4815cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(handle); 4825cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.srv_list[i_sreg].in_use = TRUE; 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.srv_list[i_sreg].i_sreg = i_sreg; 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.srv_list[i_sreg].s_hdl = gatt_cb.sr_reg[i_sreg].s_hdl; 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.srv_list[i_sreg].is_primary = is_primary; 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_add_a_srv_to_list 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description add an service to the list in ascending 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** order of the start handle 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BOOLEAN TRUE-if add is successful 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_add_a_srv_to_list(tGATT_SRV_LIST_INFO *p_list, tGATT_SRV_LIST_ELEM *p_new) 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SRV_LIST_ELEM *p_old; 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_new) 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 506b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("p_new==NULL"); 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_list->p_first) 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this is an empty list */ 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->p_first = 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->p_last = p_new; 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_new->p_next = 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_new->p_prev = NULL; 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_old = p_list->p_first; 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (1) 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_old == NULL) 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->p_last->p_next = p_new; 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_new->p_prev = p_list->p_last; 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_new->p_next = NULL; 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->p_last = p_new; 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_new->s_hdl < p_old->s_hdl) 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if not the first in list */ 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_old->p_prev != NULL) 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_old->p_prev->p_next = p_new; 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->p_first = p_new; 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_new->p_prev = p_old->p_prev; 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_new->p_next = p_old; 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_old->p_prev = p_new; 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_old = p_old->p_next; 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->count++; 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_update_last_pri_srv_info(p_list); 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_remove_a_srv_from_list 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Remove a service from the list 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BOOLEAN TRUE-if remove is successful 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_remove_a_srv_from_list(tGATT_SRV_LIST_INFO *p_list, tGATT_SRV_LIST_ELEM *p_remove) 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_remove || !p_list->p_first) 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 570b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("p_remove==NULL || p_list->p_first==NULL"); 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_remove->p_prev == NULL) 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->p_first = p_remove->p_next; 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_remove->p_next) 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_remove->p_next->p_prev = NULL; 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_remove->p_next == NULL) 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->p_last = p_remove->p_prev; 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_remove->p_prev->p_next = NULL; 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_remove->p_next->p_prev = p_remove->p_prev; 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_remove->p_prev->p_next = p_remove->p_next; 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->count--; 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_update_last_pri_srv_info(p_list); 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_add_an_item_to_list 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description add an service handle range to the list in decending 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** order of the start handle 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BOOLEAN TRUE-if add is successful 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_add_an_item_to_list(tGATT_HDL_LIST_INFO *p_list, tGATT_HDL_LIST_ELEM *p_new) 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_HDL_LIST_ELEM *p_old; 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_new) 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 611b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("p_new==NULL"); 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_list->p_first) 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this is an empty list */ 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->p_first = 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->p_last = p_new; 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_new->p_next = 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_new->p_prev = NULL; 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_old = p_list->p_first; 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (1) 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_old == NULL) 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->p_last->p_next = p_new; 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_new->p_prev = p_list->p_last; 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_new->p_next = NULL; 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->p_last = p_new; 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_new->asgn_range.s_handle > p_old->asgn_range.s_handle) 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_old == p_list->p_first) 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->p_first = p_new; 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_new->p_prev = p_old->p_prev; 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_new->p_next = p_old; 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_old->p_prev = p_new; 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_old = p_old->p_next; 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->count++; 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_remove_an_item_from_list 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Remove an service handle range from the list 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BOOLEAN TRUE-if remove is successful 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_remove_an_item_from_list(tGATT_HDL_LIST_INFO *p_list, tGATT_HDL_LIST_ELEM *p_remove) 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_remove || !p_list->p_first) 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 674b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("p_remove==NULL || p_list->p_first==NULL"); 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_remove->p_prev == NULL) 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->p_first = p_remove->p_next; 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_remove->p_next) 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_remove->p_next->p_prev = NULL; 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_remove->p_next == NULL) 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->p_last = p_remove->p_prev; 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_remove->p_prev->p_next = NULL; 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_remove->p_next->p_prev = p_remove->p_prev; 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_remove->p_prev->p_next = p_remove->p_next; 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->count--; 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_find_the_connected_bda 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function find the connected bda 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if found 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7088fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi BattaBOOLEAN gatt_find_the_connected_bda(UINT8 start_idx, BD_ADDR bda, UINT8 *p_found_idx, 7098fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta tBT_TRANSPORT *p_transport) 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN found = FALSE; 713b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_find_the_connected_bda start_idx=%d",start_idx); 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = start_idx ; i < GATT_MAX_PHY_CHANNEL; i ++) 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7176975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (gatt_cb.tcb[i].in_use && gatt_cb.tcb[i].ch_state == GATT_CH_OPEN) 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy( bda, gatt_cb.tcb[i].peer_bda, BD_ADDR_LEN); 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_found_idx = i; 7218fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta *p_transport = gatt_cb.tcb[i].transport; 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project found = TRUE; 723b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_find_the_connected_bda bda :%02x-%02x-%02x-%02x-%02x-%02x", 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 728b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_find_the_connected_bda found=%d found_idx=%d", found, i); 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return found; 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_is_srv_chg_ind_pending 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Check whether a service chnaged is in the indication pending queue 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or waiting for an Ack already 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BOOLEAN 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_is_srv_chg_ind_pending (tGATT_TCB *p_tcb) 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_VALUE *p_buf = (tGATT_VALUE *)GKI_getfirst(&p_tcb->pending_ind_q); 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN srv_chg_ind_pending = FALSE; 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 749b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_is_srv_chg_ind_pending is_queue_empty=%d", GKI_queue_is_empty(&p_tcb->pending_ind_q) ); 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->indicate_handle == gatt_cb.handle_of_h_r) 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project srv_chg_ind_pending = TRUE; 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_buf) 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf->handle == gatt_cb.handle_of_h_r) 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project srv_chg_ind_pending = TRUE; 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf = (tGATT_VALUE *)GKI_getnext(p_buf); 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 768b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("srv_chg_ind_pending = %d", srv_chg_ind_pending); 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return srv_chg_ind_pending; 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_is_bda_in_the_srv_chg_clt_list 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function check the specified bda is in the srv chg clinet list or not 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the found elemenet otherwise NULL 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATTS_SRV_CHG *gatt_is_bda_in_the_srv_chg_clt_list (BD_ADDR bda) 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_SRV_CHG *p_buf = (tGATTS_SRV_CHG *)GKI_getfirst(&gatt_cb.srv_chg_clt_q); 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 786b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_is_bda_in_the_srv_chg_clt_list :%02x-%02x-%02x-%02x-%02x-%02x", 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_buf != NULL) 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!memcmp( bda, p_buf->bda, BD_ADDR_LEN)) 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 793b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("bda is in the srv chg clt list"); 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf = (tGATTS_SRV_CHG *)GKI_getnext(p_buf); 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_is_bda_connected 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GATT_INDEX_INVALID if not found. Otherwise index to the tcb. 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_is_bda_connected(BD_ADDR bda) 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i = 0; 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN connected=FALSE; 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for ( i=0; i < GATT_MAX_PHY_CHANNEL; i ++) 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_cb.tcb[i].in_use && 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !memcmp(gatt_cb.tcb[i].peer_bda, bda, BD_ADDR_LEN)) 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project connected = TRUE; 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return connected; 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_find_i_tcb_by_addr 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function searches for an empty tcb entry, and return the index. 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GATT_INDEX_INVALID if not found. Otherwise index to the tcb. 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8388fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi BattaUINT8 gatt_find_i_tcb_by_addr(BD_ADDR bda, tBT_TRANSPORT transport) 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8408fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta UINT8 i = 0; 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for ( ; i < GATT_MAX_PHY_CHANNEL; i ++) 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8448fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if (!memcmp(gatt_cb.tcb[i].peer_bda, bda, BD_ADDR_LEN) && 8458fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta gatt_cb.tcb[i].transport == transport) 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8478fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta return i; 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8508fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta return GATT_INDEX_INVALID; 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_get_tcb_by_idx 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function get TCB using the TCB index 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns NULL if not found. Otherwise index to the tcb. 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_TCB * gatt_get_tcb_by_idx(UINT8 tcb_idx) 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb = NULL; 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (tcb_idx < GATT_MAX_PHY_CHANNEL) && gatt_cb.tcb[tcb_idx].in_use) 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb = &gatt_cb.tcb[tcb_idx]; 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_tcb; 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_find_tcb_by_addr 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function searches for an empty tcb entry, and return pointer. 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns NULL if not found. Otherwise index to the tcb. 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8828fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi BattatGATT_TCB * gatt_find_tcb_by_addr(BD_ADDR bda, tBT_TRANSPORT transport) 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb = NULL; 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i = 0; 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8878fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if ((i = gatt_find_i_tcb_by_addr(bda, transport)) != GATT_INDEX_INVALID) 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb = &gatt_cb.tcb[i]; 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_tcb; 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_find_i_tcb_free 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function searches for an empty tcb entry, and return the index. 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GATT_INDEX_INVALID if not found. Otherwise index to the tcb. 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_find_i_tcb_free(void) 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i = 0, j = GATT_INDEX_INVALID; 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_PHY_CHANNEL; i ++) 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!gatt_cb.tcb[i].in_use) 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project j = i; 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return j; 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_allocate_tcb_by_bdaddr 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function locate or allocate new tcb entry for matching bda. 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GATT_INDEX_INVALID if not found. Otherwise index to the tcb. 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9248fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi BattatGATT_TCB * gatt_allocate_tcb_by_bdaddr(BD_ADDR bda, tBT_TRANSPORT transport) 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i = 0; 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN allocated = FALSE; 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb = NULL; 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* search for existing tcb with matching bda */ 9318fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta i = gatt_find_i_tcb_by_addr(bda, transport); 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* find free tcb */ 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (i == GATT_INDEX_INVALID) 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i = gatt_find_i_tcb_free(); 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project allocated = TRUE; 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (i != GATT_INDEX_INVALID) 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb = &gatt_cb.tcb[i]; 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (allocated) 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_tcb, 0, sizeof(tGATT_TCB)); 945ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_init_q (&p_tcb->pending_enc_clcb); 946ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_init_q (&p_tcb->pending_ind_q); 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->in_use = TRUE; 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->tcb_idx = i; 9498fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_tcb->transport = transport; 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_tcb->peer_bda, bda, BD_ADDR_LEN); 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_tcb; 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_convert_uuid16_to_uuid128 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Convert a 16 bits UUID to be an standard 128 bits one. 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if two uuid match; FALSE otherwise. 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_convert_uuid16_to_uuid128(UINT8 uuid_128[LEN_UUID_128], UINT16 uuid_16) 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = &uuid_128[LEN_UUID_128 - 4]; 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (uuid_128, base_uuid, LEN_UUID_128); 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, uuid_16); 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9768fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** Function gatt_convert_uuid32_to_uuid128 9778fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** 9788fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** Description Convert a 32 bits UUID to be an standard 128 bits one. 9798fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** 9808fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** Returns TRUE if two uuid match; FALSE otherwise. 9818fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** 9828fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta*******************************************************************************/ 9838fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Battavoid gatt_convert_uuid32_to_uuid128(UINT8 uuid_128[LEN_UUID_128], UINT32 uuid_32) 9848fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta{ 9858fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta UINT8 *p = &uuid_128[LEN_UUID_128 - 4]; 9868fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta 9878fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta memcpy (uuid_128, base_uuid, LEN_UUID_128); 9888fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta 9898fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta UINT32_TO_STREAM(p, uuid_32); 9908fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta} 9918fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta/******************************************************************************* 9928fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_uuid_compare 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Compare two UUID to see if they are the same. 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if two uuid match; FALSE otherwise. 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_uuid_compare (tBT_UUID src, tBT_UUID tar) 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 su[LEN_UUID_128], tu[LEN_UUID_128]; 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *ps, *pt; 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* any of the UUID is unspecified */ 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (src.len == 0 || tar.len == 0) 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If both are 16-bit, we can do a simple compare */ 10128fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if (src.len == LEN_UUID_16 && tar.len == LEN_UUID_16) 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return src.uu.uuid16 == tar.uu.uuid16; 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10178fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta /* If both are 32-bit, we can do a simple compare */ 10188fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if (src.len == LEN_UUID_32 && tar.len == LEN_UUID_32) 10198fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta { 10208fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta return src.uu.uuid32 == tar.uu.uuid32; 10218fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta } 10228fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* One or both of the UUIDs is 128-bit */ 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (src.len == LEN_UUID_16) 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* convert a 16 bits UUID to 128 bits value */ 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_convert_uuid16_to_uuid128(su, src.uu.uuid16); 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps = su; 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10308fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta else if (src.len == LEN_UUID_32) 10318fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta { 10328fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta gatt_convert_uuid32_to_uuid128(su, src.uu.uuid32); 10338fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta ps = su; 10348fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta } 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps = src.uu.uuid128; 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (tar.len == LEN_UUID_16) 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* convert a 16 bits UUID to 128 bits value */ 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_convert_uuid16_to_uuid128(tu, tar.uu.uuid16); 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pt = tu; 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10448fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta else if (tar.len == LEN_UUID_32) 10458fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta { 10468fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta /* convert a 32 bits UUID to 128 bits value */ 10478fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta gatt_convert_uuid32_to_uuid128(tu, tar.uu.uuid32); 10488fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta pt = tu; 10498fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta } 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pt = tar.uu.uuid128; 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(memcmp(ps, pt, LEN_UUID_128) == 0); 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_build_uuid_to_stream 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Add UUID into stream. 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns UUID length. 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_build_uuid_to_stream(UINT8 **p_dst, tBT_UUID uuid) 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = *p_dst; 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 len = 0; 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (uuid.len == LEN_UUID_16) 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM (p, uuid.uu.uuid16); 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = LEN_UUID_16; 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10758fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta else if (uuid.len == LEN_UUID_32) /* always convert 32 bits into 128 bits as alwats */ 10768fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta { 10778fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta gatt_convert_uuid32_to_uuid128(p, uuid.uu.uuid32); 10788fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p += LEN_UUID_128; 10798fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta len = LEN_UUID_128; 10808fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta } 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (uuid.len == LEN_UUID_128) 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM (p, uuid.uu.uuid128, LEN_UUID_128); 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = LEN_UUID_128; 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_dst = p; 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return len; 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_parse_uuid_from_cmd 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Convert a 128 bits UUID into a 16 bits UUID. 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if command sent, otherwise FALSE. 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_parse_uuid_from_cmd(tBT_UUID *p_uuid_rec, UINT16 uuid_size, UINT8 **p_data) 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_base_uuid, ret = TRUE; 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 xx; 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_uuid = *p_data; 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_uuid_rec, 0, sizeof(tBT_UUID)); 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (uuid_size) 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case LEN_UUID_16: 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_uuid_rec->len = uuid_size; 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16 (p_uuid_rec->uu.uuid16, p_uuid); 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_data += LEN_UUID_16; 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case LEN_UUID_128: 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* See if we can compress his UUID down to 16 or 32bit UUIDs */ 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_base_uuid = TRUE; 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < LEN_UUID_128 - 4; xx++) 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_uuid[xx] != base_uuid[xx]) 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_base_uuid = FALSE; 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_base_uuid) 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_uuid[LEN_UUID_128 - 1] == 0) && (p_uuid[LEN_UUID_128 - 2] == 0)) 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_uuid += (LEN_UUID_128 - 4); 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_uuid_rec->len = LEN_UUID_16; 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16(p_uuid_rec->uu.uuid16, p_uuid); 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11368fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta { 11378fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_uuid += (LEN_UUID_128 - LEN_UUID_32); 11388fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_uuid_rec->len = LEN_UUID_32; 11398fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta STREAM_TO_UINT32(p_uuid_rec->uu.uuid32, p_uuid); 11408fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta } 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!is_base_uuid) 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_uuid_rec->len = LEN_UUID_128; 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_uuid_rec->uu.uuid128, p_uuid, LEN_UUID_128); 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_data += LEN_UUID_128; 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11508fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta /* do not allow 32 bits UUID in ATT PDU now */ 11518fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta case LEN_UUID_32: 1152b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("DO NOT ALLOW 32 BITS UUID IN ATT PDU"); 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 0: 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (uuid_size != 0) ret = FALSE; 1156b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_WARNING("gatt_parse_uuid_from_cmd invalid uuid size"); 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return( ret); 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_start_rsp_timer 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Start a wait_for_response timer. 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if command sent, otherwise FALSE. 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11725fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xuvoid gatt_start_rsp_timer(UINT16 clcb_idx) 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11745fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu tGATT_CLCB *p_clcb = &gatt_cb.clcb[clcb_idx]; 11755fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu UINT32 timeout = GATT_WAIT_FOR_RSP_TOUT; 11765fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu p_clcb->rsp_timer_ent.param = (TIMER_PARAM_TYPE)p_clcb; 11775fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY && 11785fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu p_clcb->op_subtype == GATT_DISC_SRVC_ALL) 11795fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu { 11805fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu timeout = GATT_WAIT_FOR_DISC_RSP_TOUT; 11815fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu } 11825fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu btu_start_timer (&p_clcb->rsp_timer_ent, BTU_TTYPE_ATT_WAIT_FOR_RSP, 11835fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu timeout); 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_start_conf_timer 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Start a wait_for_confirmation timer. 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if command sent, otherwise FALSE. 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_start_conf_timer(tGATT_TCB *p_tcb) 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->conf_timer_ent.param = (TIMER_PARAM_TYPE)p_tcb; 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&p_tcb->conf_timer_ent, BTU_TTYPE_ATT_WAIT_FOR_RSP, 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_WAIT_FOR_RSP_TOUT); 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_start_ind_ack_timer 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description start the application ack timer 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_start_ind_ack_timer(tGATT_TCB *p_tcb) 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->ind_ack_timer_ent.param = (TIMER_PARAM_TYPE)p_tcb; 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start notification cache timer */ 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&p_tcb->ind_ack_timer_ent, BTU_TTYPE_ATT_WAIT_FOR_IND_ACK, 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_WAIT_FOR_RSP_TOUT); 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_rsp_timeout 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Called when GATT wait for ATT command response timer expires 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_rsp_timeout(TIMER_LIST_ENT *p_tle) 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12285fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu tGATT_CLCB *p_clcb = (tGATT_CLCB *)p_tle->param; 12295fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu if (p_clcb == NULL || p_clcb->p_tcb == NULL) 12305fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu { 1231b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_WARNING("gatt_rsp_timeout clcb is already deleted"); 12325fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu return; 12335fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu } 12345fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY && 12355fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu p_clcb->op_subtype == GATT_DISC_SRVC_ALL && 12365fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu p_clcb->retry_count < GATT_REQ_RETRY_LIMIT) 12375fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu { 12385fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu UINT8 rsp_code; 1239b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_WARNING("gatt_rsp_timeout retry discovery primary service"); 12405fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu if (p_clcb != gatt_cmd_dequeue(p_clcb->p_tcb, &rsp_code)) 12415fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu { 1242b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("gatt_rsp_timeout command queue out of sync, disconnect"); 12435fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu } 12445fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu else 12455fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu { 12465fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu p_clcb->retry_count++; 12475fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu gatt_act_discovery(p_clcb); 12485fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu return; 12495fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu } 12505fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu } 12515fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu 1252b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_WARNING("gatt_rsp_timeout disconnecting..."); 12538fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta gatt_disconnect (p_clcb->p_tcb); 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_ind_ack_timeout 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Called when GATT wait for ATT handle confirmation timeout 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_ind_ack_timeout(TIMER_LIST_ENT *p_tle) 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB * p_tcb = (tGATT_TCB *)p_tle->param; 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1269b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_WARNING("gatt_ind_ack_timeout send ack now"); 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb != NULL) 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->ind_count = 0; 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attp_send_cl_msg(((tGATT_TCB *)p_tle->param), 0, GATT_HANDLE_VALUE_CONF, NULL); 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_sr_find_i_rcb_by_handle 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function searches for a service that owns a specific handle. 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GATT_MAX_SR_PROFILES if not found. Otherwise index of th eservice. 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_sr_find_i_rcb_by_handle(UINT16 handle) 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i_rcb = 0; 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for ( ; i_rcb < GATT_MAX_SR_PROFILES; i_rcb++) 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_cb.sr_reg[i_rcb].in_use && 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.sr_reg[i_rcb].s_hdl <= handle && 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.sr_reg[i_rcb].e_hdl >= handle ) 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return i_rcb; 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_sr_find_i_rcb_by_handle 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function searches for a service that owns a specific handle. 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 0 if not found. Otherwise index of th eservice. 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_sr_find_i_rcb_by_app_id(tBT_UUID *p_app_uuid128, tBT_UUID *p_svc_uuid, UINT16 svc_inst) 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i_rcb = 0; 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SR_REG *p_sreg; 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID *p_this_uuid; 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i_rcb = 0, p_sreg = gatt_cb.sr_reg; i_rcb < GATT_MAX_SR_PROFILES; i_rcb++, p_sreg++) 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( p_sreg->in_use ) 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_this_uuid = gatts_get_service_uuid (p_sreg->p_db); 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_this_uuid && 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_uuid_compare (*p_app_uuid128, p_sreg->app_uuid ) && 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_uuid_compare (*p_svc_uuid, *p_this_uuid) && 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (svc_inst == p_sreg->service_instance)) 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1327b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("Active Service Found "); 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_dbg_display_uuid(*p_svc_uuid); 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return i_rcb; 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_sr_find_i_rcb_by_handle 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function searches for a service that owns a specific handle. 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 0 if not found. Otherwise index of th eservice. 13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_sr_alloc_rcb(tGATT_HDL_LIST_ELEM *p_list ) 13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 ii = 0; 13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SR_REG *p_sreg = NULL; 13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /*this is a new application servoce start */ 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (ii = 0, p_sreg = gatt_cb.sr_reg; ii < GATT_MAX_SR_PROFILES; ii++, p_sreg++) 13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_sreg->in_use) 13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (p_sreg, 0, sizeof(tGATT_SR_REG)); 13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sreg->in_use = TRUE; 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (&p_sreg->app_uuid, &p_list->asgn_range.app_uuid128, sizeof(tBT_UUID)); 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sreg->service_instance = p_list->asgn_range.svc_inst; 13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sreg->type = p_list->asgn_range.is_primary ? GATT_UUID_PRI_SERVICE: GATT_UUID_SEC_SERVICE; 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sreg->s_hdl = p_list->asgn_range.s_handle; 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sreg->e_hdl = p_list->asgn_range.e_handle; 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sreg->p_db = &p_list->svc_db; 13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1366b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("total GKI buffer in db [%d]",p_sreg->p_db->svc_buffer.count); 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ii; 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_sr_get_sec_info 13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get the security flag and key size information for the peer 13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** device. 13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13838fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Battavoid gatt_sr_get_sec_info(BD_ADDR rem_bda, tBT_TRANSPORT transport, UINT8 *p_sec_flag, UINT8 *p_key_size) 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 sec_flag = 0; 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13878fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta BTM_GetSecurityFlagsByTransport(rem_bda, &sec_flag, transport); 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_flag &= (GATT_SEC_FLAG_LKEY_UNAUTHED | GATT_SEC_FLAG_LKEY_AUTHED | GATT_SEC_FLAG_ENCRYPTED); 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_key_size = btm_ble_read_sec_key_size(rem_bda); 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_sec_flag = sec_flag; 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_sr_send_req_callback 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_sr_send_req_callback(UINT16 conn_id, 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 trans_id, 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_REQ_TYPE type, tGATTS_DATA *p_data) 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_IF gatt_if = GATT_GET_GATT_IF(conn_id); 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg = gatt_get_regcb(gatt_if); 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_reg ) 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1413b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("p_reg not found discard request"); 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( p_reg->in_use && 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_reg->app_cb.p_req_cb) 14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_reg->app_cb.p_req_cb)(conn_id, trans_id, type, p_data); 14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1424b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_WARNING("Call back not found for application conn_id=%d", conn_id); 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_send_error_rsp 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends an error response. 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS gatt_send_error_rsp (tGATT_TCB *p_tcb, UINT8 err_code, UINT8 op_code, 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 handle, BOOLEAN deq) 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_ERROR error; 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS status; 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project error.cmd_code = op_code; 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project error.reason = err_code; 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project error.handle =handle; 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = attp_build_sr_msg(p_tcb, GATT_RSP_ERROR, (tGATT_SR_MSG *)&error)) != NULL) 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = attp_send_sr_msg (p_tcb, p_buf); 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_INSUF_RESOURCE; 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (deq) 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_dequeue_sr_cmd(p_tcb); 14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_add_sdp_record 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function add a SDP record for a GATT primary service 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 0 if error else sdp handle for the record. 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 gatt_add_sdp_record (tBT_UUID *p_uuid, UINT16 start_hdl, UINT16 end_hdl) 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_PROTOCOL_ELEM proto_elem_list[2]; 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 sdp_handle; 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 list = UUID_SERVCLASS_PUBLIC_BROWSE_GROUP; 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 buff[60]; 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = buff; 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1480b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_add_sdp_record s_hdl=0x%x s_hdl=0x%x",start_hdl, end_hdl); 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((sdp_handle = SDP_CreateRecord()) == 0) 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_uuid->len) 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case LEN_UUID_16: 14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SDP_AddServiceClassIdList(sdp_handle, 1, &p_uuid->uu.uuid16); 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 14908fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta 14918fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta case LEN_UUID_32: 14928fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta UINT8_TO_BE_STREAM (p, (UUID_DESC_TYPE << 3) | SIZE_FOUR_BYTES); 14938fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta UINT32_TO_BE_STREAM (p, p_uuid->uu.uuid32); 14948fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta SDP_AddAttribute (sdp_handle, ATTR_ID_SERVICE_CLASS_ID_LIST, DATA_ELE_SEQ_DESC_TYPE, 14958fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta (UINT32) (p - buff), buff); 14968fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta break; 14978fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case LEN_UUID_128: 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p, (UUID_DESC_TYPE << 3) | SIZE_SIXTEEN_BYTES); 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_BE_STREAM (p, p_uuid->uu.uuid128, LEN_UUID_128); 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SDP_AddAttribute (sdp_handle, ATTR_ID_SERVICE_CLASS_ID_LIST, DATA_ELE_SEQ_DESC_TYPE, 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT32) (p - buff), buff); 15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1506b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("inavlid UUID len=%d", p_uuid->len); 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SDP_DeleteRecord(sdp_handle); 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /*** Fill out the protocol element sequence for SDP ***/ 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_elem_list[0].protocol_uuid = UUID_PROTOCOL_L2CAP; 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_elem_list[0].num_params = 1; 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_elem_list[0].params[0] = BT_PSM_ATT; 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_elem_list[1].protocol_uuid = UUID_PROTOCOL_ATT; 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_elem_list[1].num_params = 2; 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_elem_list[1].params[0] = start_hdl; 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_elem_list[1].params[1] = end_hdl; 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SDP_AddProtocolList(sdp_handle, 2, proto_elem_list); 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make the service browseable */ 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SDP_AddUuidSequence (sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, &list); 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(sdp_handle); 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #if GATT_CONFORMANCE_TESTING == TRUE 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_set_err_rsp 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to set the test confirm value 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_set_err_rsp(BOOLEAN enable, UINT8 req_op_code, UINT8 err_status) 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1542b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_set_err_rsp enable=%d op_code=%d, err_status=%d", enable, req_op_code, err_status); 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.enable_err_rsp = enable; 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.req_op_code = req_op_code; 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.err_status = err_status; 15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #endif 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_get_regcb 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function returns the registration control block. 15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the registration control block or NULL 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_REG *gatt_get_regcb (tGATT_IF gatt_if) 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 ii = (UINT8)gatt_if; 15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg = NULL; 15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ii) 15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ii--; /* convert from one based to zero based */ 15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_reg = &gatt_cb.cl_rcb[ii]; 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (ii < GATT_MAX_APPS) && (p_reg->in_use) ) 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_reg); 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return NULL; 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_is_clcb_allocated 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function check clcb for conn_id is allocated or not 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns True already allocated 15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_is_clcb_allocated (UINT16 conn_id) 15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i = 0; 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_allocated= FALSE; 15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_CL_MAX_LCB; i++) 15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_cb.clcb[i].in_use && (gatt_cb.clcb[i].conn_id == conn_id)) 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_allocated = TRUE; 15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return is_allocated; 16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_clcb_alloc 16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function allocates a GATT connection link control block 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns NULL if not found. Otherwise pointer to the connection link block. 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_CLCB *gatt_clcb_alloc (UINT16 conn_id) 16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i = 0; 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_CLCB *p_clcb = NULL; 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_IF gatt_if=GATT_GET_GATT_IF(conn_id); 16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx); 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg = gatt_get_regcb(gatt_if); 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_CL_MAX_LCB; i++) 16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!gatt_cb.clcb[i].in_use) 16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb = &gatt_cb.clcb[i]; 16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->in_use = TRUE; 16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->conn_id = conn_id; 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->clcb_idx = i; 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->p_reg = p_reg; 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->p_tcb = p_tcb; 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_clcb; 16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_clcb_dealloc 16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function de allocates a GATT connection link control block 16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_clcb_dealloc (tGATT_CLCB *p_clcb) 16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb && p_clcb->in_use) 16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_clcb, 0, sizeof(tGATT_CLCB)); 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_find_tcb_by_cid 16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function searches for an empty entry 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** in registration info table for GATT client 16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns NULL if not found. Otherwise pointer to the rcb. 16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_TCB * gatt_find_tcb_by_cid (UINT16 lcid) 16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx = 0; 16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb = NULL; 16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < GATT_MAX_PHY_CHANNEL; xx++) 16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_cb.tcb[xx].in_use && gatt_cb.tcb[xx].att_lcid == lcid) 16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb = &gatt_cb.tcb[xx]; 16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_tcb; 16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_num_apps_hold_link 16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function find the number of applcaitions is holding the link 16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns total number of applications holding this acl link. 16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_num_apps_hold_link(tGATT_TCB *p_tcb) 16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i, num = 0; 16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_APPS; i ++) 16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->app_hold_link[i]) 17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num ++; 17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1704b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_num_apps_hold_link num=%d", num); 17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return num; 17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_num_clcb_by_bd_addr 17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function searches all LCB with macthing bd address 17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns total number of clcb found. 17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_num_clcb_by_bd_addr(BD_ADDR bda) 17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i, num = 0; 17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_CL_MAX_LCB; i ++) 17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_cb.clcb[i].in_use && memcmp(gatt_cb.clcb[i].p_tcb->peer_bda, bda, BD_ADDR_LEN) == 0) 17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num ++; 17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return num; 17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_sr_update_cback_cnt 17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function searches all LCB with macthing bd address 17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns total number of clcb found. 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_sr_copy_prep_cnt_to_cback_cnt(tGATT_TCB *p_tcb ) 17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb) 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_APPS; i ++) 17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->prep_cnt[i]) 17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->sr_cmd.cback_cnt[i]=1; 17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_sr_is_cback_cnt_zero 17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function searches all LCB with macthing bd address 17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns True if thetotal application callback count is zero 17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_sr_is_cback_cnt_zero(tGATT_TCB *p_tcb ) 17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status = TRUE; 17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb) 17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_APPS; i ++) 17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->sr_cmd.cback_cnt[i]) 17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = FALSE; 17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = FALSE; 17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_sr_is_prep_cnt_zero 17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Check the prepare write request count is zero or not 17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns True no prepare write request 17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_sr_is_prep_cnt_zero(tGATT_TCB *p_tcb) 17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status = TRUE; 18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb) 18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_APPS; i ++) 18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->prep_cnt[i]) 18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = FALSE; 18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = FALSE; 18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_sr_reset_cback_cnt 18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Reset the application callback count to zero 18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_sr_reset_cback_cnt(tGATT_TCB *p_tcb ) 18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb) 18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_APPS; i ++) 18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->sr_cmd.cback_cnt[i]=0; 18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_sr_reset_prep_cnt 18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Reset the prep write count to zero 18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_sr_reset_prep_cnt(tGATT_TCB *p_tcb ) 18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb) 18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_APPS; i ++) 18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->prep_cnt[i]=0; 18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_sr_update_cback_cnt 18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Update the teh applicaiton callback count 18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_sr_update_cback_cnt(tGATT_TCB *p_tcb, tGATT_IF gatt_if, BOOLEAN is_inc, BOOLEAN is_reset_first) 18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 idx = ((UINT8) gatt_if) - 1 ; 18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb) 18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_reset_first) 18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_sr_reset_cback_cnt(p_tcb); 18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_inc) 18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->sr_cmd.cback_cnt[idx]++; 18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( p_tcb->sr_cmd.cback_cnt[idx]) 18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->sr_cmd.cback_cnt[idx]--; 18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_sr_update_prep_cnt 19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Update the teh prepare write request count 19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_sr_update_prep_cnt(tGATT_TCB *p_tcb, tGATT_IF gatt_if, BOOLEAN is_inc, BOOLEAN is_reset_first) 19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 idx = ((UINT8) gatt_if) - 1 ; 19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1913b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_sr_update_prep_cnt tcb idx=%d gatt_if=%d is_inc=%d is_reset_first=%d", 19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->tcb_idx, gatt_if, is_inc, is_reset_first); 19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb) 19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_reset_first) 19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_sr_reset_prep_cnt(p_tcb); 19215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_inc) 19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->prep_cnt[idx]++; 19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->prep_cnt[idx]) 19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->prep_cnt[idx]--; 19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_cancel_open 19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Cancel open request 19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Boolean 19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_cancel_open(tGATT_IF gatt_if, BD_ADDR bda) 19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb=NULL; 19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status= TRUE; 19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19498fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_tcb = gatt_find_tcb_by_addr(bda, BT_TRANSPORT_LE); 19508fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta 19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb) 19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_get_ch_state(p_tcb) == GATT_CH_OPEN) 19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1955b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("GATT_CancelConnect - link connected Too late to cancel"); 19565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = FALSE; 19575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 19595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_update_app_use_link_flag(gatt_if, p_tcb, FALSE, FALSE); 19615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!gatt_num_apps_hold_link(p_tcb)) 19625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19638fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta gatt_disconnect(p_tcb); 19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_find_app_hold_link 19745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description find the applicaiton that is holding the specified link 19765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Boolean 19785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 19805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_find_app_hold_link(tGATT_TCB *p_tcb, UINT8 start_idx, UINT8 *p_found_idx, tGATT_IF *p_gatt_if) 19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 19835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN found= FALSE; 19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = start_idx; i < GATT_MAX_APPS; i ++) 19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->app_hold_link[i]) 19885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_gatt_if = gatt_cb.clcb[i].p_reg->gatt_if; 19905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_found_idx = i; 19915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project found = TRUE; 19925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 19935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return found; 19965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_cmd_enq 20015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Enqueue this command. 20035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 20055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 20075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_cmd_enq(tGATT_TCB *p_tcb, UINT16 clcb_idx, BOOLEAN to_send, UINT8 op_code, BT_HDR *p_buf) 20085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 20095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_CMD_Q *p_cmd = &p_tcb->cl_cmd_q[p_tcb->next_slot_inq]; 20105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd->to_send = to_send; /* waiting to be sent */ 20125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd->op_code = op_code; 20135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd->p_cmd = p_buf; 20145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cmd->clcb_idx = clcb_idx; 20155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!to_send) 20175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->pending_cl_req = p_tcb->next_slot_inq; 20195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->next_slot_inq ++; 20225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->next_slot_inq %= GATT_CL_MAX_LCB; 20235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 20255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 20285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_cmd_dequeue 20305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description dequeue the command in the client CCB command queue. 20325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns total number of clcb found. 20345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 20365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_CLCB * gatt_cmd_dequeue(tGATT_TCB *p_tcb, UINT8 *p_op_code) 20375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 20385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_CMD_Q *p_cmd = &p_tcb->cl_cmd_q[p_tcb->pending_cl_req]; 20395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_CLCB *p_clcb = NULL; 20405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->pending_cl_req != p_tcb->next_slot_inq) 20425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb = &gatt_cb.clcb[p_cmd->clcb_idx]; 20445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_op_code = p_cmd->op_code; 20465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->pending_cl_req ++; 20485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->pending_cl_req %= GATT_CL_MAX_LCB; 20495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_clcb; 20525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 20555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_send_write_msg 20575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This real function send out the ATT message for write. 20595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status code 20615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 20635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_send_write_msg (tGATT_TCB *p_tcb, UINT16 clcb_idx, UINT8 op_code, 20645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 handle, UINT16 len, 20655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 offset, UINT8 *p_data) 20665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 20675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_CL_MSG msg; 20685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.attr_value.handle = handle; 20705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.attr_value.len = len; 20715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.attr_value.offset = offset; 20725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (msg.attr_value.value, p_data, len); 20745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* write by handle */ 20765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return attp_send_cl_msg(p_tcb, clcb_idx, op_code, &msg); 20775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 20805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_act_send_browse 20825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function ends a browse command request, including read 20845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** information request and read by type request. 20855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status code 20875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 20895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_act_send_browse(tGATT_TCB *p_tcb, UINT16 index, UINT8 op, UINT16 s_handle, 20905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 e_handle, tBT_UUID uuid) 20915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 20925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_CL_MSG msg; 20935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.browse.s_handle = s_handle; 20955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.browse.e_handle = e_handle; 20965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&msg.browse.uuid, &uuid, sizeof(tBT_UUID)); 20975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* write by handle */ 20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return attp_send_cl_msg(p_tcb, index, op, &msg); 21005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 21015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_end_operation 21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function ends a discovery, send callback and finalize 21075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** some control value. 21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 16 bits uuid. 21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_end_operation(tGATT_CLCB *p_clcb, tGATT_STATUS status, void *p_data) 21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 21145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_CL_COMPLETE cb_data; 21155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_CMPL_CBACK *p_cmpl_cb = (p_clcb->p_reg) ? p_clcb->p_reg->app_cb.p_cmpl_cb : NULL; 21165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 op = p_clcb->operation, disc_type=GATT_DISC_MAX; 21175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_DISC_CMPL_CB *p_disc_cmpl_cb = (p_clcb->p_reg) ? p_clcb->p_reg->app_cb.p_disc_cmpl_cb : NULL; 21185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 conn_id; 21195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 operation; 21205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2121b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("gatt_end_operation status=%d op=%d subtype=%d", 21225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status, p_clcb->operation, p_clcb->op_subtype); 21235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cmpl_cb != NULL && p_clcb->operation != 0) 21255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb->operation == GATTC_OPTYPE_READ) 21275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&cb_data.att_value, 0, sizeof(tGATT_VALUE)); 21295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.att_value.handle = p_clcb->s_handle; 21305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.att_value.len = p_clcb->counter; 21315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data) 21325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (cb_data.att_value.value, p_data, cb_data.att_value.len); 21335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb->operation == GATTC_OPTYPE_WRITE) 21365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&cb_data.att_value, 0, sizeof(tGATT_VALUE)); 21385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.handle = 21395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.att_value.handle = p_clcb->s_handle; 21405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb->op_subtype == GATT_WRITE_PREPARE) 21415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data) 21435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.att_value = *((tGATT_VALUE *) p_data); 21455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 21475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2148b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("Rcv Prepare write rsp but no data"); 21495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb->operation == GATTC_OPTYPE_CONFIG) 21545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cb_data.mtu = p_clcb->p_tcb->payload_size; 21555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY) 21575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc_type = p_clcb->op_subtype; 21595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb->p_attr_buf) 21635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_clcb->p_attr_buf); 21655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project operation = p_clcb->operation; 21685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_id = p_clcb->conn_id; 21695fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu btu_stop_timer(&p_clcb->rsp_timer_ent); 21705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_clcb_dealloc(p_clcb); 21725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_disc_cmpl_cb && (op == GATTC_OPTYPE_DISCOVERY)) 21745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_disc_cmpl_cb)(conn_id, disc_type, status); 21755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_cmpl_cb && op) 21765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cmpl_cb)(conn_id, op, status, &cb_data); 21775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2178b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_WARNING ("gatt_end_operation not sent out op=%d p_disc_cmpl_cb:%p p_cmpl_cb:%p", 21795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project operation, p_disc_cmpl_cb, p_cmpl_cb); 21805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 21815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 21835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_cleanup_upon_disc 21855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function cleans up the control blocks when L2CAP channel 21875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** disconnect. 21885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 16 bits uuid. 21905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 21928fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Battavoid gatt_cleanup_upon_disc(BD_ADDR bda, UINT16 reason, tBT_TRANSPORT transport) 21935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 21945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb = NULL; 21955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_CLCB *p_clcb; 21965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 21975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 conn_id; 21985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg=NULL; 21995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2201b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("gatt_cleanup_upon_disc "); 22025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22038fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if ((p_tcb = gatt_find_tcb_by_addr(bda, transport)) != NULL) 22045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2205b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("found p_tcb "); 22068fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta gatt_set_ch_state(p_tcb, GATT_CH_CLOSE); 22075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_CL_MAX_LCB; i ++) 22085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb = &gatt_cb.clcb[i]; 22105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb->in_use && p_clcb->p_tcb == p_tcb) 22115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22125fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu btu_stop_timer(&p_clcb->rsp_timer_ent); 2213b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("found p_clcb conn_id=%d clcb_idx=%d", p_clcb->conn_id, p_clcb->clcb_idx); 22145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb->operation != GATTC_OPTYPE_NONE) 22155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_end_operation(p_clcb, GATT_ERROR, NULL); 22165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_clcb_dealloc(p_clcb); 22185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer (&p_tcb->ind_ack_timer_ent); 22235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer (&p_tcb->conf_timer_ent); 22245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_free_pending_ind(p_tcb); 2225ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_free_pending_enc_queue(p_tcb); 22265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_APPS; i ++) 22285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_reg = &gatt_cb.cl_rcb[i]; 22305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_reg->in_use && p_reg->app_cb.p_conn_cb) 22315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_reg->gatt_if); 2233b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("found p_reg tcb_idx=%d gatt_if=%d conn_id=0x%x", p_tcb->tcb_idx, p_reg->gatt_if, conn_id); 22348fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta (*p_reg->app_cb.p_conn_cb)(p_reg->gatt_if, bda, conn_id, FALSE, reason, transport); 22355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_tcb, 0, sizeof(tGATT_TCB)); 22385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2240b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("exit gatt_cleanup_upon_disc "); 22415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 22425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 22435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_dbg_req_op_name 22455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get op code description name, for debug information. 22475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns UINT8 *: name of the operation. 22495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 22515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 * gatt_dbg_op_name(UINT8 op_code) 22525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 22535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 pseduo_op_code_idx = op_code & (~GATT_WRITE_CMD_MASK); 22545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == GATT_CMD_WRITE ) 22565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pseduo_op_code_idx = 0x14; /* just an index to op_code_name */ 22585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == GATT_SIGN_CMD_WRITE) 22625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pseduo_op_code_idx = 0x15; /* just an index to op_code_name */ 22645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pseduo_op_code_idx <= GATT_OP_CODE_MAX) 22675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(UINT8*) op_code_name[pseduo_op_code_idx]; 22685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 22695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(UINT8 *)"Op Code Exceed Max"; 22705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 22715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 22735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_dbg_display_uuid 22755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Disaplay the UUID 22775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 22795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 22815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_dbg_display_uuid(tBT_UUID bt_uuid) 22825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 22835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char str_buf[50]; 22845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int x = 0; 22855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bt_uuid.len == LEN_UUID_16) 22875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sprintf(str_buf, "0x%04x", bt_uuid.uu.uuid16); 22895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22908fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta else if (bt_uuid.len == LEN_UUID_32) 22918fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta { 22928fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta sprintf(str_buf, "0x%08x", (unsigned int)bt_uuid.uu.uuid32); 22938fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta } 22945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (bt_uuid.len == LEN_UUID_128) 22955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project x += sprintf(&str_buf[x], "0x%02x%02x%02x%02x%02x%02x%02x%02x", 22975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_uuid.uu.uuid128[15], bt_uuid.uu.uuid128[14], 22985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_uuid.uu.uuid128[13], bt_uuid.uu.uuid128[12], 22995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_uuid.uu.uuid128[11], bt_uuid.uu.uuid128[10], 23005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_uuid.uu.uuid128[9], bt_uuid.uu.uuid128[8]); 23015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sprintf(&str_buf[x], "%02x%02x%02x%02x%02x%02x%02x%02x", 23025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_uuid.uu.uuid128[7], bt_uuid.uu.uuid128[6], 23035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_uuid.uu.uuid128[5], bt_uuid.uu.uuid128[4], 23045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_uuid.uu.uuid128[3], bt_uuid.uu.uuid128[2], 23055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_uuid.uu.uuid128[1], bt_uuid.uu.uuid128[0]); 23065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 23085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S(str_buf, sizeof(str_buf), "Unknown UUID 0", 15); 23095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2310b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("UUID=[%s]", str_buf); 23115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 23135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 23165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_is_bg_dev_for_app 23185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description find is this one of the background devices for the application 23205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE this is one of the background devices for the application 23225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 23245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_is_bg_dev_for_app(tGATT_BG_CONN_DEV *p_dev, tGATT_IF gatt_if) 23255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 23265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 23275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_APPS; i ++ ) 23295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev->in_use && (p_dev->gatt_if[i] == gatt_if)) 23315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 23335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 23365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 23375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 23385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_find_bg_dev 23405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description find background connection device from the list. 23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the device record 23445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 23465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_BG_CONN_DEV * gatt_find_bg_dev(BD_ADDR remote_bda) 23475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 23485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_BG_CONN_DEV *p_dev_list = &gatt_cb.bgconn_dev[0]; 23495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 23505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_BG_CONN_DEV; i ++, p_dev_list ++) 23525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_list->in_use && !memcmp(p_dev_list->remote_bda, remote_bda, BD_ADDR_LEN)) 23545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_dev_list; 23565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return NULL; 23595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 23605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 23615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_alloc_bg_dev 23635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description allocate a background connection device record 23655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the device record 23675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 23695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_BG_CONN_DEV * gatt_alloc_bg_dev(BD_ADDR remote_bda) 23705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 23715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_BG_CONN_DEV *p_dev_list = &gatt_cb.bgconn_dev[0]; 23725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 23735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_BG_CONN_DEV; i ++, p_dev_list ++) 23755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_list->in_use) 23775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_list->in_use = TRUE; 23795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_dev_list->remote_bda, remote_bda, BD_ADDR_LEN); 23805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_dev_list; 23825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return NULL; 23855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 23865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_add_bg_dev_list 23905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description add/remove device from the back ground connection device list 23925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2393ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns TRUE if device added to the list; FALSE failed 23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2396ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN gatt_add_bg_dev_list(tGATT_REG *p_reg, BD_ADDR bd_addr, BOOLEAN is_initator) 23975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2398ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGATT_IF gatt_if = p_reg->gatt_if; 23995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_BG_CONN_DEV *p_dev = NULL; 2400ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 i; 2401ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BOOLEAN ret = FALSE; 24025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev = gatt_find_bg_dev(bd_addr)) == NULL) 24045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = gatt_alloc_bg_dev(bd_addr); 24065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev) 24095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_APPS; i ++) 24115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2412ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (is_initator) 24135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2414ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev->gatt_if[i] == gatt_if) 2415ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2416b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("device already in iniator white list"); 241740016adf0e4bab95760f4fb86e159017b7f94498Andre Eisenbach return TRUE; 2418ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2419ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else if (p_dev->gatt_if[i] == 0) 2420ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2421ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev->gatt_if[i] = gatt_if; 2422ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (i == 0) 2423ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ret = BTM_BleUpdateBgConnDev(TRUE, bd_addr); 2424e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach else 2425e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach ret = TRUE; 2426ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 2427ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 24285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2429ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 24305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2431ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev->listen_gif[i] == gatt_if) 2432ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2433b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("device already in adv white list"); 243440016adf0e4bab95760f4fb86e159017b7f94498Andre Eisenbach return TRUE; 2435ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2436ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else if (p_dev->listen_gif[i] == 0) 2437ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2438ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_reg->listening == GATT_LISTEN_TO_ALL) 2439ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_reg->listening = GATT_LISTEN_TO_NONE; 2440ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2441ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_reg->listening ++; 2442ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev->listen_gif[i] = gatt_if; 2443ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2444ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (i == 0) 2445ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ret = BTM_BleUpdateAdvWhitelist(TRUE, bd_addr); 2446e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach else 2447e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach ret = TRUE; 2448ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 2449ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 24505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2453ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 2454ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2455b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("no device record available"); 2456ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 24575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2458ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return ret; 24595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 24625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_remove_bg_dev_for_app 24645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Remove the application interface for the specified background device 24665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Boolean 24685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 24705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_remove_bg_dev_for_app(tGATT_IF gatt_if, BD_ADDR bd_addr) 24715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 24728fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE); 24735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status; 24745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb) 24765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_update_app_use_link_flag(gatt_if, p_tcb, FALSE, FALSE); 2477ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta status = gatt_update_auto_connect_dev(gatt_if, FALSE, bd_addr, TRUE); 24785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 24795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 24835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_get_num_apps_for_bg_dev 24855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Gte the number of applciations for the specified background device 24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns UINT8 total number fo applications 24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 24915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_get_num_apps_for_bg_dev(BD_ADDR bd_addr) 24925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 24935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_BG_CONN_DEV *p_dev = NULL; 24945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 24955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 cnt = 0; 24965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev = gatt_find_bg_dev(bd_addr)) != NULL) 24985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_APPS; i ++) 25005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev->gatt_if[i]) 25025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cnt++; 25035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return cnt; 25065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 25075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 25095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_find_app_for_bg_dev 25115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description find the application interface for the specified background device 25135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Boolean 25155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 25175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_find_app_for_bg_dev(BD_ADDR bd_addr, tGATT_IF *p_gatt_if) 25185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 25195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_BG_CONN_DEV *p_dev = NULL; 25205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 25215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN ret = FALSE; 25225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev = gatt_find_bg_dev(bd_addr)) == NULL) 25245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ret; 25265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GATT_MAX_APPS; i ++) 25295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev->gatt_if[i] != 0 ) 25315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_gatt_if = p_dev->gatt_if[i]; 25335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret = TRUE; 25345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 25355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ret; 25385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 25395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 25425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_remove_bg_dev_from_list 25445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2545ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description add/remove device from the back ground connection device list or 2546ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** listening to advertising list. 25475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the device record 25495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2551ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN gatt_remove_bg_dev_from_list(tGATT_REG *p_reg, BD_ADDR bd_addr, BOOLEAN is_initiator) 25525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2553ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGATT_IF gatt_if = p_reg->gatt_if; 25545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_BG_CONN_DEV *p_dev = NULL; 25555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i, j; 25565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN ret = FALSE; 25575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev = gatt_find_bg_dev(bd_addr)) == NULL) 25595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ret; 25615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2563ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (i = 0; i < GATT_MAX_APPS && (p_dev->gatt_if[i] > 0 || p_dev->listen_gif[i]); i ++) 25645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2565ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (is_initiator) 25665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2567ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev->gatt_if[i] == gatt_if) 2568ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2569ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev->gatt_if[i] = 0; 2570ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* move all element behind one forward */ 2571ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (j = i + 1; j < GATT_MAX_APPS; j ++) 2572ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev->gatt_if[j - 1] = p_dev->gatt_if[j]; 25735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2574ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev->gatt_if[0] == 0) 2575ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ret = BTM_BleUpdateBgConnDev(FALSE, p_dev->remote_bda); 2576ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 2577ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ret = TRUE; 25785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2579ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 2580ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2581ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2582ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 2583ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2584ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev->listen_gif[i] == gatt_if) 25855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2586ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev->listen_gif[i] = 0; 2587ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_reg->listening --; 2588ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* move all element behind one forward */ 2589ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (j = i + 1; j < GATT_MAX_APPS; j ++) 2590ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev->listen_gif[j - 1] = p_dev->listen_gif[j]; 2591ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2592ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev->listen_gif[0] == 0) 2593ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ret = BTM_BleUpdateAdvWhitelist(FALSE, p_dev->remote_bda); 2594ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 2595ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ret = TRUE; 2596ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 25975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2601ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (i != GATT_MAX_APPS && p_dev->gatt_if[0] == 0 && p_dev->listen_gif[0] == 0) 2602ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2603ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memset(p_dev, 0, sizeof(tGATT_BG_CONN_DEV)); 2604ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2605ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 26065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ret; 26075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 26085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 26095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_deregister_bgdev_list 26115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description deregister all related back ground connetion device. 26135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the device record 26155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 26175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_deregister_bgdev_list(tGATT_IF gatt_if) 26185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 26195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_BG_CONN_DEV *p_dev_list = &gatt_cb.bgconn_dev[0]; 26205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i , j, k; 2621e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach tGATT_REG *p_reg = gatt_get_regcb(gatt_if); 26225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2623e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach /* update the BG conn device list */ 26245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0 ; i <GATT_MAX_BG_CONN_DEV; i ++, p_dev_list ++ ) 26255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_list->in_use) 26275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (j = 0; j < GATT_MAX_APPS; j ++) 26295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2630e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach if (p_dev_list->gatt_if[j] == 0 && p_dev_list->listen_gif[j] == 0) 26315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2632e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach 2633e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach if (p_dev_list->gatt_if[j] == gatt_if) 26345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (k = j + 1; k < GATT_MAX_APPS; k ++) 26365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_list->gatt_if[k - 1] = p_dev_list->gatt_if[k]; 26375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_list->gatt_if[0] == 0) 26395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_BleUpdateBgConnDev(FALSE, p_dev_list->remote_bda); 2640e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach } 2641e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach 2642e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach if (p_dev_list->listen_gif[j] == gatt_if) 2643e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach { 2644e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach p_dev_list->listen_gif[j] = 0; 26456975b4d711142b885af479721cada448952c6b41Andre Eisenbach 26466975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (p_reg != NULL && p_reg->listening > 0) 26476975b4d711142b885af479721cada448952c6b41Andre Eisenbach p_reg->listening --; 2648e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach 2649e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach /* move all element behind one forward */ 2650e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach for (k = j + 1; k < GATT_MAX_APPS; k ++) 2651e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach p_dev_list->listen_gif[k - 1] = p_dev_list->listen_gif[k]; 2652e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach 2653e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach if (p_dev_list->listen_gif[0] == 0) 2654e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach BTM_BleUpdateAdvWhitelist(FALSE, p_dev_list->remote_bda); 26555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 26605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 26635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_reset_bgdev_list 26655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description reset bg device list 26675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the device record 26695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 26715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_reset_bgdev_list(void) 26725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 26735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&gatt_cb.bgconn_dev, 0 , sizeof(tGATT_BG_CONN_DEV)*GATT_MAX_BG_CONN_DEV); 26745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 26765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 26775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_update_auto_connect_dev 26795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function add or remove a device for background connection 26815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** procedure. 26825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters gatt_if: Application ID. 26845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** add: add peer device 26855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bd_addr: peer device address. 26865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if connection started; FALSE if connection start failure. 26885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2690ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN gatt_update_auto_connect_dev (tGATT_IF gatt_if, BOOLEAN add, BD_ADDR bd_addr, BOOLEAN is_initator) 26915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2692ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BOOLEAN ret = FALSE; 26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg; 26948fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE); 26955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2696b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("gatt_update_auto_connect_dev "); 26975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure app is registered */ 26985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_reg = gatt_get_regcb(gatt_if)) == NULL) 26995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2700b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("gatt_update_auto_connect_dev - gatt_if is not registered", gatt_if); 27015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 27025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (add) 27055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2706ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ret = gatt_add_bg_dev_list(p_reg, bd_addr, is_initator); 27075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2708ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (ret && p_tcb != NULL) 27095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if a connected device, update the link holding number */ 2711ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_update_app_use_link_flag(gatt_if, p_tcb, TRUE, TRUE); 27125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 27155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2716ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ret = gatt_remove_bg_dev_from_list(p_reg, bd_addr, is_initator); 27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ret; 27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2725ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gatt_add_pending_new_srv_start 2726ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2727ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Add a pending new srv start to the new service start queue 2728ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2729ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns Pointer to the new service start buffer, NULL no buffer available 2730ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2731ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 2732ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattatGATT_PENDING_ENC_CLCB* gatt_add_pending_enc_channel_clcb(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb ) 2733ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 2734ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGATT_PENDING_ENC_CLCB *p_buf; 27355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2736b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("gatt_add_pending_new_srv_start"); 2737ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_buf = (tGATT_PENDING_ENC_CLCB *)GKI_getbuf((UINT16)sizeof(tGATT_PENDING_ENC_CLCB))) != NULL) 2738ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2739b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("enqueue a new pending encryption channel clcb"); 2740ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_buf->p_clcb = p_clcb; 2741ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_enqueue (&p_tcb->pending_enc_clcb, p_buf); 2742ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2743ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return p_buf; 2744ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 2745ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 2746ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2747ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gatt_update_listen_mode 2748ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2749ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description update peripheral role listening mode 2750ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2751ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns Pointer to the new service start buffer, NULL no buffer available 2752ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2753ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 27548fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi BattaBOOLEAN gatt_update_listen_mode(void) 2755ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 2756ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 ii = 0; 2757ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGATT_REG *p_reg = &gatt_cb.cl_rcb[0]; 2758ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 listening = 0; 2759ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 connectability, window, interval; 27608fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta BOOLEAN rt = TRUE; 27615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2762ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (; ii < GATT_MAX_APPS; ii ++, p_reg ++) 2763ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2764ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ( p_reg->in_use && p_reg->listening > listening) 2765ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2766ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta listening = p_reg->listening; 2767ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2768ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2769ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2770ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (listening == GATT_LISTEN_TO_ALL || 2771ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta listening == GATT_LISTEN_TO_NONE) 2772ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_BleUpdateAdvFilterPolicy (AP_SCAN_CONN_ALL); 2773ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 2774ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_BleUpdateAdvFilterPolicy (AP_SCAN_CONN_WL); 27755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27768fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if (rt) 2777ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 27788fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta connectability = BTM_ReadConnectability (&window, &interval); 27798fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta 27808fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if (listening != GATT_LISTEN_TO_NONE) 27818fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta { 27828fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta connectability |= BTM_BLE_CONNECTABLE; 27838fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta } 27848fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta else 27858fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta { 27868fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if ((connectability & BTM_BLE_CONNECTABLE) == 0) 27878fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta connectability &= ~BTM_BLE_CONNECTABLE; 27888fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta } 27898fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta /* turning on the adv now */ 27908fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta btm_ble_set_connectability(connectability); 2791ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 27928fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta 27938fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta return rt; 2794ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2795ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 27965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 27975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2799