15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2002-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 AVDTP adaption layer module interfaces to L2CAP 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 2683e2c342e8b40009f3509425722d309c0b8189b9Chris Manton#include "bt_types.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 285cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdt_api.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdtc_api.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdt_int.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2cdefs.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* callback function declarations */ 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_l2c_connect_ind_cback(BD_ADDR bd_addr, UINT16 lcid, UINT16 psm, UINT8 id); 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_l2c_connect_cfm_cback(UINT16 lcid, UINT16 result); 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_l2c_config_cfm_cback(UINT16 lcid, tL2CAP_CFG_INFO *p_cfg); 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_l2c_config_ind_cback(UINT16 lcid, tL2CAP_CFG_INFO *p_cfg); 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_l2c_disconnect_ind_cback(UINT16 lcid, BOOLEAN ack_needed); 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_l2c_disconnect_cfm_cback(UINT16 lcid, UINT16 result); 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_l2c_congestion_ind_cback(UINT16 lcid, BOOLEAN is_congested); 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_l2c_data_ind_cback(UINT16 lcid, BT_HDR *p_buf); 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* L2CAP callback function structure */ 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tL2CAP_APPL_INFO avdt_l2c_appl = { 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_l2c_connect_ind_cback, 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_l2c_connect_cfm_cback, 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_l2c_config_ind_cback, 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_l2c_config_cfm_cback, 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_l2c_disconnect_ind_cback, 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_l2c_disconnect_cfm_cback, 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_l2c_data_ind_cback, 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_l2c_congestion_ind_cback, 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL /* tL2CA_TX_COMPLETE_CB */ 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function avdt_sec_check_complete_term 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function called when Security Manager finishes 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** verification of the service side connection 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 738fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Battastatic void avdt_sec_check_complete_term (BD_ADDR bd_addr, tBT_TRANSPORT transport, 748fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta void *p_ref_data, UINT8 res) 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CCB *p_ccb = NULL; 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_CFG_INFO cfg; 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_TC_TBL *p_tbl; 795cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_ref_data); 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 81158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVDT_TRACE_DEBUG("avdt_sec_check_complete_term res: %d", res); 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bd_addr) 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 84158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVDT_TRACE_WARNING("avdt_sec_check_complete_term: NULL BD_ADDR"); 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb = avdt_ccb_by_bd(bd_addr); 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl = avdt_ad_tc_tbl_by_st(AVDT_CHAN_SIG, p_ccb, AVDT_AD_ST_SEC_ACP); 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tbl == NULL) 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res == BTM_SUCCESS) 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 968fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta /* Send response to the L2CAP layer. */ 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConnectRsp (bd_addr, p_tbl->id, p_tbl->lcid, L2CAP_CONN_OK, L2CAP_CONN_OK); 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store idx in LCID table, store LCID in routing table */ 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_cb.ad.lcid_tbl[p_tbl->lcid - L2CAP_BASE_APPL_CID] = avdt_ad_tc_tbl_to_idx(p_tbl); 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_ccb)][p_tbl->tcid].lcid = p_tbl->lcid; 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* transition to configuration state */ 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->state = AVDT_AD_ST_CFG; 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send L2CAP config req */ 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&cfg, 0, sizeof(tL2CAP_CFG_INFO)); 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.mtu_present = TRUE; 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.mtu = p_tbl->my_mtu; 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.flush_to_present = TRUE; 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.flush_to = p_tbl->my_flush_to; 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigReq(p_tbl->lcid, &cfg); 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConnectRsp (bd_addr, p_tbl->id, p_tbl->lcid, L2CAP_CONN_SECURITY_BLOCK, L2CAP_CONN_OK); 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_ad_tc_close_ind(p_tbl, L2CAP_CONN_SECURITY_BLOCK); 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function avdt_sec_check_complete_orig 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function called when Security Manager finishes 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** verification of the service side connection 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1318fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Battastatic void avdt_sec_check_complete_orig (BD_ADDR bd_addr, tBT_TRANSPORT trasnport, 1328fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta void *p_ref_data, UINT8 res) 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CCB *p_ccb = NULL; 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_CFG_INFO cfg; 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_TC_TBL *p_tbl; 1375cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_ref_data); 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 139158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVDT_TRACE_DEBUG("avdt_sec_check_complete_orig res: %d", res); 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bd_addr) 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb = avdt_ccb_by_bd(bd_addr); 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl = avdt_ad_tc_tbl_by_st(AVDT_CHAN_SIG, p_ccb, AVDT_AD_ST_SEC_INT); 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_tbl == NULL) 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( res == BTM_SUCCESS ) 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set channel state */ 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->state = AVDT_AD_ST_CFG; 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send L2CAP config req */ 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&cfg, 0, sizeof(tL2CAP_CFG_INFO)); 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.mtu_present = TRUE; 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.mtu = p_tbl->my_mtu; 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.flush_to_present = TRUE; 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.flush_to = p_tbl->my_flush_to; 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigReq(p_tbl->lcid, &cfg); 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectReq (p_tbl->lcid); 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_ad_tc_close_ind(p_tbl, L2CAP_CONN_SECURITY_BLOCK); 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function avdt_l2c_connect_ind_cback 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP connect indication callback function. 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_l2c_connect_ind_cback(BD_ADDR bd_addr, UINT16 lcid, UINT16 psm, UINT8 id) 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CCB *p_ccb; 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_TC_TBL *p_tbl = NULL; 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 result; 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_CFG_INFO cfg; 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS rc; 1825cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(psm); 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do we already have a control channel for this peer? */ 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_ccb = avdt_ccb_by_bd(bd_addr)) == NULL) 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no, allocate ccb */ 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_ccb = avdt_ccb_alloc(bd_addr)) == NULL) 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no ccb available, reject L2CAP connection */ 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = L2CAP_CONN_NO_RESOURCES; 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* allocate and set up entry; first channel is always signaling */ 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl = avdt_ad_tc_tbl_alloc(p_ccb); 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->my_mtu = avdt_cb.rcb.ctrl_mtu; 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->my_flush_to = L2CAP_DEFAULT_FLUSH_TO; 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->tcid = AVDT_CHAN_SIG; 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->lcid = lcid; 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->id = id; 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->state = AVDT_AD_ST_SEC_ACP; 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->cfg_flags = AVDT_L2C_CFG_CONN_ACP; 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check the security */ 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = btm_sec_mx_access_request (bd_addr, AVDT_PSM, 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FALSE, BTM_SEC_PROTO_AVDT, 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_CHAN_SIG, 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &avdt_sec_check_complete_term, NULL); 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(rc == BTM_CMD_STARTED) 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConnectRsp (p_ccb->peer_addr, p_tbl->id, lcid, L2CAP_CONN_PENDING, L2CAP_CONN_OK); 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* deal with simultaneous control channel connect case */ 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ((p_tbl = avdt_ad_tc_tbl_by_st(AVDT_CHAN_SIG, p_ccb, AVDT_AD_ST_CONN)) != NULL) 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reject their connection */ 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = L2CAP_CONN_NO_RESOURCES; 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this must be a traffic channel; are we accepting a traffic channel 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** for this ccb? 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ((p_tbl = avdt_ad_tc_tbl_by_st(AVDT_CHAN_MEDIA, p_ccb, AVDT_AD_ST_ACP)) != NULL) 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* yes; proceed with connection */ 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = L2CAP_CONN_OK; 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if AVDT_REPORTING == TRUE 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this must be a reporting channel; are we accepting a reporting channel 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** for this ccb? 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ((p_tbl = avdt_ad_tc_tbl_by_st(AVDT_CHAN_REPORT, p_ccb, AVDT_AD_ST_ACP)) != NULL) 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* yes; proceed with connection */ 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = L2CAP_CONN_OK; 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else we're not listening for traffic channel; reject */ 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = L2CAP_CONN_NO_PSM; 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send L2CAP connect rsp */ 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConnectRsp(bd_addr, id, lcid, result, 0); 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if result ok, proceed with connection */ 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == L2CAP_CONN_OK) 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store idx in LCID table, store LCID in routing table */ 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_cb.ad.lcid_tbl[lcid - L2CAP_BASE_APPL_CID] = avdt_ad_tc_tbl_to_idx(p_tbl); 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_ccb)][p_tbl->tcid].lcid = lcid; 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* transition to configuration state */ 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->state = AVDT_AD_ST_CFG; 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send L2CAP config req */ 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&cfg, 0, sizeof(tL2CAP_CFG_INFO)); 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.mtu_present = TRUE; 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.mtu = p_tbl->my_mtu; 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.flush_to_present = TRUE; 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.flush_to = p_tbl->my_flush_to; 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigReq(lcid, &cfg); 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 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** Function avdt_l2c_connect_cfm_cback 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP connect confirm callback function. 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_l2c_connect_cfm_cback(UINT16 lcid, UINT16 result) 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_TC_TBL *p_tbl; 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_CFG_INFO cfg; 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CCB *p_ccb; 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 286158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVDT_TRACE_DEBUG("avdt_l2c_connect_cfm_cback lcid: %d, result: %d", 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project lcid, result); 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up info for this channel */ 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tbl = avdt_ad_tc_tbl_by_lcid(lcid)) != NULL) 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if in correct state */ 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tbl->state == AVDT_AD_ST_CONN) 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if result successful */ 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == L2CAP_CONN_OK) 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_tbl->tcid != AVDT_CHAN_SIG) 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set channel state */ 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->state = AVDT_AD_ST_CFG; 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send L2CAP config req */ 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&cfg, 0, sizeof(tL2CAP_CFG_INFO)); 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.mtu_present = TRUE; 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.mtu = p_tbl->my_mtu; 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.flush_to_present = TRUE; 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.flush_to = p_tbl->my_flush_to; 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigReq(lcid, &cfg); 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb = avdt_ccb_by_idx(p_tbl->ccb_idx); 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_ccb == NULL) 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = L2CAP_CONN_NO_RESOURCES; 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set channel state */ 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->state = AVDT_AD_ST_SEC_INT; 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->lcid = lcid; 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->cfg_flags = AVDT_L2C_CFG_CONN_INT; 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check the security */ 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_mx_access_request (p_ccb->peer_addr, AVDT_PSM, 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project TRUE, BTM_SEC_PROTO_AVDT, 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_CHAN_SIG, 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &avdt_sec_check_complete_orig, NULL); 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* failure; notify adaption that channel closed */ 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result != L2CAP_CONN_OK) 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_ad_tc_close_ind(p_tbl, result); 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function avdt_l2c_config_cfm_cback 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP config confirm callback function. 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_l2c_config_cfm_cback(UINT16 lcid, tL2CAP_CFG_INFO *p_cfg) 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_TC_TBL *p_tbl; 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up info for this channel */ 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tbl = avdt_ad_tc_tbl_by_lcid(lcid)) != NULL) 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 359cda6e9180935965358c3d39dd6a1704a0b538655Sharvil Nanavati p_tbl->lcid = lcid; 360cda6e9180935965358c3d39dd6a1704a0b538655Sharvil Nanavati 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if in correct state */ 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tbl->state == AVDT_AD_ST_CFG) 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if result successful */ 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cfg->result == L2CAP_CONN_OK) 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update cfg_flags */ 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->cfg_flags |= AVDT_L2C_CFG_CFM_DONE; 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if configuration complete */ 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tbl->cfg_flags & AVDT_L2C_CFG_IND_DONE) 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_ad_tc_open_ind(p_tbl); 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else failure */ 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send L2CAP disconnect req */ 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectReq(lcid); 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function avdt_l2c_config_ind_cback 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP config indication callback function. 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_l2c_config_ind_cback(UINT16 lcid, tL2CAP_CFG_INFO *p_cfg) 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_TC_TBL *p_tbl; 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up info for this channel */ 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tbl = avdt_ad_tc_tbl_by_lcid(lcid)) != NULL) 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store the mtu in tbl */ 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cfg->mtu_present) 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->peer_mtu = p_cfg->mtu; 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->peer_mtu = L2CAP_DEFAULT_MTU; 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 412158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVDT_TRACE_DEBUG("peer_mtu: %d, lcid: x%x",p_tbl->peer_mtu, lcid); 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send L2CAP configure response */ 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_cfg, 0, sizeof(tL2CAP_CFG_INFO)); 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cfg->result = L2CAP_CFG_OK; 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigRsp(lcid, p_cfg); 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if first config ind */ 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tbl->cfg_flags & AVDT_L2C_CFG_IND_DONE) == 0) 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update cfg_flags */ 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->cfg_flags |= AVDT_L2C_CFG_IND_DONE; 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if configuration complete */ 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tbl->cfg_flags & AVDT_L2C_CFG_CFM_DONE) 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_ad_tc_open_ind(p_tbl); 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function avdt_l2c_disconnect_ind_cback 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP disconnect indication callback function. 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_l2c_disconnect_ind_cback(UINT16 lcid, BOOLEAN ack_needed) 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_TC_TBL *p_tbl; 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 448158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVDT_TRACE_DEBUG("avdt_l2c_disconnect_ind_cback lcid: %d, ack_needed: %d", 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project lcid, ack_needed); 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up info for this channel */ 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tbl = avdt_ad_tc_tbl_by_lcid(lcid)) != NULL) 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ack_needed) 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send L2CAP disconnect response */ 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectRsp(lcid); 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_ad_tc_close_ind(p_tbl, 0); 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function avdt_l2c_disconnect_cfm_cback 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP disconnect confirm callback function. 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_l2c_disconnect_cfm_cback(UINT16 lcid, UINT16 result) 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_TC_TBL *p_tbl; 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 477158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVDT_TRACE_DEBUG("avdt_l2c_disconnect_cfm_cback lcid: %d, result: %d", 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project lcid, result); 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up info for this channel */ 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tbl = avdt_ad_tc_tbl_by_lcid(lcid)) != NULL) 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_ad_tc_close_ind(p_tbl, result); 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function avdt_l2c_congestion_ind_cback 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP congestion indication callback function. 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_l2c_congestion_ind_cback(UINT16 lcid, BOOLEAN is_congested) 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_TC_TBL *p_tbl; 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up info for this channel */ 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tbl = avdt_ad_tc_tbl_by_lcid(lcid)) != NULL) 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_ad_tc_cong_ind(p_tbl, is_congested); 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function avdt_l2c_data_ind_cback 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP data indication callback function. 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_l2c_data_ind_cback(UINT16 lcid, BT_HDR *p_buf) 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_TC_TBL *p_tbl; 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up info for this channel */ 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tbl = avdt_ad_tc_tbl_by_lcid(lcid)) != NULL) 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_ad_tc_data_ind(p_tbl, p_buf); 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* prevent buffer leak */ 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_buf); 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 530