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 API implementation file for the Multi-Channel Adaptation 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Protocol (MCAP). 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "mca_api.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "mca_defs.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "mca_int.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "wcassert.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_process_timeout 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by BTU when an MCA timer 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** expires. 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This function is for use internal to the stack only. 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_process_timeout(TIMER_LIST_ENT *p_tle) 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_tle->event == BTU_TTYPE_MCA_CCB_RSP) 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tle->event = 0; 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_ccb_event ((tMCA_CCB *) p_tle->param, MCA_CCB_RSP_TOUT_EVT, NULL); 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function MCA_Init 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Initialize MCAP main control block. 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This function is called at stack start up. 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid MCA_Init(void) 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&mca_cb, 0, sizeof(tMCA_CB)); 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(MCA_INITIAL_TRACE_LEVEL) 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_cb.trace_level = MCA_INITIAL_TRACE_LEVEL; 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_cb.trace_level = BT_TRACE_LEVEL_NONE; 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function MCA_SetTraceLevel 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sets the debug trace level for MCA. 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If 0xff is passed, the current trace level is returned. 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Input Parameters: 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** level: The level to set the MCA tracing to: 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 0xff-returns the current setting. 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 0-turns off tracing. 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 1-Errors. 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 2-Warnings. 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 3-APIs. 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 4-Events. 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 5-Debug. 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns The new trace level or current trace level if 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the input parameter is 0xff. 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 MCA_SetTraceLevel (UINT8 level) 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (level != 0xFF) 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_cb.trace_level = level; 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (mca_cb.trace_level); 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function MCA_Register 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function registers an MCAP implementation. 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** It is assumed that the control channel PSM and data channel 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PSM are not used by any other instances of the stack. 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If the given p_reg->ctrl_psm is 0, this handle is INT only. 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 0, if failed. Otherwise, the MCA handle. 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_HANDLE MCA_Register(tMCA_REG *p_reg, tMCA_CTRL_CBACK *p_cback) 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RCB *p_rcb; 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_HANDLE handle = 0; 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_APPL_INFO l2c_cacp_appl; 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_APPL_INFO l2c_dacp_appl; 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project WC_ASSERT(p_reg != NULL ); 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project WC_ASSERT(p_cback != NULL ); 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_API2 ("MCA_Register: ctrl_psm:0x%x, data_psm:0x%x", p_reg->ctrl_psm, p_reg->data_psm); 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_rcb = mca_rcb_alloc (p_reg)) != NULL) 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_reg->ctrl_psm) 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (L2C_INVALID_PSM(p_reg->ctrl_psm) || L2C_INVALID_PSM(p_reg->data_psm)) 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR0 ("INVALID_PSM"); 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2c_cacp_appl = *(tL2CAP_APPL_INFO *)&mca_l2c_int_appl; 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2c_cacp_appl.pL2CA_ConnectCfm_Cb = NULL; 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2c_dacp_appl = *(tL2CAP_APPL_INFO *)&l2c_cacp_appl; 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2c_cacp_appl.pL2CA_ConnectInd_Cb = mca_l2c_cconn_ind_cback; 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2c_dacp_appl.pL2CA_ConnectInd_Cb = mca_l2c_dconn_ind_cback; 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (L2CA_Register(p_reg->ctrl_psm, (tL2CAP_APPL_INFO *) &l2c_cacp_appl) && 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_Register(p_reg->data_psm, (tL2CAP_APPL_INFO *) &l2c_dacp_appl)) 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set security level */ 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_MCAP_CTRL, p_reg->sec_mask, 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_reg->ctrl_psm, BTM_SEC_PROTO_MCA, MCA_CTRL_TCID); 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* in theory, we do not need this one for data_psm 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If we don't, L2CAP rejects with security block (3), 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * which is different reject code from what MCAP spec suggests. 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * we set this one, so mca_l2c_dconn_ind_cback can reject /w no resources (4) */ 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_MCAP_DATA, p_reg->sec_mask, 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_reg->data_psm, BTM_SEC_PROTO_MCA, MCA_CTRL_TCID); 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR0 ("Failed to register to L2CAP"); 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb->reg.data_psm = 0; 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle = mca_rcb_to_handle (p_rcb); 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb->p_cback = p_cback; 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb->reg.rsp_tout = p_reg->rsp_tout; 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return handle; 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function MCA_Deregister 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to deregister an MCAP implementation. 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Before this function can be called, all control and data 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** channels must be removed with MCA_DisconnectReq and MCA_CloseReq. 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid MCA_Deregister(tMCA_HANDLE handle) 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RCB *p_rcb = mca_rcb_by_handle(handle); 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_API1 ("MCA_Deregister: %d", handle); 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb && p_rcb->reg.ctrl_psm) 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_Deregister(p_rcb->reg.ctrl_psm); 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_Deregister(p_rcb->reg.data_psm); 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_clr_service_by_psm (p_rcb->reg.ctrl_psm); 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_clr_service_by_psm (p_rcb->reg.data_psm); 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_rcb_dealloc(handle); 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function MCA_CreateDep 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Create a data endpoint. If the MDEP is created successfully, 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the MDEP ID is returned in *p_dep. After a data endpoint is 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** created, an application can initiate a connection between this 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** endpoint and an endpoint on a peer device. 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns MCA_SUCCESS if successful, otherwise error. 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_RESULT MCA_CreateDep(tMCA_HANDLE handle, tMCA_DEP *p_dep, tMCA_CS *p_cs) 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RESULT result = MCA_BAD_HANDLE; 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RCB *p_rcb = mca_rcb_by_handle(handle); 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CS *p_depcs; 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project WC_ASSERT(p_dep != NULL ); 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project WC_ASSERT(p_cs != NULL ); 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project WC_ASSERT(p_cs->p_data_cback != NULL ); 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_API1 ("MCA_CreateDep: %d", handle); 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb) 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cs->max_mdl > MCA_NUM_MDLS) 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR1 ("max_mdl: %d is too big", p_cs->max_mdl ); 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_BAD_PARAMS; 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_depcs = p_rcb->dep; 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cs->type == MCA_TDEP_ECHO) 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_depcs->p_data_cback) 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR0 ("Already has ECHO MDEP"); 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return MCA_NO_RESOURCES; 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_depcs, p_cs, sizeof (tMCA_CS)); 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_dep = 0; 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_SUCCESS; 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_NO_RESOURCES; 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* non-echo MDEP starts from 1 */ 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_depcs++; 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i=1; i<MCA_NUM_DEPS; i++, p_depcs++) 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_depcs->p_data_cback == NULL) 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_depcs, p_cs, sizeof (tMCA_CS)); 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* internally use type as the mdep id */ 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_depcs->type = i; 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_dep = i; 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_SUCCESS; 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function MCA_DeleteDep 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Delete a data endpoint. This function is called when 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the implementation is no longer using a data endpoint. 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If this function is called when the endpoint is connected 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the connection is closed and the data endpoint 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is removed. 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns MCA_SUCCESS if successful, otherwise error. 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_RESULT MCA_DeleteDep(tMCA_HANDLE handle, tMCA_DEP dep) 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RESULT result = MCA_BAD_HANDLE; 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RCB *p_rcb = mca_rcb_by_handle(handle); 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_DCB *p_dcb; 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i, max; 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CS *p_depcs; 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_API2 ("MCA_DeleteDep: %d dep:%d", handle, dep); 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb) 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (dep < MCA_NUM_DEPS && p_rcb->dep[dep].p_data_cback) 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_SUCCESS; 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb->dep[dep].p_data_cback = NULL; 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_depcs = &(p_rcb->dep[dep]); 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i = handle - 1; 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max = MCA_NUM_MDLS*MCA_NUM_LINKS; 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb = &mca_cb.dcb[i*max]; 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* make sure no MDL exists for this MDEP */ 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i=0; i<max; i++, p_dcb++) 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dcb->state && p_dcb->p_cs == p_depcs) 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_dcb_event(p_dcb, MCA_DCB_API_CLOSE_EVT, NULL); 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function MCA_ConnectReq 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function initiates an MCAP control channel connection 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to the peer device. When the connection is completed, an 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** MCA_CONNECT_IND_EVT is reported to the application via its 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** control callback function. 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This control channel is identified by the tMCA_CL. 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If the connection attempt fails, an MCA_DISCONNECT_IND_EVT is 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** reported. The security mask parameter overrides the outgoing 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** security mask set in MCA_Register(). 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns MCA_SUCCESS if successful, otherwise error. 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_RESULT MCA_ConnectReq(tMCA_HANDLE handle, BD_ADDR bd_addr, 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 ctrl_psm, UINT16 sec_mask) 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RESULT result = MCA_BAD_HANDLE; 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB *p_ccb; 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_TC_TBL *p_tbl; 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_API2 ("MCA_ConnectReq: %d psm:0x%x", handle, ctrl_psm); 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_ccb = mca_ccb_by_bd(handle, bd_addr)) == NULL) 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb = mca_ccb_alloc(handle, bd_addr); 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR0 ("control channel already exists"); 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return MCA_BUSY; 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb) 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->ctrl_vpsm = L2CA_Register (ctrl_psm, (tL2CAP_APPL_INFO *)&mca_l2c_int_appl); 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_NO_RESOURCES; 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb->ctrl_vpsm) 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_MCAP_CTRL, sec_mask, 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->ctrl_vpsm, BTM_SEC_PROTO_MCA, MCA_CTRL_TCID); 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->lcid = mca_l2c_open_req(bd_addr, p_ccb->ctrl_vpsm, NULL); 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb->lcid) 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl = mca_tc_tbl_calloc(p_ccb); 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tbl) 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->state = MCA_TC_ST_CONN; 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->sec_mask = sec_mask; 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_SUCCESS; 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result != MCA_SUCCESS) 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_ccb_dealloc (p_ccb, NULL); 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 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 MCA_DisconnectReq 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function disconnect an MCAP control channel 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to the peer device. 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If associated data channel exists, they are disconnected. 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** When the MCL is disconnected an MCA_DISCONNECT_IND_EVT is 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** reported to the application via its control callback function. 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns MCA_SUCCESS if successful, otherwise error. 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_RESULT MCA_DisconnectReq(tMCA_CL mcl) 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RESULT result = MCA_BAD_HANDLE; 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB *p_ccb = mca_ccb_by_hdl(mcl); 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_API1 ("MCA_DisconnectReq: %d ", mcl); 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb) 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_SUCCESS; 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_ccb_event (p_ccb, MCA_CCB_API_DISCONNECT_EVT, NULL); 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function MCA_CreateMdl 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends a CREATE_MDL request to the peer device. 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** When the response is received, a MCA_CREATE_CFM_EVT is reported 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with the given MDL ID. 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If the response is successful, a data channel is open 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with the given p_chnl_cfg 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If p_chnl_cfg is NULL, the data channel is not initiated until 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** MCA_DataChnlCfg is called to provide the p_chnl_cfg. 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** When the data channel is open successfully, a MCA_OPEN_CFM_EVT 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is reported. This data channel is identified as tMCA_DL. 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns MCA_SUCCESS if successful, otherwise error. 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_RESULT MCA_CreateMdl(tMCA_CL mcl, tMCA_DEP dep, UINT16 data_psm, 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mdl_id, UINT8 peer_dep_id, 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 cfg, const tMCA_CHNL_CFG *p_chnl_cfg) 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RESULT result = MCA_BAD_HANDLE; 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB *p_ccb = mca_ccb_by_hdl(mcl); 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB_MSG *p_evt_data; 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_DCB *p_dcb; 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_API4 ("MCA_CreateMdl: %d dep=%d mdl_id=%d peer_dep_id=%d", mcl, dep, mdl_id, peer_dep_id); 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb) 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb->p_tx_req || p_ccb->p_rx_msg || p_ccb->cong) 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR0 ("pending req"); 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return MCA_BUSY; 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((peer_dep_id > MCA_MAX_MDEP_ID) || (!MCA_IS_VALID_MDL_ID(mdl_id))) 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR2 ("bad peer dep id:%d or bad mdl id: %d ", peer_dep_id, mdl_id); 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return MCA_BAD_PARAMS; 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (mca_ccb_uses_mdl_id(p_ccb, mdl_id)) 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR1 ("mdl id: %d is used in the control link", mdl_id); 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return MCA_BAD_MDL_ID; 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb = mca_dcb_alloc(p_ccb, dep); 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_NO_RESOURCES; 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dcb) 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save the info required by dcb connection */ 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb->p_chnl_cfg = p_chnl_cfg; 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb->mdl_id = mdl_id; 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data = (tMCA_CCB_MSG *)GKI_getbuf (sizeof(tMCA_CCB_MSG)); 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_evt_data) 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_ccb->data_vpsm) 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->data_vpsm = L2CA_Register (data_psm, (tL2CAP_APPL_INFO *)&mca_l2c_int_appl); 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb->data_vpsm) 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data->dcb_idx = mca_dcb_to_hdl (p_dcb); 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data->mdep_id = peer_dep_id; 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data->mdl_id = mdl_id; 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data->param = cfg; 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data->op_code = MCA_OP_MDL_CREATE_REQ; 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data->hdr.event = MCA_CCB_API_REQ_EVT; 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data->hdr.layer_specific = FALSE; 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_ccb_event(p_ccb, MCA_CCB_API_REQ_EVT, (tMCA_CCB_EVT *)p_evt_data); 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return MCA_SUCCESS; 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_evt_data); 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_dcb_dealloc(p_dcb, NULL); 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function MCA_CreateMdlRsp 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends a CREATE_MDL response to the peer device 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** in response to a received MCA_CREATE_IND_EVT. 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If the rsp_code is successful, a data channel is open 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with the given p_chnl_cfg 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** When the data channel is open successfully, a MCA_OPEN_IND_EVT 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is reported. This data channel is identified as tMCA_DL. 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns MCA_SUCCESS if successful, otherwise error. 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_RESULT MCA_CreateMdlRsp(tMCA_CL mcl, tMCA_DEP dep, 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mdl_id, UINT8 cfg, UINT8 rsp_code, 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const tMCA_CHNL_CFG *p_chnl_cfg) 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RESULT result = MCA_BAD_HANDLE; 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB *p_ccb = mca_ccb_by_hdl(mcl); 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB_MSG evt_data; 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_DCB *p_dcb; 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_API5 ("MCA_CreateMdlRsp: %d dep=%d mdl_id=%d cfg=%d rsp_code=%d", mcl, dep, mdl_id, cfg, rsp_code); 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project WC_ASSERT(p_chnl_cfg != NULL ); 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb) 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb->cong) 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR0 ("congested"); 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return MCA_BUSY; 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb->p_rx_msg && (p_ccb->p_rx_msg->mdep_id == dep ) 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_ccb->p_rx_msg->mdl_id == mdl_id) && (p_ccb->p_rx_msg->op_code == MCA_OP_MDL_CREATE_REQ)) 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_SUCCESS; 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.dcb_idx = 0; 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (rsp_code == MCA_RSP_SUCCESS) 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb = mca_dcb_alloc(p_ccb, dep); 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dcb) 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.dcb_idx = mca_dcb_to_hdl(p_dcb); 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb->p_chnl_cfg = p_chnl_cfg; 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb->mdl_id = mdl_id; 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rsp_code = MCA_RSP_MDEP_BUSY; 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_NO_RESOURCES; 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == MCA_SUCCESS) 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.mdl_id = mdl_id; 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.param = cfg; 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.rsp_code = rsp_code; 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.op_code = MCA_OP_MDL_CREATE_RSP; 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_ccb_event(p_ccb, MCA_CCB_API_RSP_EVT, (tMCA_CCB_EVT *)&evt_data); 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR0 ("The given MCL is not expecting a MCA_CreateMdlRsp with the given parameters" ); 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_BAD_PARAMS; 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function MCA_CloseReq 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Close a data channel. When the channel is closed, an 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** MCA_CLOSE_CFM_EVT is sent to the application via the 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** control callback function for this handle. 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns MCA_SUCCESS if successful, otherwise error. 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_RESULT MCA_CloseReq(tMCA_DL mdl) 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RESULT result = MCA_BAD_HANDLE; 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_DCB *p_dcb = mca_dcb_by_hdl(mdl); 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_API1 ("MCA_CloseReq: %d ", mdl); 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dcb) 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_SUCCESS; 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_dcb_event(p_dcb, MCA_DCB_API_CLOSE_EVT, NULL); 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function MCA_ReconnectMdl 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends a RECONNECT_MDL request to the peer device. 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** When the response is received, a MCA_RECONNECT_CFM_EVT is reported. 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If p_chnl_cfg is NULL, the data channel is not initiated until 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** MCA_DataChnlCfg is called to provide the p_chnl_cfg. 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If the response is successful, a data channel is open. 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** When the data channel is open successfully, a MCA_OPEN_CFM_EVT 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is reported. 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns MCA_SUCCESS if successful, otherwise error. 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_RESULT MCA_ReconnectMdl(tMCA_CL mcl, tMCA_DEP dep, UINT16 data_psm, 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mdl_id, const tMCA_CHNL_CFG *p_chnl_cfg) 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RESULT result = MCA_BAD_HANDLE; 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB *p_ccb = mca_ccb_by_hdl(mcl); 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB_MSG *p_evt_data; 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_DCB *p_dcb; 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_API1 ("MCA_ReconnectMdl: %d ", mcl); 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project WC_ASSERT(p_chnl_cfg != NULL ); 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb) 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb->p_tx_req || p_ccb->p_rx_msg || p_ccb->cong) 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR0 ("pending req"); 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return MCA_BUSY; 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!MCA_IS_VALID_MDL_ID(mdl_id)) 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR1 ("bad mdl id: %d ", mdl_id); 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return MCA_BAD_PARAMS; 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (mca_ccb_uses_mdl_id(p_ccb, mdl_id)) 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR1 ("mdl id: %d is used in the control link", mdl_id); 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return MCA_BAD_MDL_ID; 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb = mca_dcb_alloc(p_ccb, dep); 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_NO_RESOURCES; 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dcb) 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb->p_chnl_cfg = p_chnl_cfg; 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb->mdl_id = mdl_id; 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data = (tMCA_CCB_MSG *)GKI_getbuf (sizeof(tMCA_CCB_MSG)); 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_evt_data) 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_ccb->data_vpsm) 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->data_vpsm = L2CA_Register (data_psm, (tL2CAP_APPL_INFO *)&mca_l2c_int_appl); 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data->dcb_idx = mca_dcb_to_hdl(p_dcb); 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data->mdl_id = mdl_id; 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data->op_code = MCA_OP_MDL_RECONNECT_REQ; 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data->hdr.event = MCA_CCB_API_REQ_EVT; 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_ccb_event(p_ccb, MCA_CCB_API_REQ_EVT, (tMCA_CCB_EVT *)p_evt_data); 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return MCA_SUCCESS; 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_dcb_dealloc(p_dcb, NULL); 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function MCA_ReconnectMdlRsp 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends a RECONNECT_MDL response to the peer device 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** in response to a MCA_RECONNECT_IND_EVT event. 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If the response is successful, a data channel is open. 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** When the data channel is open successfully, a MCA_OPEN_IND_EVT 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is reported. 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns MCA_SUCCESS if successful, otherwise error. 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_RESULT MCA_ReconnectMdlRsp(tMCA_CL mcl, tMCA_DEP dep, 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mdl_id, UINT8 rsp_code, 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const tMCA_CHNL_CFG *p_chnl_cfg) 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RESULT result = MCA_BAD_HANDLE; 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB *p_ccb = mca_ccb_by_hdl(mcl); 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB_MSG evt_data; 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_DCB *p_dcb; 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_API1 ("MCA_ReconnectMdlRsp: %d ", mcl); 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project WC_ASSERT(p_chnl_cfg != NULL ); 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb) 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb->cong) 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR0 ("congested"); 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return MCA_BUSY; 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb->p_rx_msg && (p_ccb->p_rx_msg->mdl_id == mdl_id) && 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_ccb->p_rx_msg->op_code == MCA_OP_MDL_RECONNECT_REQ)) 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_SUCCESS; 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.dcb_idx = 0; 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (rsp_code == MCA_RSP_SUCCESS) 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb = mca_dcb_alloc(p_ccb, dep); 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dcb) 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.dcb_idx = mca_dcb_to_hdl(p_dcb); 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb->p_chnl_cfg = p_chnl_cfg; 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb->mdl_id = mdl_id; 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR0 ("Out of MDL for this MDEP"); 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rsp_code = MCA_RSP_MDEP_BUSY; 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_NO_RESOURCES; 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.mdl_id = mdl_id; 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.rsp_code = rsp_code; 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.op_code = MCA_OP_MDL_RECONNECT_RSP; 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_ccb_event(p_ccb, MCA_CCB_API_RSP_EVT, (tMCA_CCB_EVT *)&evt_data); 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR0 ("The given MCL is not expecting a MCA_ReconnectMdlRsp with the given parameters" ); 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_BAD_PARAMS; 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function MCA_DataChnlCfg 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function initiates a data channel connection toward the 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connected peer device. 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** When the data channel is open successfully, a MCA_OPEN_CFM_EVT 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is reported. This data channel is identified as tMCA_DL. 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns MCA_SUCCESS if successful, otherwise error. 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_RESULT MCA_DataChnlCfg(tMCA_CL mcl, const tMCA_CHNL_CFG *p_chnl_cfg) 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RESULT result = MCA_BAD_HANDLE; 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB *p_ccb = mca_ccb_by_hdl(mcl); 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_DCB *p_dcb; 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_TC_TBL *p_tbl; 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_API1 ("MCA_DataChnlCfg: %d ", mcl); 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project WC_ASSERT(p_chnl_cfg != NULL ); 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb) 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_NO_RESOURCES; 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_ccb->p_tx_req == NULL) || (p_ccb->status != MCA_CCB_STAT_PENDING) || 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((p_dcb = mca_dcb_by_hdl(p_ccb->p_tx_req->dcb_idx)) == NULL)) 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR1 ("The given MCL is not expecting this API:%d", p_ccb->status); 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb->p_chnl_cfg = p_chnl_cfg; 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_MCAP_DATA, p_ccb->sec_mask, 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->data_vpsm, BTM_SEC_PROTO_MCA, p_ccb->p_tx_req->dcb_idx); 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb->lcid = mca_l2c_open_req(p_ccb->peer_addr, p_ccb->data_vpsm, p_dcb->p_chnl_cfg); 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dcb->lcid) 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl = mca_tc_tbl_dalloc(p_dcb); 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tbl) 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl->state = MCA_TC_ST_CONN; 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_SUCCESS; 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function MCA_Abort 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends a ABORT_MDL request to the peer device. 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** When the response is received, a MCA_ABORT_CFM_EVT is reported. 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns MCA_SUCCESS if successful, otherwise error. 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_RESULT MCA_Abort(tMCA_CL mcl) 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RESULT result = MCA_BAD_HANDLE; 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB *p_ccb = mca_ccb_by_hdl(mcl); 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB_MSG *p_evt_data; 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_DCB *p_dcb; 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_API1 ("MCA_Abort: %d", mcl); 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb) 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_NO_RESOURCES; 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* verify that we are waiting for data channel to come up with the given mdl */ 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_ccb->p_tx_req == NULL) || (p_ccb->status != MCA_CCB_STAT_PENDING) || 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((p_dcb = mca_dcb_by_hdl(p_ccb->p_tx_req->dcb_idx)) == NULL)) 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR1 ("The given MCL is not expecting this API:%d", p_ccb->status); 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb->cong) 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR0 ("congested"); 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return MCA_BUSY; 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_NO_RESOURCES; 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data = (tMCA_CCB_MSG *)GKI_getbuf (sizeof(tMCA_CCB_MSG)); 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_evt_data) 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_SUCCESS; 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data->op_code = MCA_OP_MDL_ABORT_REQ; 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data->hdr.event = MCA_CCB_API_REQ_EVT; 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_ccb_event(p_ccb, MCA_CCB_API_REQ_EVT, (tMCA_CCB_EVT *)p_evt_data); 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function MCA_Delete 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends a DELETE_MDL request to the peer device. 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** When the response is received, a MCA_DELETE_CFM_EVT is reported. 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns MCA_SUCCESS if successful, otherwise error. 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_RESULT MCA_Delete(tMCA_CL mcl, UINT16 mdl_id) 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RESULT result = MCA_BAD_HANDLE; 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB *p_ccb = mca_ccb_by_hdl(mcl); 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB_MSG *p_evt_data; 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_API1 ("MCA_Delete: %d ", mcl); 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb) 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb->cong) 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR0 ("congested"); 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return MCA_BUSY; 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!MCA_IS_VALID_MDL_ID(mdl_id) && (mdl_id != MCA_ALL_MDL_ID)) 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_ERROR1 ("bad mdl id: %d ", mdl_id); 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return MCA_BAD_PARAMS; 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data = (tMCA_CCB_MSG *)GKI_getbuf (sizeof(tMCA_CCB_MSG)); 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_evt_data) 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_SUCCESS; 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data->mdl_id = mdl_id; 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data->op_code = MCA_OP_MDL_DELETE_REQ; 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_data->hdr.event = MCA_CCB_API_REQ_EVT; 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_ccb_event(p_ccb, MCA_CCB_API_REQ_EVT, (tMCA_CCB_EVT *)p_evt_data); 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_NO_RESOURCES; 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function MCA_WriteReq 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send a data packet to the peer device. 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** The application passes the packet using the BT_HDR structure. 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** The offset field must be equal to or greater than L2CAP_MIN_OFFSET. 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This allows enough space in the buffer for the L2CAP header. 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** The memory pointed to by p_pkt must be a GKI buffer 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** allocated by the application. This buffer will be freed 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** by the protocol stack; the application must not free 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this buffer. 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns MCA_SUCCESS if successful, otherwise error. 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_RESULT MCA_WriteReq(tMCA_DL mdl, BT_HDR *p_pkt) 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RESULT result = MCA_BAD_HANDLE; 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_DCB *p_dcb = mca_dcb_by_hdl(mdl); 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_DCB_EVT evt_data; 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_API1 ("MCA_WriteReq: %d ", mdl); 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dcb) 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dcb->cong) 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_BUSY; 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.p_pkt = p_pkt; 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = MCA_SUCCESS; 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_dcb_event(p_dcb, MCA_DCB_API_WRITE_EVT, &evt_data); 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function MCA_GetL2CapChannel 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get the L2CAP CID used by the given data channel handle. 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns L2CAP channel ID if successful, otherwise 0. 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 MCA_GetL2CapChannel (tMCA_DL mdl) 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 lcid = 0; 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_DCB *p_dcb = mca_dcb_by_hdl(mdl); 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_TRACE_API1 ("MCA_GetL2CapChannel: %d ", mdl); 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dcb) 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project lcid = p_dcb->lcid; 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return lcid; 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 926