15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 1999-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 interface functions 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h> 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gatt_api.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gatt_int.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATT_SetTraceLevel 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sets the trace level. If called with 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** a value of 0xFF, it simply returns the current trace level. 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Input Parameters: 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** level: The level to set the GATT tracing to: 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 0xff-returns the current setting. 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 0-turns off tracing. 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 1-Errors. 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 2-Warnings. 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 3-APIs. 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 4-Events. 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 5-Debug. 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns The new or current trace level 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 GATT_SetTraceLevel (UINT8 new_level) 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_level != 0xFF) 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.trace_level = new_level; 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(gatt_cb.trace_level); 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** GATT SERVER API 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATTS_AddHandleRange 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function add the allocated handles range for the specifed 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** application UUID, service UUID and service instance 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter p_hndl_range: pointer to allocated handles information 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if handle range is added sucessfully; otherwise FALSE. 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN GATTS_AddHandleRange(tGATTS_HNDL_RANGE *p_hndl_range) 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_HDL_LIST_ELEM *p_buf; 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status= FALSE; 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = gatt_alloc_hdl_buffer()) != NULL) 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->asgn_range = *p_hndl_range; 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = gatt_add_an_item_to_list(&gatt_cb.hdl_list_info, p_buf); 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATTS_NVRegister 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Application manager calls this function to register for 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NV save callback function. There can be one and only one 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NV save callback function. 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter p_cb_info : callback informaiton 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN GATTS_NVRegister (tGATT_APPL_INFO *p_cb_info) 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status= FALSE; 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb_info) 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.cb_info = *p_cb_info; 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = TRUE; 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_init_srv_chg(); 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATTS_CreateService 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to reserve a block of handles for a service. 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** *** It should be called only once per service instance *** 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter gatt_if : application if 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_svc_uuid : service UUID 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** svc_inst : instance of the service inside the application 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** num_handles : number of handles needed by the service. 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is_pri : is a primary service or not. 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns service handle if sucessful, otherwise 0. 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 GATTS_CreateService (tGATT_IF gatt_if, tBT_UUID *p_svc_uuid, 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 svc_inst, UINT16 num_handles, BOOLEAN is_pri) 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_HDL_LIST_INFO *p_list_info= &gatt_cb.hdl_list_info; 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_HDL_LIST_ELEM *p_list=NULL; 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 s_hdl=0; 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN save_hdl=FALSE; 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_PENDING_NEW_SRV_START *p_buf=NULL; 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg = gatt_get_regcb(gatt_if); 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID *p_app_uuid128; 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 153b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATTS_CreateService" ); 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_reg == NULL) 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 157b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("Inavlid gatt_if=%d", gatt_if); 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(0); 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_app_uuid128 = &p_reg->app_uuid128; 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_list = gatt_find_hdl_buffer_by_app_id(p_app_uuid128, p_svc_uuid, svc_inst)) != NULL) 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s_hdl = p_list->asgn_range.s_handle; 166b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("Service already been created!!"); 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_svc_uuid->len == LEN_UUID_16) && (p_svc_uuid->uu.uuid16 == UUID_SERVCLASS_GATT_SERVER)) 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s_hdl= gatt_cb.hdl_cfg.gatt_start_hdl; 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ((p_svc_uuid->len == LEN_UUID_16) && (p_svc_uuid->uu.uuid16 == UUID_SERVCLASS_GAP_SERVER)) 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s_hdl= gatt_cb.hdl_cfg.gap_start_hdl; 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list = p_list_info->p_first; 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_list) 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s_hdl = p_list->asgn_range.e_handle + 1; 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (s_hdl < gatt_cb.hdl_cfg.app_start_hdl) 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s_hdl= gatt_cb.hdl_cfg.app_start_hdl; 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project save_hdl = TRUE; 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check for space */ 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (num_handles > (0xFFFF - s_hdl + 1)) 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 198b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("GATTS_ReserveHandles: no handles, s_hdl: %u needed: %u", s_hdl, num_handles); 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(0); 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_list = gatt_alloc_hdl_buffer()) == NULL) 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* No free entry */ 205b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("GATTS_ReserveHandles: no free handle blocks"); 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(0); 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->asgn_range.app_uuid128 = *p_app_uuid128; 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->asgn_range.svc_uuid = *p_svc_uuid; 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->asgn_range.svc_inst = svc_inst; 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->asgn_range.s_handle = s_hdl; 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->asgn_range.e_handle = s_hdl+num_handles-1; 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->asgn_range.is_primary = is_pri; 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_add_an_item_to_list(p_list_info, p_list); 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (save_hdl) 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_cb.cb_info.p_nv_save_callback) 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*gatt_cb.cb_info.p_nv_save_callback)(TRUE, &p_list->asgn_range); 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add a pending new service change item to the list */ 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_buf = gatt_add_pending_new_srv_start(&p_list->asgn_range)) == NULL) 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* No free entry */ 226b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("gatt_add_pending_new_srv_start: no free blocks"); 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_list) 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_remove_an_item_from_list(p_list_info, p_list); 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_free_hdl_buffer(p_list); 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(0); 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 236b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("Add a new srv chg item"); 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (!gatts_init_service_db(&p_list->svc_db, p_svc_uuid, is_pri, s_hdl , num_handles)) 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 242b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("GATTS_ReserveHandles: service DB initialization failed"); 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_list) 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_remove_an_item_from_list(p_list_info, p_list); 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_free_hdl_buffer(p_list); 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf) 250abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(fixed_queue_try_remove_from_queue(gatt_cb.pending_new_srv_start_q, p_buf)); 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(0); 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 254b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("GATTS_CreateService(success): handles needed:%u s_hdl=%u e_hdl=%u %s[%x] is_primary=%d", 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_handles, p_list->asgn_range.s_handle , p_list->asgn_range.e_handle, 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((p_list->asgn_range.svc_uuid.len == 2) ? "uuid16": "uuid128" ), 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->asgn_range.svc_uuid.uu.uuid16, 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->asgn_range.is_primary); 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(s_hdl); 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATTS_AddIncludeService 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to add an included service. 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter service_handle : To which service this included service is added to. 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** include_svc_handle : included service handle. 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns included service attribute handle. If 0, add included service 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** fail. 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 GATTS_AddIncludeService (UINT16 service_handle, UINT16 include_svc_handle) 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_HDL_LIST_ELEM *p_decl, *p_incl_decl; 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_decl = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL) 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 283b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("Service not created"); 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_incl_decl = gatt_find_hdl_buffer_by_handle(include_svc_handle)) == NULL) 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 288b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("Included Service not created"); 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return gatts_add_included_service(&p_decl->svc_db, 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_incl_decl->asgn_range.s_handle, 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_incl_decl->asgn_range.e_handle, 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_incl_decl->asgn_range.svc_uuid); 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATTS_AddCharacteristic 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to add a characteristic into a service. 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** It will add a characteristic declaration and characteristic 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** value declaration into the service database identified by the 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** service handle. 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter service_handle : To which service this included service is added to. 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** char_uuid : Characteristic UUID. 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** perm : Characteristic value declaration attribute permission. 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** property : Characteristic Properties 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Characteristic value declaration attribute handle. 0 if failed. 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 GATTS_AddCharacteristic (UINT16 service_handle, tBT_UUID *p_char_uuid, 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_PERM perm,tGATT_CHAR_PROP property) 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_HDL_LIST_ELEM *p_decl; 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_decl = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL) 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 321b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("Service not created"); 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* data validity checking */ 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( ((property & GATT_CHAR_PROP_BIT_AUTH) && !(perm & GATT_WRITE_SIGNED_PERM)) || 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((perm & GATT_WRITE_SIGNED_PERM) && !(property & GATT_CHAR_PROP_BIT_AUTH)) ) 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 328b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("Invalid configuration property=0x%x perm=0x%x ", property, perm); 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return gatts_add_characteristic(&p_decl->svc_db, 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project perm, 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project property, 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_char_uuid); 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATTS_AddCharDescriptor 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to add a characteristic descriptor 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** into a service database. Add descriptor should follow add char 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to which it belongs, and next add char should be done only 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** after all add descriptors for the previous char. 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter service_handle : To which service this characteristic descriptor 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is added to. 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** perm : Characteristic value declaration attribute 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** permission. 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_descr_uuid : Characteristic descriptor UUID 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Characteristic descriptor attribute handle. 0 if add 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** characteristic descriptor failed. 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 GATTS_AddCharDescriptor (UINT16 service_handle, 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_PERM perm, 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID * p_descr_uuid) 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_HDL_LIST_ELEM *p_decl; 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_decl = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL) 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 364b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("Service not created"); 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_descr_uuid == NULL || 3687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (p_descr_uuid->len != LEN_UUID_128 && p_descr_uuid->len != LEN_UUID_16 3697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta && p_descr_uuid->len != LEN_UUID_32)) 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 371b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("Illegal parameter"); 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return gatts_add_char_descr(&p_decl->svc_db, 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project perm, 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_descr_uuid); 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATTS_DeleteService 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to delete a service. 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter gatt_if : application interface 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_svc_uuid : service UUID 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** svc_inst : instance of the service inside the application 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if operation succeed, FALSE if handle block was not found. 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN GATTS_DeleteService (tGATT_IF gatt_if, tBT_UUID *p_svc_uuid, UINT16 svc_inst) 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_HDL_LIST_INFO *p_list_info= &gatt_cb.hdl_list_info; 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_HDL_LIST_ELEM *p_list=NULL; 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i_sreg; 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_PENDING_NEW_SRV_START *p_buf; 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg = gatt_get_regcb(gatt_if); 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID *p_app_uuid128; 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 403b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("GATTS_DeleteService"); 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_reg == NULL) 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 407b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("Applicaiton not foud"); 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_app_uuid128 = &p_reg->app_uuid128; 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_list = gatt_find_hdl_buffer_by_app_id(p_app_uuid128, p_svc_uuid, svc_inst)) == NULL) 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 414b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("No Service found"); 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_buf = gatt_sr_is_new_srv_chg(&p_list->asgn_range.app_uuid128, 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_list->asgn_range.svc_uuid, 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->asgn_range.svc_inst)) != NULL) 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 422b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("Delete a new service changed item - the service has not yet started"); 423abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(fixed_queue_try_remove_from_queue(gatt_cb.pending_new_srv_start_q, p_buf)); 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_proc_srv_chg(); 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((i_sreg = gatt_sr_find_i_rcb_by_app_id (p_app_uuid128, 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_svc_uuid, 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project svc_inst)) != GATT_MAX_SR_PROFILES) 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATTS_StopService(gatt_cb.sr_reg[i_sreg].s_hdl); 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 437b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("released handles s_hdl=%u e_hdl=%u", 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->asgn_range.s_handle , p_list->asgn_range.e_handle ); 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_list->asgn_range.s_handle >= gatt_cb.hdl_cfg.app_start_hdl) 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && gatt_cb.cb_info.p_nv_save_callback) 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*gatt_cb.cb_info.p_nv_save_callback)(FALSE, &p_list->asgn_range); 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_remove_an_item_from_list(p_list_info, p_list); 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_free_hdl_buffer(p_list); 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATTS_StartService 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start a service with GATT 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter gatt_if : service handle. 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_cback : application service callback functions. 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** sup_transport : supported transport(s) for this primary service 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** return GATT_SUCCESS if sucessfully started; otherwise error code. 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTS_StartService (tGATT_IF gatt_if, UINT16 service_handle, 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TRANSPORT sup_transport) 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SR_REG *p_sreg; 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_HDL_LIST_ELEM *p_list=NULL; 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i_sreg; 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID *p_uuid; 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg = gatt_get_regcb(gatt_if); 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_PENDING_NEW_SRV_START *p_buf; 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 474b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATTS_StartService"); 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_reg == NULL) 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Not found */ 479b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("Applicaiton not found "); 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_NOT_FOUND; 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_list = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL) 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Not found */ 486b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("no service found"); 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_NOT_FOUND; 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_sr_find_i_rcb_by_app_id (&p_list->asgn_range.app_uuid128, 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_list->asgn_range.svc_uuid, 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->asgn_range.svc_inst) != GATT_MAX_SR_PROFILES) 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 494b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("Duplicate Service start - Service already started"); 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_SERVICE_STARTED; 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /*this is a new application servoce start */ 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((i_sreg = gatt_sr_alloc_rcb(p_list)) == GATT_MAX_SR_PROFILES) 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 501b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("GATTS_StartService: no free server registration block"); 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_NO_RESOURCES; 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sreg = &gatt_cb.sr_reg[i_sreg]; 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sreg->gatt_if = gatt_if; 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (sup_transport) 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_TRANSPORT_BR_EDR: 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_TRANSPORT_LE_BR_EDR: 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_sreg->type == GATT_UUID_PRI_SERVICE) 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_uuid = gatts_get_service_uuid (p_sreg->p_db); 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sreg->sdp_handle = gatt_add_sdp_record(p_uuid, p_sreg->s_hdl, p_sreg->e_hdl); 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatts_update_srv_list_elem(i_sreg, p_sreg->s_hdl, 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->asgn_range.is_primary); 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_add_a_srv_to_list(&gatt_cb.srv_list_info, &gatt_cb.srv_list[i_sreg]); 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 528b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("allocated i_sreg=%d ",i_sreg); 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 530b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("s_hdl=%d e_hdl=%d type=0x%x svc_inst=%d sdp_hdl=0x%x", 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sreg->s_hdl,p_sreg->e_hdl, 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sreg->type, p_sreg->service_instance, 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sreg->sdp_handle); 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_buf = gatt_sr_is_new_srv_chg(&p_list->asgn_range.app_uuid128, 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_list->asgn_range.svc_uuid, 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_list->asgn_range.svc_inst)) != NULL) 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_proc_srv_chg(); 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove the new service element after the srv changed processing is completed*/ 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 543abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(fixed_queue_try_remove_from_queue(gatt_cb.pending_new_srv_start_q, p_buf)); 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_SUCCESS; 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATTS_StopService 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to stop a service 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter service_handle : this is the start handle of a service 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid GATTS_StopService (UINT16 service_handle) 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 ii = gatt_sr_find_i_rcb_by_handle(service_handle); 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 563b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API("GATTS_StopService %u", service_handle); 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Index 0 is reserved for GATT, and is never stopped */ 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (ii > 0) && (ii < GATT_MAX_SR_PROFILES) && (gatt_cb.sr_reg[ii].in_use) ) 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_cb.sr_reg[ii].sdp_handle) 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SDP_DeleteRecord(gatt_cb.sr_reg[ii].sdp_handle); 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_remove_a_srv_from_list(&gatt_cb.srv_list_info, &gatt_cb.srv_list[ii]); 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.srv_list[ii].in_use = FALSE; 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (&gatt_cb.sr_reg[ii], 0, sizeof(tGATT_SR_REG)); 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 578b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("GATTS_StopService service_handle: %u is not in use", service_handle); 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATTs_HandleValueIndication 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends a handle value indication to a client. 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter conn_id: connection identifier. 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** attr_handle: Attribute handle of this handle value indication. 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** val_len: Length of the indicated attribute value. 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_val: Pointer to the indicated attribute value data. 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GATT_SUCCESS if sucessfully sent or queued; otherwise error code. 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTS_HandleValueIndication (UINT16 conn_id, UINT16 attr_handle, UINT16 val_len, UINT8 *p_val) 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 59717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach tGATT_STATUS cmd_status = GATT_NO_RESOURCES; 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_VALUE indication; 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_msg; 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_VALUE *p_buf; 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_IF gatt_if = GATT_GET_GATT_IF(conn_id); 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg = gatt_get_regcb(gatt_if); 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx); 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 608b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATTS_HandleValueIndication"); 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_reg == NULL) || (p_tcb == NULL)) 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 611b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("GATTS_HandleValueIndication Unknown conn_id: %u ", conn_id); 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(tGATT_STATUS) GATT_INVALID_CONN_ID; 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 61417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach 61517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach if (! GATT_HANDLE_IS_VALID (attr_handle)) 61617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach return GATT_ILLEGAL_PARAMETER; 61717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project indication.conn_id = conn_id; 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project indication.handle = attr_handle; 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project indication.len = val_len; 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (indication.value, p_val, val_len); 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project indication.auth_req = GATT_AUTH_REQ_NONE; 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 62417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach if (GATT_HANDLE_IS_VALID(p_tcb->indicate_handle)) 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6264dcde90649cc51ca815a50d338a73adb408ab258Matthew Xie GATT_TRACE_DEBUG ("Add a pending indication"); 62717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach if ((p_buf = gatt_add_pending_ind(p_tcb, &indication)) !=NULL) 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 62917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach cmd_status = GATT_SUCCESS; 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 63317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach cmd_status = GATT_NO_RESOURCES; 63417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach } 63517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach } 63617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach else 63717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach { 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 63917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach if ( (p_msg = attp_build_sr_msg (p_tcb, GATT_HANDLE_VALUE_IND, (tGATT_SR_MSG *)&indication)) != NULL) 64017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach { 64117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach cmd_status = attp_send_sr_msg (p_tcb, p_msg); 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 64317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach if (cmd_status == GATT_SUCCESS || cmd_status == GATT_CONGESTED) 64417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach { 64517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach p_tcb->indicate_handle = indication.handle; 64617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach gatt_start_conf_timer(p_tcb); 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return cmd_status; 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATTS_HandleValueNotification 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends a handle value notification to a client. 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter conn_id: connection identifier. 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** attr_handle: Attribute handle of this handle value indication. 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** val_len: Length of the indicated attribute value. 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_val: Pointer to the indicated attribute value data. 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GATT_SUCCESS if sucessfully sent; otherwise error code. 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTS_HandleValueNotification (UINT16 conn_id, UINT16 attr_handle, 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 val_len, UINT8 *p_val) 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS cmd_sent = GATT_ILLEGAL_PARAMETER; 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_VALUE notif; 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_IF gatt_if = GATT_GET_GATT_IF(conn_id); 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg = gatt_get_regcb(gatt_if); 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx); 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 678b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATTS_HandleValueNotification"); 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_reg == NULL) || (p_tcb == NULL)) 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 682b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("GATTS_HandleValueNotification Unknown conn_id: %u ", conn_id); 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(tGATT_STATUS) GATT_INVALID_CONN_ID; 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (GATT_HANDLE_IS_VALID (attr_handle)) 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project notif.handle = attr_handle; 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project notif.len = val_len; 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (notif.value, p_val, val_len); 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project notif.auth_req = GATT_AUTH_REQ_NONE;; 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_buf = attp_build_sr_msg (p_tcb, GATT_HANDLE_VALUE_NOTIF, (tGATT_SR_MSG *)¬if)) 6947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta != NULL) 6957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 6967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta cmd_sent = attp_send_sr_msg (p_tcb, p_buf); 6977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 6987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 6997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta cmd_sent = GATT_NO_RESOURCES; 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return cmd_sent; 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATTS_SendRsp 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends the server response to client. 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter conn_id: connection identifier. 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** trans_id: transaction id 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** status: response status 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_msg: pointer to message parameters structure. 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GATT_SUCCESS if sucessfully sent; otherwise error code. 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTS_SendRsp (UINT16 conn_id, UINT32 trans_id, 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS status, tGATTS_RSP *p_msg) 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS cmd_sent = GATT_ILLEGAL_PARAMETER; 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_IF gatt_if = GATT_GET_GATT_IF(conn_id); 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg = gatt_get_regcb(gatt_if); 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx); 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 727b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATTS_SendRsp: conn_id: %u trans_id: %u Status: 0x%04x", 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_id, trans_id, status); 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_reg == NULL) || (p_tcb == NULL)) 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 732b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("GATTS_SendRsp Unknown conn_id: %u ", conn_id); 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(tGATT_STATUS) GATT_INVALID_CONN_ID; 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->sr_cmd.trans_id != trans_id) 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 738b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("GATTS_SendRsp conn_id: %u waiting for op_code = %02x", 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_id, p_tcb->sr_cmd.op_code); 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(GATT_WRONG_STATE); 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Process App response */ 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cmd_sent = gatt_sr_process_app_rsp (p_tcb, gatt_if, trans_id, p_tcb->sr_cmd.op_code, status, p_msg); 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return cmd_sent; 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************/ 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* GATT Profile Srvr Functions */ 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************/ 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************/ 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* */ 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* GATT CLIENT APIs */ 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* */ 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************/ 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATTC_ConfigureMTU 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to configure the ATT MTU size. 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters conn_id: connection identifier. 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mtu - attribute MTU size.. 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GATT_SUCCESS if command started successfully. 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTC_ConfigureMTU (UINT16 conn_id, UINT16 mtu) 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 ret = GATT_NO_RESOURCES; 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_IF gatt_if=GATT_GET_GATT_IF(conn_id); 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx); 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg = gatt_get_regcb(gatt_if); 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_CLCB *p_clcb; 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 782b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATTC_ConfigureMTU conn_id=%d mtu=%d", conn_id, mtu ); 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 784cf3103308da07eba540b5918cdc472bc7fbcd1fbMudumba Ananth /* Validate that the link is BLE, not BR/EDR */ 785cf3103308da07eba540b5918cdc472bc7fbcd1fbMudumba Ananth if (p_tcb->transport != BT_TRANSPORT_LE) 786cf3103308da07eba540b5918cdc472bc7fbcd1fbMudumba Ananth { 787cf3103308da07eba540b5918cdc472bc7fbcd1fbMudumba Ananth return GATT_ERROR; 788cf3103308da07eba540b5918cdc472bc7fbcd1fbMudumba Ananth } 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_tcb == NULL) || (p_reg==NULL) || (mtu < GATT_DEF_BLE_MTU_SIZE) || (mtu > GATT_MAX_MTU_SIZE)) 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_ILLEGAL_PARAMETER; 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_is_clcb_allocated(conn_id)) 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 797b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("GATTC_ConfigureMTU GATT_BUSY conn_id = %d", conn_id); 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_BUSY; 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_clcb = gatt_clcb_alloc(conn_id)) != NULL) 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->p_tcb->payload_size = mtu; 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->operation = GATTC_OPTYPE_CONFIG; 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret = attp_send_cl_msg (p_clcb->p_tcb, p_clcb->clcb_idx, GATT_REQ_MTU, (tGATT_CL_MSG *)&mtu); 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ret; 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATTC_Discover 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to do a discovery procedure on ATT server. 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters conn_id: connection identifier. 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** disc_type:discovery type. 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_param: parameters of discovery requirement. 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GATT_SUCCESS if command received/sent successfully. 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTC_Discover (UINT16 conn_id, tGATT_DISC_TYPE disc_type, 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_DISC_PARAM *p_param) 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS status = GATT_SUCCESS; 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_CLCB *p_clcb; 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_IF gatt_if=GATT_GET_GATT_IF(conn_id); 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx); 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg = gatt_get_regcb(gatt_if); 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 836b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATTC_Discover conn_id=%d disc_type=%d",conn_id, disc_type); 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_tcb == NULL) || (p_reg==NULL) ||(p_param == NULL) || 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (disc_type >= GATT_DISC_MAX)) 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 841b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("GATTC_Discover Illegal param: disc_type %d conn_id = %d", disc_type, conn_id); 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_ILLEGAL_PARAMETER; 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_is_clcb_allocated(conn_id)) 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 848b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("GATTC_Discover GATT_BUSY conn_id = %d", conn_id); 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_BUSY; 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_clcb = gatt_clcb_alloc(conn_id)) != NULL ) 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!GATT_HANDLE_IS_VALID(p_param->s_handle) || 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !GATT_HANDLE_IS_VALID(p_param->e_handle) || 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* search by type does not have a valid UUID param */ 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (disc_type == GATT_DISC_SRVC_BY_UUID && 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_param->service.len == 0)) 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 861ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_clcb_dealloc(p_clcb); 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_ILLEGAL_PARAMETER; 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->operation = GATTC_OPTYPE_DISCOVERY; 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->op_subtype = disc_type; 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->s_handle = p_param->s_handle; 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->e_handle = p_param->e_handle; 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->uuid = p_param->service; 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_act_discovery(p_clcb); 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_NO_RESOURCES; 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATTC_Read 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to read the value of an attribute from 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the server. 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters conn_id: connection identifier. 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** type - attribute read type. 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_read - read operation parameters. 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GATT_SUCCESS if command started successfully. 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTC_Read (UINT16 conn_id, tGATT_READ_TYPE type, tGATT_READ_PARAM *p_read) 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS status = GATT_SUCCESS; 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_CLCB *p_clcb; 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_IF gatt_if=GATT_GET_GATT_IF(conn_id); 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx); 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg = gatt_get_regcb(gatt_if); 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 904b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATTC_Read conn_id=%d type=%d", conn_id, type); 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_tcb == NULL) || (p_reg==NULL) || (p_read == NULL) || ((type >= GATT_READ_MAX) || (type == 0))) 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 908b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("GATT_Read Illegal param: conn_id %d, type 0%d,", conn_id, type); 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_ILLEGAL_PARAMETER; 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_is_clcb_allocated(conn_id)) 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 914b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("GATTC_Read GATT_BUSY conn_id = %d", conn_id); 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_BUSY; 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_clcb = gatt_clcb_alloc(conn_id)) != NULL ) 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->operation = GATTC_OPTYPE_READ; 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->op_subtype = type; 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->auth_req = p_read->by_handle.auth_req; 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->counter = 0; 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (type) 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_READ_BY_TYPE: 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_READ_CHAR_VALUE: 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->s_handle = p_read->service.s_handle; 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->e_handle = p_read->service.e_handle; 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_clcb->uuid, &p_read->service.uuid, sizeof(tBT_UUID)); 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_READ_MULTIPLE: 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->s_handle = 0; 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* copy multiple handles in CB */ 9365fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov tGATT_READ_MULTI *p_read_multi = 9375fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov (tGATT_READ_MULTI *)osi_malloc(sizeof(tGATT_READ_MULTI)); 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->p_attr_buf = (UINT8*)p_read_multi; 9395fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov memcpy(p_read_multi, &p_read->read_multiple, sizeof(tGATT_READ_MULTI)); 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_READ_BY_HANDLE: 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case GATT_READ_PARTIAL: 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&p_clcb->uuid, 0, sizeof(tBT_UUID)); 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->s_handle = p_read->by_handle.handle; 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (type == GATT_READ_PARTIAL) 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->counter = p_read->partial.offset; 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start security check */ 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_security_check_start(p_clcb) == FALSE) 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_NO_RESOURCES; 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_clcb_dealloc(p_clcb); 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_NO_RESOURCES; 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATTC_Write 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to write the value of an attribute to 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the server. 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters conn_id: connection identifier. 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** type - attribute write type. 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_write - write operation parameters. 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GATT_SUCCESS if command started successfully. 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTC_Write (UINT16 conn_id, tGATT_WRITE_TYPE type, tGATT_VALUE *p_write) 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS status = GATT_SUCCESS; 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_CLCB *p_clcb; 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_VALUE *p; 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_IF gatt_if=GATT_GET_GATT_IF(conn_id); 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx); 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg = gatt_get_regcb(gatt_if); 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_tcb == NULL) || (p_reg==NULL) || (p_write == NULL) || 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((type != GATT_WRITE) && (type != GATT_WRITE_PREPARE) && (type != GATT_WRITE_NO_RSP)) ) 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 995b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("GATT_Write Illegal param: conn_id %d, type 0%d,", conn_id, type); 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_ILLEGAL_PARAMETER; 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_is_clcb_allocated(conn_id)) 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1001b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("GATTC_Write GATT_BUSY conn_id = %d", conn_id); 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_BUSY; 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_clcb = gatt_clcb_alloc(conn_id)) != NULL ) 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->operation = GATTC_OPTYPE_WRITE; 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->op_subtype = type; 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->auth_req = p_write->auth_req; 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10115fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_clcb->p_attr_buf = (UINT8 *)osi_malloc(sizeof(tGATT_VALUE)); 10125fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov memcpy(p_clcb->p_attr_buf, (void *)p_write, sizeof(tGATT_VALUE)); 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10145fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p = (tGATT_VALUE *)p_clcb->p_attr_buf; 10155fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov if (type == GATT_WRITE_PREPARE) { 10165fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_clcb->start_offset = p_write->offset; 10175fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p->offset = 0; 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10195fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov 10205fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov if (gatt_security_check_start(p_clcb) == FALSE) { 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_NO_RESOURCES; 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == GATT_NO_RESOURCES) 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_clcb_dealloc(p_clcb); 10265fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov } else { 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_NO_RESOURCES; 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATTC_ExecuteWrite 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to send an Execute write request to 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the server. 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters conn_id: connection identifier. 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is_execute - to execute or cancel the prepare write requet(s) 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GATT_SUCCESS if command started successfully. 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTC_ExecuteWrite (UINT16 conn_id, BOOLEAN is_execute) 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS status = GATT_SUCCESS; 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_CLCB *p_clcb; 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_EXEC_FLAG flag; 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_IF gatt_if=GATT_GET_GATT_IF(conn_id); 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx); 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg = gatt_get_regcb(gatt_if); 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1056b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATTC_ExecuteWrite conn_id=%d is_execute=%d", conn_id, is_execute); 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_tcb == NULL) || (p_reg==NULL) ) 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1060b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("GATTC_ExecuteWrite Illegal param: conn_id %d", conn_id); 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_ILLEGAL_PARAMETER; 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_is_clcb_allocated(conn_id)) 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1066b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("GATTC_Write GATT_BUSY conn_id = %d", conn_id); 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GATT_BUSY; 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_clcb = gatt_clcb_alloc(conn_id)) != NULL) 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_clcb->operation = GATTC_OPTYPE_EXE_WRITE; 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project flag = is_execute ? GATT_PREP_WRITE_EXEC : GATT_PREP_WRITE_CANCEL; 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_send_queue_write_cancel (p_clcb->p_tcb, p_clcb, flag); 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1078b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("Unable to allocate client CB for conn_id %d ", conn_id); 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = GATT_NO_RESOURCES; 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATTC_SendHandleValueConfirm 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to send a handle value confirmation 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** as response to a handle value notification from server. 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters conn_id: connection identifier. 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** handle: the handle of the attribute confirmation. 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GATT_SUCCESS if command started successfully. 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATTC_SendHandleValueConfirm (UINT16 conn_id, UINT16 handle) 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS ret = GATT_ILLEGAL_PARAMETER; 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb=gatt_get_tcb_by_idx(GATT_GET_TCB_IDX(conn_id)); 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1102b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATTC_SendHandleValueConfirm conn_id=%d handle=0x%x", conn_id, handle); 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb) 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->ind_count > 0 ) 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 110878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(p_tcb->ind_ack_timer); 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1110b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("notif_count=%d ", p_tcb->ind_count); 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send confirmation now */ 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret = attp_send_cl_msg(p_tcb, 0, GATT_HANDLE_VALUE_CONF, (tGATT_CL_MSG *)&handle); 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->ind_count = 0; 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1119b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("GATTC_SendHandleValueConfirm - conn_id: %u - ignored not waiting for indicaiton ack", conn_id); 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret = GATT_SUCCESS; 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1125b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("GATTC_SendHandleValueConfirm - Unknown conn_id: %u", conn_id); 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ret; 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************/ 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* */ 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* GATT APIs */ 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* */ 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************/ 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATT_SetIdleTimeout 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function (common to both client and server) sets the idle 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** timeout for a tansport connection 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter bd_addr: target device bd address. 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** idle_tout: timeout value in seconds. 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battavoid GATT_SetIdleTimeout (BD_ADDR bd_addr, UINT16 idle_tout, tBT_TRANSPORT transport) 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb; 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status = FALSE; 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_tcb = gatt_find_tcb_by_addr (bd_addr, transport)) != NULL) 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->att_lcid == L2CAP_ATT_CID) 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = L2CA_SetFixedChannelTout (bd_addr, L2CAP_ATT_CID, idle_tout); 1159444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1160444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (idle_tout == GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP) 1161444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji L2CA_SetIdleTimeoutByBdAddr(p_tcb->peer_bda, 1162444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP, BT_TRANSPORT_LE); 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = L2CA_SetIdleTimeout (p_tcb->att_lcid, idle_tout, FALSE); 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1170b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATT_SetIdleTimeout idle_tout=%d status=%d(1-OK 0-not performed)", 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project idle_tout, status); 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATT_Register 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to register an application 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with GATT 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter p_app_uuid128: Application UUID 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_cb_info: callback functions. 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 0 for error, otherwise the index of the client registered with GATT 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_IF GATT_Register (tBT_UUID *p_app_uuid128, tGATT_CBACK *p_cb_info) 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg; 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i_gatt_if=0; 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_IF gatt_if=0; 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1194ae5066bc3293c9ca6953659fe661316c750f631dJakub Pawlowski GATT_TRACE_API ("%s", __func__); 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_dbg_display_uuid(*p_app_uuid128); 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i_gatt_if = 0, p_reg = gatt_cb.cl_rcb; i_gatt_if < GATT_MAX_APPS; i_gatt_if++, p_reg++) 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_reg->in_use && !memcmp(p_app_uuid128->uu.uuid128, p_reg->app_uuid128.uu.uuid128, LEN_UUID_128)) 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1201b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("application already registered."); 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i_gatt_if = 0, p_reg = gatt_cb.cl_rcb; i_gatt_if < GATT_MAX_APPS; i_gatt_if++, p_reg++) 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_reg->in_use) 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_reg, 0 , sizeof(tGATT_REG)); 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i_gatt_if++; /* one based number */ 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_reg->app_uuid128 = *p_app_uuid128; 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_if = 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_reg->gatt_if = (tGATT_IF)i_gatt_if; 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_reg->app_cb = *p_cb_info; 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_reg->in_use = TRUE; 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1218ae5066bc3293c9ca6953659fe661316c750f631dJakub Pawlowski GATT_TRACE_API ("%s: allocated gatt_if=%d", __func__, gatt_if); 1219ae5066bc3293c9ca6953659fe661316c750f631dJakub Pawlowski return gatt_if; 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1222ae5066bc3293c9ca6953659fe661316c750f631dJakub Pawlowski 1223ae5066bc3293c9ca6953659fe661316c750f631dJakub Pawlowski GATT_TRACE_ERROR ("%s: can't Register GATT client, MAX client reached!", __func__); 1224ae5066bc3293c9ca6953659fe661316c750f631dJakub Pawlowski return 0; 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATT_Deregister 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function deregistered the application from GATT. 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters gatt_if: applicaiton interface. 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None. 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid GATT_Deregister (tGATT_IF gatt_if) 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg = gatt_get_regcb(gatt_if); 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb; 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_CLCB *p_clcb; 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i, ii, j; 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_SR_REG *p_sreg; 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1247b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATT_Deregister gatt_if=%d", gatt_if); 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Index 0 is GAP and is never deregistered */ 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (gatt_if == 0) || (p_reg == NULL) ) 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1251b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("GATT_Deregister with invalid gatt_if: %u", gatt_if); 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* stop all services */ 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* todo an applcaiton can not be deregistered if its services is also used by other application 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project deregisteration need to bed performed in an orderly fashion 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project no check for now */ 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (ii = 0, p_sreg = gatt_cb.sr_reg; ii < GATT_MAX_SR_PROFILES; ii++, p_sreg++) 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_sreg->in_use && (p_sreg->gatt_if == gatt_if)) 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATTS_StopService(p_sreg->s_hdl); 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* free all services db buffers if owned by this application */ 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_free_srvc_db_buffer_app_id(&p_reg->app_uuid128); 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* When an application deregisters, check remove the link associated with the app */ 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i=0, p_tcb = gatt_cb.tcb; i < GATT_MAX_PHY_CHANNEL; i++, p_tcb++) 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->in_use) 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_get_ch_state(p_tcb) != GATT_CH_CLOSE) 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12795b53ab9f5d2144f4d6c0a456f1781e89ec598fe2Jakub Pawlowski gatt_update_app_use_link_flag(gatt_if, p_tcb, FALSE, TRUE); 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (j = 0, p_clcb= &gatt_cb.clcb[j]; j < GATT_CL_MAX_LCB; j++, p_clcb++) 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_clcb->in_use && 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_clcb->p_reg->gatt_if == gatt_if) && 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_clcb->p_tcb->tcb_idx == p_tcb->tcb_idx)) 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 128878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(p_clcb->gatt_rsp_timer_ent); 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_clcb_dealloc (p_clcb); 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_deregister_bgdev_list(gatt_if); 1297e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach /* update the listen mode */ 1298602162a13c6ed8abae53aee6deeda48b79f30911Zhihai Xu#if (defined(BLE_PERIPHERAL_MODE_SUPPORT) && (BLE_PERIPHERAL_MODE_SUPPORT == TRUE)) 1299e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach GATT_Listen(gatt_if, FALSE, NULL); 1300eeeac99328c23304ab24698331b6600f3b545700Andre Eisenbach#endif 1301e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach 13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (p_reg, 0, sizeof(tGATT_REG)); 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATT_StartIf 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called after registration to start receiving 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** callbacks for registered interface. Function may call back 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with connection status and queued notifications 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter gatt_if: applicaiton interface. 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1316accf8811ddb623ea50b23b4dd9609661b6bf4718Steve Gu** Returns None. 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid GATT_StartIf (tGATT_IF gatt_if) 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg; 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb; 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR bda; 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 start_idx, found_idx; 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 conn_id; 13267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tGATT_TRANSPORT transport ; 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1328b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATT_StartIf gatt_if=%d", gatt_if); 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_reg = gatt_get_regcb(gatt_if)) != NULL) 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start_idx = 0; 13327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta while (gatt_find_the_connected_bda(start_idx, bda, &found_idx, &transport)) 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_tcb = gatt_find_tcb_by_addr(bda, transport); 1335ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_reg->app_cb.p_conn_cb && p_tcb) 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, gatt_if); 13387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_reg->app_cb.p_conn_cb)(gatt_if, bda, conn_id, TRUE, 0, transport); 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start_idx = ++found_idx; 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATT_Connect 13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1350ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function initiate a connecttion to a remote device on GATT 1351ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** channel. 13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters gatt_if: applicaiton interface 13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bd_addr: peer device address. 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is_direct: is a direct conenection or a background auto connection 13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if connection started; FALSE if connection start failure. 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN GATT_Connect (tGATT_IF gatt_if, BD_ADDR bd_addr, BOOLEAN is_direct, tBT_TRANSPORT transport) 13617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg; 13637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BOOLEAN status = FALSE; 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1365b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATT_Connect gatt_if=%d", gatt_if); 13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure app is registered */ 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_reg = gatt_get_regcb(gatt_if)) == NULL) 13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1370b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("GATT_Connect - gatt_if =%d is not registered", gatt_if); 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_direct) 13757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta status = gatt_act_connect (p_reg, bd_addr, transport); 13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 13787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_LE) 1379ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta status = gatt_update_auto_connect_dev(gatt_if,TRUE, bd_addr, TRUE); 13807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 13817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1382b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("Unsupported transport for background connection"); 13837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 13847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATT_CancelConnect 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1394ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function terminate the connection initaition to a remote 1395ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** device on GATT channel. 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters gatt_if: client interface. If 0 used as unconditionally disconnect, 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** typically used for direct connection cancellation. 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bd_addr: peer device address. 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if connection started; FALSE if connection start failure. 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN GATT_CancelConnect (tGATT_IF gatt_if, BD_ADDR bd_addr, BOOLEAN is_direct){ 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg; 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb; 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status = TRUE; 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_IF temp_gatt_if; 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 start_idx, found_idx; 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1411b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATT_CancelConnect gatt_if=%d", gatt_if); 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((gatt_if != 0) && ((p_reg = gatt_get_regcb(gatt_if)) == NULL)) 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1415b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("GATT_CancelConnect - gatt_if =%d is not registered", gatt_if); 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_direct) 14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!gatt_if) 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1423b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("GATT_CancelConnect - unconditional"); 14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start_idx = 0; 14257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* only LE connection can be cancelled */ 14267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE); 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb && gatt_num_apps_hold_link(p_tcb)) 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (status && gatt_find_app_hold_link(p_tcb, start_idx, &found_idx, &temp_gatt_if)) 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = gatt_cancel_open(temp_gatt_if, bd_addr); 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start_idx = ++found_idx; 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1437b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("GATT_CancelConnect - no app found"); 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = FALSE; 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = gatt_cancel_open(gatt_if, bd_addr); 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!gatt_if) 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_get_num_apps_for_bg_dev(bd_addr)) 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (gatt_find_app_for_bg_dev(bd_addr, &temp_gatt_if)) 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_remove_bg_dev_for_app(temp_gatt_if, bd_addr); 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1457b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("GATT_CancelConnect -no app associated with the bg device for unconditional removal"); 14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = FALSE; 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = gatt_remove_bg_dev_for_app(gatt_if, bd_addr); 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATT_Disconnect 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1474ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function disconnect the GATT channel for this registered 1475ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** application. 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters conn_id: connection identifier. 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GATT_SUCCESS if disconnected. 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS GATT_Disconnect (UINT16 conn_id) 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_STATUS ret = GATT_ILLEGAL_PARAMETER; 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb=NULL; 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_IF gatt_if=GATT_GET_GATT_IF(conn_id); 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); 14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1489b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATT_Disconnect conn_id=%d ", conn_id); 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb = gatt_get_tcb_by_idx(tcb_idx); 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb) 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14955b53ab9f5d2144f4d6c0a456f1781e89ec598fe2Jakub Pawlowski gatt_update_app_use_link_flag(gatt_if, p_tcb, FALSE, TRUE); 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret = GATT_SUCCESS; 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ret; 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATT_GetConnectionInfor 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function use conn_id to find its associated BD address and applciation 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** interface 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters conn_id: connection id (input) 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_gatt_if: applicaiton interface (output) 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bd_addr: peer device address. (output) 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE the ligical link information is found for conn_id 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN GATT_GetConnectionInfor(UINT16 conn_id, tGATT_IF *p_gatt_if, BD_ADDR bd_addr, 15177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_TRANSPORT *p_transport) 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_IF gatt_if = GATT_GET_GATT_IF(conn_id); 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg = gatt_get_regcb(gatt_if); 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb= gatt_get_tcb_by_idx(tcb_idx); 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status=FALSE; 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1526b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATT_GetConnectionInfor conn_id=%d", conn_id); 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb && p_reg ) 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(bd_addr, p_tcb->peer_bda, BD_ADDR_LEN); 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_gatt_if = gatt_if; 15327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta *p_transport = p_tcb->transport; 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = TRUE; 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GATT_GetConnIdIfConnected 15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function find the conn_id if the logical link for BD address 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** and applciation interface is connected 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters gatt_if: applicaiton interface (input) 15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bd_addr: peer device address. (input) 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_conn_id: connection id (output) 15497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** transport: transport option 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15516975b4d711142b885af479721cada448952c6b41Andre Eisenbach** Returns TRUE the logical link is connected 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN GATT_GetConnIdIfConnected(tGATT_IF gatt_if, BD_ADDR bd_addr, UINT16 *p_conn_id, 15557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_TRANSPORT transport) 15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg = gatt_get_regcb(gatt_if); 15587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tGATT_TCB *p_tcb= gatt_find_tcb_by_addr(bd_addr, transport); 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status=FALSE; 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_reg && p_tcb && (gatt_get_ch_state(p_tcb) == GATT_CH_OPEN) ) 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, gatt_if); 15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = TRUE; 15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1567b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATT_GetConnIdIfConnected status=%d", status); 15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1572ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 1573ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1574ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function GATT_Listen 1575ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1576ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function start or stop LE advertisement and listen for 1577ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** connection. 1578ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1579ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters gatt_if: applicaiton interface 1580ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** p_bd_addr: listen for specific address connection, or NULL for 1581ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** listen to all device connection. 1582e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach** start: start or stop listening. 1583ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1584ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns TRUE if advertisement is started; FALSE if adv start failure. 1585ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1586ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 1587ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN GATT_Listen (tGATT_IF gatt_if, BOOLEAN start, BD_ADDR_PTR bd_addr) 1588ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 1589ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGATT_REG *p_reg; 1590ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1591b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_API ("GATT_Listen gatt_if=%d", gatt_if); 1592ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1593ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Make sure app is registered */ 1594ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_reg = gatt_get_regcb(gatt_if)) == NULL) 1595ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1596b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("GATT_Listen - gatt_if =%d is not registered", gatt_if); 1597ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return(FALSE); 1598ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1599ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1600ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (bd_addr != NULL) 1601ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1602f1c764fab01c929f71e185b97433bf40938026d3Sharvil Nanavati gatt_update_auto_connect_dev(gatt_if,start, bd_addr, FALSE); 1603ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1604ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 1605ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1606ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_reg->listening = start ? GATT_LISTEN_TO_ALL : GATT_LISTEN_TO_NONE; 1607ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1608ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 16097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return gatt_update_listen_mode(); 1610ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 1611ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1612ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1614