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