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