15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2008-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * this file contains the main ATT functions 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gatt_int.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_ble_int.h" 345cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Configuration flags. */ 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define GATT_L2C_CFG_IND_DONE (1<<0) 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define GATT_L2C_CFG_CFM_DONE (1<<1) 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 406975b4d711142b885af479721cada448952c6b41Andre Eisenbach/* minimum GATT MTU size over BR/EDR link 416975b4d711142b885af479721cada448952c6b41Andre Eisenbach*/ 426975b4d711142b885af479721cada448952c6b41Andre Eisenbach#define GATT_MIN_BR_MTU_SIZE 48 436975b4d711142b885af479721cada448952c6b41Andre Eisenbach 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/ 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* L O C A L F U N C T I O N P R O T O T Y P E S */ 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/ 477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic void gatt_le_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason, tBT_TRANSPORT transport); 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void gatt_le_data_ind (BD_ADDR bd_addr, BT_HDR *p_buf); 4917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbachstatic void gatt_le_cong_cback(BD_ADDR remote_bda, BOOLEAN congest); 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void gatt_l2cif_connect_ind_cback (BD_ADDR bd_addr, UINT16 l2cap_cid, UINT16 psm, UINT8 l2cap_id); 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void gatt_l2cif_connect_cfm_cback (UINT16 l2cap_cid, UINT16 result); 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void gatt_l2cif_config_ind_cback (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg); 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void gatt_l2cif_config_cfm_cback (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg); 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void gatt_l2cif_disconnect_ind_cback (UINT16 l2cap_cid, BOOLEAN ack_needed); 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void gatt_l2cif_disconnect_cfm_cback (UINT16 l2cap_cid, UINT16 result); 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void gatt_l2cif_data_ind_cback (UINT16 l2cap_cid, BT_HDR *p_msg); 58ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gatt_send_conn_cback (tGATT_TCB *p_tcb); 5917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbachstatic void gatt_l2cif_congest_cback (UINT16 cid, BOOLEAN congested); 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const tL2CAP_APPL_INFO dyn_info = 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_l2cif_connect_ind_cback, 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_l2cif_connect_cfm_cback, 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_l2cif_config_ind_cback, 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_l2cif_config_cfm_cback, 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_l2cif_disconnect_ind_cback, 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_l2cif_disconnect_cfm_cback, 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_l2cif_data_ind_cback, 7217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach gatt_l2cif_congest_cback, 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} ; 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if GATT_DYNAMIC_MEMORY == FALSE 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_CB gatt_cb; 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_init 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is enable the GATT profile on the device. 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** It clears out the control blocks, and registers with L2CAP. 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_init (void) 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_FIXED_CHNL_REG fixed_reg; 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 94b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_init()"); 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (&gatt_cb, 0, sizeof(tGATT_CB)); 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(GATT_INITIAL_TRACE_LEVEL) 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.trace_level = GATT_INITIAL_TRACE_LEVEL; 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.trace_level = BT_TRACE_LEVEL_NONE; /* No traces */ 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.def_mtu_size = GATT_DEF_BLE_MTU_SIZE; 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_init_q (&gatt_cb.sign_op_queue); 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* First, register fixed L2CAP channel for ATT over BLE */ 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.fixed_chnl_opts.mode = L2CAP_FCR_BASIC_MODE; 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.fixed_chnl_opts.max_transmit = 0xFF; 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.fixed_chnl_opts.rtrans_tout = 2000; 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.fixed_chnl_opts.mon_tout = 12000; 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.fixed_chnl_opts.mps = 670; 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.fixed_chnl_opts.tx_win_sz = 1; 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.pL2CA_FixedConn_Cb = gatt_le_connect_cback; 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.pL2CA_FixedData_Cb = gatt_le_data_ind; 11517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach fixed_reg.pL2CA_FixedCong_Cb = gatt_le_cong_cback; /* congestion callback */ 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fixed_reg.default_idle_tout = 0xffff; /* 0xffff default idle timeout */ 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_RegisterFixedChannel (L2CAP_ATT_CID, &fixed_reg); 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Now, register with L2CAP for ATT PSM over BR/EDR */ 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!L2CA_Register (BT_PSM_ATT, (tL2CAP_APPL_INFO *) &dyn_info)) 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 123b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("ATT Dynamic Registration failed"); 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_ATT, BTM_SEC_NONE, BT_PSM_ATT, 0, 0); 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_ATT, BTM_SEC_NONE, BT_PSM_ATT, 0, 0); 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.hdl_cfg.gatt_start_hdl = GATT_GATT_START_HANDLE; 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.hdl_cfg.gap_start_hdl = GATT_GAP_START_HANDLE; 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.hdl_cfg.app_start_hdl = GATT_APP_START_HANDLE; 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_profile_db_init(); 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_connect 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to initiate a connection to a peer device. 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter rem_bda: remote device address to connect to. 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if connection is started, otherwise return FALSE. 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN gatt_connect (BD_ADDR rem_bda, tGATT_TCB *p_tcb, tBT_TRANSPORT transport) 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1516975b4d711142b885af479721cada448952c6b41Andre Eisenbach BOOLEAN gatt_ret = FALSE; 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 153ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (gatt_get_ch_state(p_tcb) != GATT_CH_OPEN) 154ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_set_ch_state(p_tcb, GATT_CH_CONN); 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_LE) 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->att_lcid = L2CAP_ATT_CID; 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_ret = L2CA_ConnectFixedChnl (L2CAP_ATT_CID, rem_bda); 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1636975b4d711142b885af479721cada448952c6b41Andre Eisenbach if ((p_tcb->att_lcid = L2CA_ConnectReq(BT_PSM_ATT, rem_bda)) != 0) 1646975b4d711142b885af479721cada448952c6b41Andre Eisenbach gatt_ret = TRUE; 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return gatt_ret; 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_disconnect 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to disconnect to an ATT device. 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameter p_tcb: pointer to the TCB to disconnect. 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE: if connection found and to be disconnected; otherwise 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** return FALSE. 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN gatt_disconnect (tGATT_TCB *p_tcb) 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN ret = FALSE; 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_CH_STATE ch_state; 186b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("gatt_disconnect "); 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb != NULL) 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret = TRUE; 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (ch_state = gatt_get_ch_state(p_tcb)) != GATT_CH_CLOSING ) 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->att_lcid == L2CAP_ATT_CID) 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ch_state == GATT_CH_OPEN) 196ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* only LCB exist between remote device and local */ 1987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ret = L2CA_RemoveFixedChnl (L2CAP_ATT_CID, p_tcb->peer_bda); 199ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_set_ch_state(p_tcb, GATT_CH_CLOSING); 2037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ret = L2CA_CancelBleConnectReq (p_tcb->peer_bda); 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret = L2CA_DisconnectReq(p_tcb->att_lcid); 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 213b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("gatt_disconnect already in closing state"); 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ret; 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_update_app_hold_link_status 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Update the application use link status 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void. 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_update_app_hold_link_status (tGATT_IF gatt_if, tGATT_TCB *p_tcb, BOOLEAN is_add) 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN found=FALSE; 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb == NULL) 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 236b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("gatt_update_app_hold_link_status p_tcb=NULL"); 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i=0; i<GATT_MAX_APPS; i++) 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->app_hold_link[i] == gatt_if) 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project found = TRUE; 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!is_add) 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->app_hold_link[i] = 0; 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!found && is_add) 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i=0; i<GATT_MAX_APPS; i++) 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->app_hold_link[i] == 0) 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->app_hold_link[i] = gatt_if; 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project found = TRUE; 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 267b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_update_app_hold_link_status found=%d[1-found] idx=%d gatt_if=%d is_add=%d", found, i, gatt_if, is_add); 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_update_app_use_link_flag 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Update the application use link flag and optional to check the acl link 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if the link is up then set the idle time out accordingly 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void. 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_update_app_use_link_flag (tGATT_IF gatt_if, tGATT_TCB *p_tcb, BOOLEAN is_add, BOOLEAN check_acl_link) 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 283b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_update_app_use_link_flag is_add=%d chk_link=%d", 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_add, check_acl_link); 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_update_app_hold_link_status(gatt_if, p_tcb, is_add); 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (check_acl_link && 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb && 2907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_tcb->att_lcid == L2CAP_ATT_CID && /* only update link idle timer for fixed channel */ 2917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (BTM_GetHCIConnHandle(p_tcb->peer_bda, p_tcb->transport) != GATT_INVALID_ACL_HANDLE)) 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_add) 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 295b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("GATT disables link idle timer"); 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* acl link is connected disable the idle timeout */ 2977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta GATT_SetIdleTimeout(p_tcb->peer_bda, GATT_LINK_NO_IDLE_TIMEOUT, p_tcb->transport); 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!gatt_num_apps_hold_link(p_tcb)) 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* acl link is connected but no application needs to use the link 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project so set the timeout value to GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP seconds */ 305b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("GATT starts link idle timer =%d sec", GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP); 3067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta GATT_SetIdleTimeout(p_tcb->peer_bda, GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP, p_tcb->transport); 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_act_connect 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description GATT connection initiation. 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void. 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN gatt_act_connect (tGATT_REG *p_reg, BD_ADDR bd_addr, tBT_TRANSPORT transport) 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN ret = FALSE; 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb; 326ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 st; 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_tcb = gatt_find_tcb_by_addr(bd_addr, transport)) != NULL) 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret = TRUE; 331ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta st = gatt_get_ch_state(p_tcb); 332ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 333ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* before link down, another app try to open a GATT connection */ 3346975b4d711142b885af479721cada448952c6b41Andre Eisenbach if(st == GATT_CH_OPEN && gatt_num_apps_hold_link(p_tcb) == 0 && 3357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta transport == BT_TRANSPORT_LE ) 336ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 3377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (!gatt_connect(bd_addr, p_tcb, transport)) 338ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ret = FALSE; 339ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 340ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else if(st == GATT_CH_CLOSING) 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* need to complete the closing first */ 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret = FALSE; 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr, transport)) != NULL) 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (!gatt_connect(bd_addr, p_tcb, transport)) 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 352b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("gatt_connect failed"); 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_tcb, 0, sizeof(tGATT_TCB)); 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret = TRUE; 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret = 0; 361b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("Max TCB for gatt_if [%d] reached.", p_reg->gatt_if); 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ret) 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_update_app_use_link_flag(p_reg->gatt_if, p_tcb, TRUE, FALSE); 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ret; 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_le_connect_cback 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This callback function is called by L2CAP to indicate that 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the ATT fixed channel for LE is 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connected (conn = TRUE)/disconnected (conn = FALSE). 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic void gatt_le_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, 3837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT16 reason, tBT_TRANSPORT transport) 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(bd_addr, transport); 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN check_srv_chg = FALSE; 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_SRV_CHG *p_srv_chg_clt=NULL; 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* ignore all fixed channel connect/disconnect on BR/EDR link for GATT */ 3917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_BR_EDR) 3927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return; 3937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 394b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("GATT ATT protocol channel with BDA: %08x%04x is %s", 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3], 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bd_addr[4]<<8)+bd_addr[5], (connected) ? "connected" : "disconnected"); 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_srv_chg_clt = gatt_is_bda_in_the_srv_chg_clt_list(bd_addr)) != NULL) 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project check_srv_chg = TRUE; 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_sec_is_a_bonded_dev(bd_addr)) 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_add_a_bonded_dev_for_srv_chg(bd_addr); 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (connected) 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do we have a channel initiating a connection? */ 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb) 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we are initiating connection */ 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( gatt_get_ch_state(p_tcb) == GATT_CH_CONN) 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send callback */ 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_set_ch_state(p_tcb, GATT_CH_OPEN); 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->payload_size = GATT_DEF_BLE_MTU_SIZE; 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 420ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_send_conn_cback(p_tcb); 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 422f8aaa621c6a3e965844e1c460fa7af0f8fdd7271Mudumba Ananth if (check_srv_chg) 423f8aaa621c6a3e965844e1c460fa7af0f8fdd7271Mudumba Ananth gatt_chk_srv_chg (p_srv_chg_clt); 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this is incoming connection or background connection callback */ 4267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr, BT_TRANSPORT_LE)) != NULL) 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->att_lcid = L2CAP_ATT_CID; 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_set_ch_state(p_tcb, GATT_CH_OPEN); 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->payload_size = GATT_DEF_BLE_MTU_SIZE; 436ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 437ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_send_conn_cback (p_tcb); 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (check_srv_chg) 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_chk_srv_chg (p_srv_chg_clt); 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 445b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("CCB max out, no rsources"); 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta gatt_cleanup_upon_disc(bd_addr, reason, transport); 452b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("ATT disconnected"); 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 45817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Function gatt_channel_congestion 45917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** 46017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Description This function is called to process the congestion callback 46117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** from lcb 46217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** 46317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Returns void 46417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** 46517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach*******************************************************************************/ 46617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbachstatic void gatt_channel_congestion(tGATT_TCB *p_tcb, BOOLEAN congested) 46717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach{ 46817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach UINT8 i = 0; 46917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach tGATT_REG *p_reg=NULL; 47017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach UINT16 conn_id; 47117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach 47217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach /* if uncongested, check to see if there is any more pending data */ 47317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach if (p_tcb != NULL && congested == FALSE) 47417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach { 47517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach gatt_cl_send_next_cmd_inq(p_tcb); 47617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach } 47717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach /* notifying all applications for the connection up event */ 47817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach for (i = 0, p_reg = gatt_cb.cl_rcb ; i < GATT_MAX_APPS; i++, p_reg++) 47917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach { 48017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach if (p_reg->in_use) 48117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach { 48217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach if (p_reg->app_cb.p_congestion_cb) 48317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach { 48417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_reg->gatt_if); 48517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach (*p_reg->app_cb.p_congestion_cb)(conn_id, congested); 48617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach } 48717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach } 48817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach } 48917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach} 49017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach 49117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach/******************************************************************************* 49217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** 49317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Function gatt_le_cong_cback 49417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** 49517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Description This function is called when GATT fixed channel is congested 49617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** or uncongested. 49717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** 49817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Returns void 49917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** 50017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach*******************************************************************************/ 50117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbachstatic void gatt_le_cong_cback(BD_ADDR remote_bda, BOOLEAN congested) 50217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach{ 50317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(remote_bda, BT_TRANSPORT_LE); 50417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach 50517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach /* if uncongested, check to see if there is any more pending data */ 50617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach if (p_tcb != NULL) 50717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach { 50817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach gatt_channel_congestion(p_tcb, congested); 50917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach } 51017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach} 51117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach 51217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach/******************************************************************************* 51317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_le_data_ind 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when data is received from L2CAP. 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if we are the originator of the connection, we are the ATT 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** client, and the received message is queued up for the client. 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If we are the destination of the connection, we are the ATT 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** server, so the message is passed to the server processing 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** function. 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void gatt_le_data_ind (BD_ADDR bd_addr, BT_HDR *p_buf) 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb; 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find CCB based on bd addr */ 5327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_tcb = gatt_find_tcb_by_addr (bd_addr, BT_TRANSPORT_LE)) != NULL && 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_get_ch_state(p_tcb) >= GATT_CH_OPEN) 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_data_process(p_tcb, p_buf); 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb != NULL) 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 543b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_WARNING ("ATT - Ignored L2CAP data while in state: %d", 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_get_ch_state(p_tcb)); 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 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** 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_l2cif_connect_ind 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function handles an inbound connection indication 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** from L2CAP. This is the case where we are acting as a 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** server. 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void gatt_l2cif_connect_ind_cback (BD_ADDR bd_addr, UINT16 lcid, UINT16 psm, UINT8 id) 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do we already have a control channel for this peer? */ 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 result = L2CAP_CONN_OK; 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_CFG_INFO cfg; 5657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_BR_EDR); 5665cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(psm); 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 568b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("Connection indication cid = %d", lcid); 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* new connection ? */ 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb == NULL) 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* allocate tcb */ 5737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no tcb available, reject L2CAP connection */ 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = L2CAP_CONN_NO_RESOURCES; 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->att_lcid = lcid; 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* existing connection , reject it */ 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = L2CAP_CONN_NO_RESOURCES; 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send L2CAP connect rsp */ 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConnectRsp(bd_addr, id, lcid, result, 0); 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if result ok, proceed with connection */ 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == L2CAP_CONN_OK) 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* transition to configuration state */ 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_set_ch_state(p_tcb, GATT_CH_CFG); 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send L2CAP config req */ 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&cfg, 0, sizeof(tL2CAP_CFG_INFO)); 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.mtu_present = TRUE; 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.mtu = GATT_MAX_MTU_SIZE; 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigReq(lcid, &cfg); 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_l2c_connect_cfm_cback 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP connect confirm callback function. 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 61517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbachstatic void gatt_l2cif_connect_cfm_cback(UINT16 lcid, UINT16 result) 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb; 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_CFG_INFO cfg; 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up clcb for this channel */ 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL) 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 623b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_l2c_connect_cfm_cback result: %d ch_state: %d, lcid:0x%x", result, gatt_get_ch_state(p_tcb), p_tcb->att_lcid); 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if in correct state */ 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_get_ch_state(p_tcb) == GATT_CH_CONN) 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if result successful */ 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == L2CAP_CONN_OK) 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set channel state */ 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_set_ch_state(p_tcb, GATT_CH_CFG); 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send L2CAP config req */ 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&cfg, 0, sizeof(tL2CAP_CFG_INFO)); 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.mtu_present = TRUE; 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.mtu = GATT_MAX_MTU_SIZE; 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigReq(lcid, &cfg); 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else initiating connection failure */ 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta gatt_cleanup_upon_disc(p_tcb->peer_bda, result, GATT_TRANSPORT_BR_EDR); 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* wrong state, disconnect it */ 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == L2CAP_CONN_OK) 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* just in case the peer also accepts our connection - Send L2CAP disconnect req */ 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectReq(lcid); 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_l2cif_config_cfm_cback 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP config confirm callback function. 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_l2cif_config_cfm_cback(UINT16 lcid, tL2CAP_CFG_INFO *p_cfg) 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb; 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_SRV_CHG *p_srv_chg_clt=NULL; 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up clcb for this channel */ 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL) 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if in correct state */ 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( gatt_get_ch_state(p_tcb) == GATT_CH_CFG) 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if result successful */ 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cfg->result == L2CAP_CFG_OK) 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update flags */ 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->ch_flags |= GATT_L2C_CFG_CFM_DONE; 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if configuration complete */ 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->ch_flags & GATT_L2C_CFG_IND_DONE) 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_set_ch_state(p_tcb, GATT_CH_OPEN); 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_srv_chg_clt = gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda)) != NULL) 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_chk_srv_chg(p_srv_chg_clt); 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6956975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda)) 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_add_a_bonded_dev_for_srv_chg(p_tcb->peer_bda); 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send callback */ 700ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_send_conn_cback(p_tcb); 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else failure */ 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send L2CAP disconnect req */ 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectReq(lcid); 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_l2cif_config_ind_cback 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP config indication callback function. 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_l2cif_config_ind_cback(UINT16 lcid, tL2CAP_CFG_INFO *p_cfg) 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb; 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_SRV_CHG *p_srv_chg_clt=NULL; 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up clcb for this channel */ 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL) 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* GATT uses the smaller of our MTU and peer's MTU */ 7316975b4d711142b885af479721cada448952c6b41Andre Eisenbach if ( p_cfg->mtu_present && 7326975b4d711142b885af479721cada448952c6b41Andre Eisenbach (p_cfg->mtu >= GATT_MIN_BR_MTU_SIZE && p_cfg->mtu < L2CAP_DEFAULT_MTU)) 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->payload_size = p_cfg->mtu; 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->payload_size = L2CAP_DEFAULT_MTU; 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send L2CAP configure response */ 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_cfg, 0, sizeof(tL2CAP_CFG_INFO)); 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cfg->result = L2CAP_CFG_OK; 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigRsp(lcid, p_cfg); 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if first config ind */ 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tcb->ch_flags & GATT_L2C_CFG_IND_DONE) == 0) 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update flags */ 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->ch_flags |= GATT_L2C_CFG_IND_DONE; 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if configuration complete */ 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb->ch_flags & GATT_L2C_CFG_CFM_DONE) 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_set_ch_state(p_tcb, GATT_CH_OPEN); 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_srv_chg_clt = gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda)) != NULL) 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_chk_srv_chg(p_srv_chg_clt); 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda)) 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_add_a_bonded_dev_for_srv_chg(p_tcb->peer_bda); 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send callback */ 763ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gatt_send_conn_cback(p_tcb); 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_l2cif_disconnect_ind_cback 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP disconnect indication callback function. 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_l2cif_disconnect_ind_cback(UINT16 lcid, BOOLEAN ack_needed) 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb; 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 reason; 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up clcb for this channel */ 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL) 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ack_needed) 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send L2CAP disconnect response */ 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectRsp(lcid); 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7920d3786ea4f86a0ad48791eea6774b88910d47f21Andre Eisenbach if (gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda) == NULL) 793ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 7947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda)) 7950d3786ea4f86a0ad48791eea6774b88910d47f21Andre Eisenbach gatt_add_a_bonded_dev_for_srv_chg(p_tcb->peer_bda); 796ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if ACL link is still up, no reason is logged, l2cap is disconnect from peer */ 7987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((reason = L2CA_GetDisconnectReason(p_tcb->peer_bda, p_tcb->transport)) == 0) 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = GATT_CONN_TERMINATE_PEER_USER; 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send disconnect callback */ 8027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta gatt_cleanup_upon_disc(p_tcb->peer_bda, reason, GATT_TRANSPORT_BR_EDR); 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_l2cif_disconnect_cfm_cback 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP disconnect confirm callback function. 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 81617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbachstatic void gatt_l2cif_disconnect_cfm_cback(UINT16 lcid, UINT16 result) 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb; 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 reason; 8205cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(result); 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up clcb for this channel */ 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL) 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8250d3786ea4f86a0ad48791eea6774b88910d47f21Andre Eisenbach /* If the device is not in the service changed client list, add it... */ 8260d3786ea4f86a0ad48791eea6774b88910d47f21Andre Eisenbach if (gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda) == NULL) 827ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 8287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda)) 8290d3786ea4f86a0ad48791eea6774b88910d47f21Andre Eisenbach gatt_add_a_bonded_dev_for_srv_chg(p_tcb->peer_bda); 830ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 831ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send disconnect callback */ 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if ACL link is still up, no reason is logged, l2cap is disconnect from peer */ 8347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((reason = L2CA_GetDisconnectReason(p_tcb->peer_bda, p_tcb->transport)) == 0) 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = GATT_CONN_TERMINATE_LOCAL_HOST; 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta gatt_cleanup_upon_disc(p_tcb->peer_bda, reason, GATT_TRANSPORT_BR_EDR); 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_l2cif_data_ind_cback 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP data indication callback function. 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 85117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbachstatic void gatt_l2cif_data_ind_cback(UINT16 lcid, BT_HDR *p_buf) 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb; 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up clcb for this channel */ 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL && 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_get_ch_state(p_tcb) == GATT_CH_OPEN) 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* process the data */ 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_data_process(p_tcb, p_buf); 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* prevent buffer leak */ 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_buf); 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 86817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Function gatt_l2cif_congest_cback 86917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** 87017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Description L2CAP congestion callback 87117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** 87217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** Returns void 87317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** 87417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach*******************************************************************************/ 87517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbachstatic void gatt_l2cif_congest_cback (UINT16 lcid, BOOLEAN congested) 87617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach{ 87717b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach tGATT_TCB *p_tcb = gatt_find_tcb_by_cid(lcid); 87817b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach 87917b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach if (p_tcb != NULL) 88017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach { 88117b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach gatt_channel_congestion(p_tcb, congested); 88217b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach } 88317b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach} 88417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach 88517b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach/******************************************************************************* 88617b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach** 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_send_conn_cback 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Callback used to notify layer above about a connection. 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 895ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gatt_send_conn_cback(tGATT_TCB *p_tcb) 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_REG *p_reg; 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_BG_CONN_DEV *p_bg_dev=NULL; 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 conn_id; 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 902ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_bg_dev = gatt_find_bg_dev(p_tcb->peer_bda); 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* notifying all applications for the connection up event */ 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0, p_reg = gatt_cb.cl_rcb ; i < GATT_MAX_APPS; i++, p_reg++) 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_reg->in_use) 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bg_dev && gatt_is_bg_dev_for_app(p_bg_dev, p_reg->gatt_if)) 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_update_app_use_link_flag(p_reg->gatt_if, p_tcb, TRUE, TRUE); 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_reg->app_cb.p_conn_cb) 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_reg->gatt_if); 9157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_reg->app_cb.p_conn_cb)(p_reg->gatt_if, p_tcb->peer_bda, conn_id, 9167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta TRUE, 0, p_tcb->transport); 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (gatt_num_apps_hold_link(p_tcb) && p_tcb->att_lcid == L2CAP_ATT_CID ) 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* disable idle timeout if one or more clients are holding the link disable the idle timer */ 9257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta GATT_SetIdleTimeout(p_tcb->peer_bda, GATT_LINK_NO_IDLE_TIMEOUT, p_tcb->transport); 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_le_data_ind 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when data is received from L2CAP. 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if we are the originator of the connection, we are the ATT 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** client, and the received message is queued up for the client. 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If we are the destination of the connection, we are the ATT 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** server, so the message is passed to the server processing 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** function. 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_data_process (tGATT_TCB *p_tcb, BT_HDR *p_buf) 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = (UINT8 *)(p_buf + 1) + p_buf->offset; 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 op_code, pseudo_op_code; 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 msg_len; 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf->len > 0) 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg_len = p_buf->len - 1; 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8(op_code, p); 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove the two MSBs associated with sign write and write cmd */ 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pseudo_op_code = op_code & (~GATT_WRITE_CMD_MASK); 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pseudo_op_code < GATT_OP_CODE_MAX) 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (op_code == GATT_SIGN_CMD_WRITE) 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_verify_signature(p_tcb, p_buf); 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* message from client */ 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((op_code % 2) == 0) 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_server_handle_client_req (p_tcb, op_code, msg_len, p); 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_client_handle_server_rsp (p_tcb, op_code, msg_len, p); 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 976b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("ATT - Rcvd L2CAP data, unknown cmd: 0x%x", op_code); 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 981b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR ("invalid data length, ignore"); 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_add_a_bonded_dev_for_srv_chg 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Add a bonded dev to the service changed client list 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_add_a_bonded_dev_for_srv_chg (BD_ADDR bda) 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_SRV_CHG *p_buf; 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_SRV_CHG_REQ req; 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_SRV_CHG srv_chg_clt; 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(srv_chg_clt.bda, bda, BD_ADDR_LEN); 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project srv_chg_clt.srv_changed = FALSE; 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = gatt_add_srv_chg_clt(&srv_chg_clt)) != NULL) 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(req.srv_chg.bda, bda, BD_ADDR_LEN); 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project req.srv_chg.srv_changed = FALSE; 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_cb.cb_info.p_srv_chg_callback) 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_ADD_CLIENT, &req, NULL); 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_send_srv_chg_ind 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to send a service chnaged indication to 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the specified bd address 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_send_srv_chg_ind (BD_ADDR peer_bda) 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 handle_range[GATT_SIZE_OF_SRV_CHG_HNDL_RANGE]; 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = handle_range; 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 conn_id; 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1030b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_send_srv_chg_ind"); 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_cb.handle_of_h_r) 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((conn_id = gatt_profile_find_conn_id_by_bd_addr(peer_bda)) != GATT_INVALID_CONN_ID) 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM (p, 1); 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM (p, 0xFFFF); 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATTS_HandleValueIndication (conn_id, 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_cb.handle_of_h_r, 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GATT_SIZE_OF_SRV_CHG_HNDL_RANGE, 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle_range); 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1045b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("Unable to find conn_id for %08x%04x ", 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (peer_bda[0]<<24)+(peer_bda[1]<<16)+(peer_bda[2]<<8)+peer_bda[3], 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (peer_bda[4]<<8)+peer_bda[5] ); 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_chk_srv_chg 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Check sending service chnaged Indication is required or not 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if required then send the Indication 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_chk_srv_chg(tGATTS_SRV_CHG *p_srv_chg_clt) 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1064b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_chk_srv_chg srv_changed=%d", p_srv_chg_clt->srv_changed ); 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srv_chg_clt->srv_changed) 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_send_srv_chg_ind(p_srv_chg_clt->bda); 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_init_srv_chg 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is used to initialize the service changed 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** attribute value 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_init_srv_chg (void) 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_SRV_CHG_REQ req; 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_SRV_CHG_RSP rsp; 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status; 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_clients,i; 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATTS_SRV_CHG srv_chg_clt; 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1090b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_init_srv_chg"); 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_cb.cb_info.p_srv_chg_callback) 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_READ_NUM_CLENTS, NULL, &rsp); 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status && rsp.num_clients) 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1097b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_init_srv_chg num_srv_chg_clt_clients=%d", rsp.num_clients); 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_clients = rsp.num_clients; 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i = 1; /* use one based index */ 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while ((i <= num_clients) && status) 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project req.client_read_index = i; 1103ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((status = (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_READ_CLENT, &req, &rsp)) == TRUE) 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&srv_chg_clt, &rsp.srv_chg ,sizeof(tGATTS_SRV_CHG)); 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_add_srv_chg_clt(&srv_chg_clt) == NULL) 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1108b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_ERROR("Unable to add a service change client"); 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = FALSE; 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i++; 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1118b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG("gatt_init_srv_chg callback not registered yet"); 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_proc_srv_chg 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is process the service changed request 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_proc_srv_chg (void) 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 start_idx, found_idx; 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR bda; 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN srv_chg_ind_pending=FALSE; 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_TCB *p_tcb; 11377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_TRANSPORT transport; 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1139b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("gatt_proc_srv_chg"); 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gatt_cb.cb_info.p_srv_chg_callback && gatt_cb.handle_of_h_r) 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_set_srv_chg(); 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start_idx =0; 11457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta while (gatt_find_the_connected_bda(start_idx, bda, &found_idx, &transport)) 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb = &gatt_cb.tcb[found_idx];; 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project srv_chg_ind_pending = gatt_is_srv_chg_ind_pending(p_tcb); 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!srv_chg_ind_pending) 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gatt_send_srv_chg_ind(bda); 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1156b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("discard srv chg - already has one in the queue"); 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start_idx = ++found_idx; 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_set_ch_state 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function set the ch_state in tcb 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_set_ch_state(tGATT_TCB *p_tcb, tGATT_CH_STATE ch_state) 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb) 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1176b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("gatt_set_ch_state: old=%d new=%d", p_tcb->ch_state, ch_state); 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tcb->ch_state = ch_state; 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gatt_get_ch_state 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function get the ch_state in tcb 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_CH_STATE gatt_get_ch_state(tGATT_TCB *p_tcb) 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGATT_CH_STATE ch_state = GATT_CH_CLOSE; 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tcb) 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1195b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati GATT_TRACE_DEBUG ("gatt_get_ch_state: ch_state=%d", p_tcb->ch_state); 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ch_state = p_tcb->ch_state; 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ch_state; 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BLE_INCLUDED */ 1202