15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2009-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 is the implementation file for the MCAP at L2CAP Interface. 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "mca_api.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "mca_defs.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "mca_int.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* L2CAP callback function structure */ 35ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battaconst tL2CAP_APPL_INFO mca_l2c_int_appl = 36ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_l2c_connect_cfm_cback, 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_l2c_config_ind_cback, 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_l2c_config_cfm_cback, 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_l2c_disconnect_ind_cback, 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_l2c_disconnect_cfm_cback, 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_l2c_data_ind_cback, 46ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta mca_l2c_congestion_ind_cback, 47ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta NULL 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Control channel eL2CAP default options */ 51ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battaconst tL2CAP_FCR_OPTS mca_l2c_fcr_opts_def = 52ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CAP_FCR_ERTM_MODE, /* Mandatory for MCAP */ 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_FCR_OPT_TX_WINDOW_SIZE, /* Tx window size */ 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_FCR_OPT_MAX_TX_B4_DISCNT, /* Maximum transmissions before disconnecting */ 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_FCR_OPT_RETX_TOUT, /* Retransmission timeout (2 secs) */ 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_FCR_OPT_MONITOR_TOUT, /* Monitor timeout (12 secs) */ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_FCR_OPT_MPS_SIZE /* MPS segment size */ 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 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 mca_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 mca_sec_check_complete_term (BD_ADDR bd_addr, void *p_ref_data, UINT8 res) 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_TC_TBL *p_tbl = (tMCA_TC_TBL *)p_ref_data; 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_CFG_INFO cfg; 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_ERTM_INFO ertm_info; 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_DEBUG1("mca_sec_check_complete_term res: %d", res); 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( res == BTM_SUCCESS ) 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_DEBUG2 ("lcid:x%x id:x%x", p_tbl->lcid, p_tbl->id); 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the FCR options: control channel mandates ERTM */ 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.preferred_mode = mca_l2c_fcr_opts_def.mode; 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.allowed_modes = L2CAP_FCR_CHAN_OPT_ERTM; 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.user_rx_pool_id = MCA_USER_RX_POOL_ID; 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.user_tx_pool_id = MCA_USER_TX_POOL_ID; 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.fcr_rx_pool_id = MCA_FCR_RX_POOL_ID; 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.fcr_tx_pool_id = MCA_FCR_TX_POOL_ID; 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send response to the L2CAP layer. */ 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ErtmConnectRsp (bd_addr, p_tbl->id, p_tbl->lcid, L2CAP_CONN_OK, L2CAP_CONN_OK, &ertm_info); 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* transition to configuration state */ 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->state = MCA_TC_ST_CFG; 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send L2CAP config req */ 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_set_cfg_by_tbl (&cfg, p_tbl); 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigReq(p_tbl->lcid, &cfg); 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConnectRsp (bd_addr, p_tbl->id, p_tbl->lcid, L2CAP_CONN_SECURITY_BLOCK, L2CAP_CONN_OK); 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_tc_close_ind(p_tbl, L2CAP_CONN_SECURITY_BLOCK); 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_sec_check_complete_orig 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function called when Security Manager finishes 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** verification of the service side connection 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void mca_sec_check_complete_orig (BD_ADDR bd_addr, void *p_ref_data, UINT8 res) 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_TC_TBL *p_tbl = (tMCA_TC_TBL *)p_ref_data; 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_CFG_INFO cfg; 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_DEBUG1("mca_sec_check_complete_orig res: %d", res); 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( res == BTM_SUCCESS ) 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set channel state */ 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->state = MCA_TC_ST_CFG; 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send L2CAP config req */ 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_set_cfg_by_tbl (&cfg, p_tbl); 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigReq(p_tbl->lcid, &cfg); 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectReq (p_tbl->lcid); 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_tc_close_ind(p_tbl, L2CAP_CONN_SECURITY_BLOCK); 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_l2c_cconn_ind_cback 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP connect indication callback function. 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_l2c_cconn_ind_cback(BD_ADDR bd_addr, UINT16 lcid, UINT16 psm, UINT8 id) 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_HANDLE handle = mca_handle_by_cpsm(psm); 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB *p_ccb; 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_TC_TBL *p_tbl = NULL; 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 result = L2CAP_CONN_NO_RESOURCES; 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS rc; 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_ERTM_INFO ertm_info, *p_ertm_info = NULL; 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_CFG_INFO cfg; 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_EVENT3 ("mca_l2c_cconn_ind_cback: lcid:x%x psm:x%x id:x%x", lcid, psm, id); 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do we already have a control channel for this peer? */ 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_ccb = mca_ccb_by_bd(handle, bd_addr)) == NULL) 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no, allocate ccb */ 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_ccb = mca_ccb_alloc(handle, bd_addr)) != NULL) 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* allocate and set up entry */ 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->lcid = lcid; 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl = mca_tc_tbl_calloc(p_ccb); 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->id = id; 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->cfg_flags= MCA_L2C_CFG_CONN_ACP; 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* proceed with connection */ 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check the security */ 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = btm_sec_mx_access_request (bd_addr, psm, FALSE, BTM_SEC_PROTO_MCA, 0, 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &mca_sec_check_complete_term, p_tbl); 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (rc == BTM_CMD_STARTED) 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the FCR options: control channel mandates ERTM */ 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.preferred_mode = mca_l2c_fcr_opts_def.mode; 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.allowed_modes = L2CAP_FCR_CHAN_OPT_ERTM; 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.user_rx_pool_id = MCA_USER_RX_POOL_ID; 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.user_tx_pool_id = MCA_USER_TX_POOL_ID; 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.fcr_rx_pool_id = MCA_FCR_RX_POOL_ID; 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.fcr_tx_pool_id = MCA_FCR_TX_POOL_ID; 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ertm_info = &ertm_info; 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = L2CAP_CONN_PENDING; 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = L2CAP_CONN_OK; 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* deal with simultaneous control channel connect case */ 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else reject their connection */ 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_tbl || (p_tbl->state != MCA_TC_ST_CFG)) 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send L2CAP connect rsp */ 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ErtmConnectRsp (bd_addr, id, lcid, result, L2CAP_CONN_OK, p_ertm_info); 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if result ok, proceed with connection and send L2CAP 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project config req */ 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == L2CAP_CONN_OK) 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set channel state */ 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->state = MCA_TC_ST_CFG; 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send L2CAP config req */ 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_set_cfg_by_tbl (&cfg, p_tbl); 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigReq(p_tbl->lcid, &cfg); 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_l2c_dconn_ind_cback 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP connect indication callback function. 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_l2c_dconn_ind_cback(BD_ADDR bd_addr, UINT16 lcid, UINT16 psm, UINT8 id) 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_HANDLE handle = mca_handle_by_dpsm(psm); 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB *p_ccb; 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_DCB *p_dcb; 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_TC_TBL *p_tbl = NULL; 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 result; 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_CFG_INFO cfg; 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_ERTM_INFO *p_ertm_info = NULL, ertm_info; 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const tMCA_CHNL_CFG *p_chnl_cfg; 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_EVENT2 ("mca_l2c_dconn_ind_cback: lcid:x%x psm:x%x ", lcid, psm); 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_ccb = mca_ccb_by_bd(handle, bd_addr)) != NULL) && /* find the CCB */ 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_ccb->status == MCA_CCB_STAT_PENDING) && /* this CCB is expecting a MDL */ 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_ccb->p_tx_req && (p_dcb = mca_dcb_by_hdl(p_ccb->p_tx_req->dcb_idx)) != NULL)) 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* found the associated dcb in listening mode */ 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* proceed with connection */ 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb->lcid = lcid; 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl = mca_tc_tbl_dalloc(p_dcb); 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->id = id; 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->cfg_flags= MCA_L2C_CFG_CONN_ACP; 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_chnl_cfg = p_dcb->p_chnl_cfg; 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* assume that control channel has verified the security requirement */ 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the FCR options: control channel mandates ERTM */ 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.preferred_mode = p_chnl_cfg->fcr_opt.mode; 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.allowed_modes = (1 << p_chnl_cfg->fcr_opt.mode); 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.user_rx_pool_id = p_chnl_cfg->user_rx_pool_id; 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.user_tx_pool_id = p_chnl_cfg->user_tx_pool_id; 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.fcr_rx_pool_id = p_chnl_cfg->fcr_rx_pool_id; 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.fcr_tx_pool_id = p_chnl_cfg->fcr_tx_pool_id; 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ertm_info = &ertm_info; 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = L2CAP_CONN_OK; 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else we're not listening for traffic channel; reject 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * (this error code is specified by MCAP spec) */ 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = L2CAP_CONN_NO_RESOURCES; 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send L2CAP connect rsp */ 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ErtmConnectRsp (bd_addr, id, lcid, result, result, p_ertm_info); 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if result ok, proceed with connection */ 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == L2CAP_CONN_OK) 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* transition to configuration state */ 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->state = MCA_TC_ST_CFG; 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send L2CAP config req */ 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_set_cfg_by_tbl (&cfg, p_tbl); 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigReq(lcid, &cfg); 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_l2c_connect_cfm_cback 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP connect confirm callback function. 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_l2c_connect_cfm_cback(UINT16 lcid, UINT16 result) 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_TC_TBL *p_tbl; 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_CFG_INFO cfg; 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB *p_ccb; 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_DEBUG2("mca_l2c_connect_cfm_cback lcid: x%x, result: %d", 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project lcid, result); 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up info for this channel */ 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tbl = mca_tc_tbl_by_lcid(lcid)) != NULL) 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_DEBUG2("p_tbl state: %d, tcid: %d", p_tbl->state, p_tbl->tcid); 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if in correct state */ 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tbl->state == MCA_TC_ST_CONN) 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if result successful */ 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == L2CAP_CONN_OK) 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tbl->tcid != 0) 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set channel state */ 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->state = MCA_TC_ST_CFG; 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send L2CAP config req */ 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_set_cfg_by_tbl (&cfg, p_tbl); 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigReq(lcid, &cfg); 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb = mca_ccb_by_hdl((tMCA_CL)p_tbl->cb_idx); 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb == NULL) 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = L2CAP_CONN_NO_RESOURCES; 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set channel state */ 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->state = MCA_TC_ST_SEC_INT; 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->lcid = lcid; 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->cfg_flags= MCA_L2C_CFG_CONN_INT; 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check the security */ 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_mx_access_request (p_ccb->peer_addr, p_ccb->ctrl_vpsm, 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project TRUE, BTM_SEC_PROTO_MCA, 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->tcid, 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &mca_sec_check_complete_orig, p_tbl); 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 /* failure; notify adaption that channel closed */ 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result != L2CAP_CONN_OK) 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->cfg_flags |= MCA_L2C_CFG_DISCN_INT; 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_tc_close_ind(p_tbl, result); 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_l2c_config_cfm_cback 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP config confirm callback function. 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_l2c_config_cfm_cback(UINT16 lcid, tL2CAP_CFG_INFO *p_cfg) 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_TC_TBL *p_tbl; 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up info for this channel */ 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tbl = mca_tc_tbl_by_lcid(lcid)) != NULL) 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if in correct state */ 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tbl->state == MCA_TC_ST_CFG) 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if result successful */ 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cfg->result == L2CAP_CONN_OK) 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update cfg_flags */ 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->cfg_flags |= MCA_L2C_CFG_CFM_DONE; 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if configuration complete */ 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tbl->cfg_flags & MCA_L2C_CFG_IND_DONE) 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_tc_open_ind(p_tbl); 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else failure */ 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send L2CAP disconnect req */ 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectReq(lcid); 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_l2c_config_ind_cback 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP config indication callback function. 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_l2c_config_ind_cback(UINT16 lcid, tL2CAP_CFG_INFO *p_cfg) 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_TC_TBL *p_tbl; 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 result = L2CAP_CFG_OK; 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up info for this channel */ 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tbl = mca_tc_tbl_by_lcid(lcid)) != NULL) 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store the mtu in tbl */ 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cfg->mtu_present) 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->peer_mtu = p_cfg->mtu; 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tbl->peer_mtu < MCA_MIN_MTU) 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = L2CAP_CFG_UNACCEPTABLE_PARAMS; 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->peer_mtu = L2CAP_DEFAULT_MTU; 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_DEBUG3("peer_mtu: %d, lcid: x%x mtu_present:%d",p_tbl->peer_mtu, lcid, p_cfg->mtu_present); 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send L2CAP configure response */ 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_cfg, 0, sizeof(tL2CAP_CFG_INFO)); 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cfg->result = result; 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigRsp(lcid, p_cfg); 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if first config ind */ 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tbl->cfg_flags & MCA_L2C_CFG_IND_DONE) == 0) 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update cfg_flags */ 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->cfg_flags |= MCA_L2C_CFG_IND_DONE; 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if configuration complete */ 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tbl->cfg_flags & MCA_L2C_CFG_CFM_DONE) 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_tc_open_ind(p_tbl); 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_l2c_disconnect_ind_cback 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP disconnect indication callback function. 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_l2c_disconnect_ind_cback(UINT16 lcid, BOOLEAN ack_needed) 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_TC_TBL *p_tbl; 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 reason = L2CAP_DISC_TIMEOUT; 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_DEBUG2("mca_l2c_disconnect_ind_cback lcid: %d, ack_needed: %d", 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project lcid, ack_needed); 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up info for this channel */ 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tbl = mca_tc_tbl_by_lcid(lcid)) != NULL) 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ack_needed) 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send L2CAP disconnect response */ 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectRsp(lcid); 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->cfg_flags = MCA_L2C_CFG_DISCN_ACP; 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ack_needed) 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = L2CAP_DISC_OK; 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_tc_close_ind(p_tbl, reason); 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** 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_l2c_disconnect_cfm_cback 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP disconnect confirm callback function. 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_l2c_disconnect_cfm_cback(UINT16 lcid, UINT16 result) 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_TC_TBL *p_tbl; 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_DEBUG2("mca_l2c_disconnect_cfm_cback lcid: x%x, result: %d", 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project lcid, result); 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up info for this channel */ 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tbl = mca_tc_tbl_by_lcid(lcid)) != NULL) 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->cfg_flags = MCA_L2C_CFG_DISCN_INT; 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_tc_close_ind(p_tbl, result); 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_l2c_congestion_ind_cback 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP congestion indication callback function. 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_l2c_congestion_ind_cback(UINT16 lcid, BOOLEAN is_congested) 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_TC_TBL *p_tbl; 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up info for this channel */ 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tbl = mca_tc_tbl_by_lcid(lcid)) != NULL) 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_tc_cong_ind(p_tbl, is_congested); 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_l2c_data_ind_cback 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the L2CAP data indication callback function. 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_l2c_data_ind_cback(UINT16 lcid, BT_HDR *p_buf) 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_TC_TBL *p_tbl; 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up info for this channel */ 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_tbl = mca_tc_tbl_by_lcid(lcid)) != NULL) 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_tc_data_ind(p_tbl, p_buf); 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* prevent buffer leak */ 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_buf); 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_l2c_open_req 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function calls L2CA_ConnectReq() to initiate a L2CAP channel. 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void. 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 mca_l2c_open_req(BD_ADDR bd_addr, UINT16 psm, const tMCA_CHNL_CFG *p_chnl_cfg) 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_ERTM_INFO ertm_info; 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_chnl_cfg) 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.preferred_mode = p_chnl_cfg->fcr_opt.mode; 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.allowed_modes = (1 << p_chnl_cfg->fcr_opt.mode); 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.user_rx_pool_id = p_chnl_cfg->user_rx_pool_id; 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.user_tx_pool_id = p_chnl_cfg->user_tx_pool_id; 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.fcr_rx_pool_id = p_chnl_cfg->fcr_rx_pool_id; 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.fcr_tx_pool_id = p_chnl_cfg->fcr_tx_pool_id; 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.preferred_mode = mca_l2c_fcr_opts_def.mode; 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.allowed_modes = L2CAP_FCR_CHAN_OPT_ERTM; 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.user_rx_pool_id = MCA_USER_RX_POOL_ID; 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.user_tx_pool_id = MCA_USER_TX_POOL_ID; 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.fcr_rx_pool_id = MCA_FCR_RX_POOL_ID; 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ertm_info.fcr_tx_pool_id = MCA_FCR_TX_POOL_ID; 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return L2CA_ErtmConnectReq (psm, bd_addr, &ertm_info); 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 583