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