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