15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 1999-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 file contains L2CAP interface functions 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "rfcdefs.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_api.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_int.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2cdefs.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "rfc_int.h" 345cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Define Callback functions to be called by L2CAP 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void RFCOMM_ConnectInd (BD_ADDR bd_addr, UINT16 lcid, UINT16 psm, UINT8 id); 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void RFCOMM_ConnectCnf (UINT16 lcid, UINT16 err); 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void RFCOMM_ConfigInd (UINT16 lcid, tL2CAP_CFG_INFO *p_cfg); 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void RFCOMM_ConfigCnf (UINT16 lcid, tL2CAP_CFG_INFO *p_cfg); 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void RFCOMM_DisconnectInd (UINT16 lcid, BOOLEAN is_clear); 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void RFCOMM_QoSViolationInd (BD_ADDR bd_addr); 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void RFCOMM_BufDataInd (UINT16 lcid, BT_HDR *p_buf); 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void RFCOMM_CongestionStatusInd (UINT16 lcid, BOOLEAN is_congested); 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function rfcomm_l2cap_if_init 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called during the RFCOMM task startup 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to register interface functions with L2CAP. 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfcomm_l2cap_if_init (void) 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2CAP_APPL_INFO *p_l2c = &rfc_cb.rfc.reg_info; 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_l2c->pL2CA_ConnectInd_Cb = RFCOMM_ConnectInd; 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_l2c->pL2CA_ConnectCfm_Cb = RFCOMM_ConnectCnf; 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_l2c->pL2CA_ConnectPnd_Cb = NULL; 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_l2c->pL2CA_ConfigInd_Cb = RFCOMM_ConfigInd; 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_l2c->pL2CA_ConfigCfm_Cb = RFCOMM_ConfigCnf; 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_l2c->pL2CA_DisconnectInd_Cb = RFCOMM_DisconnectInd; 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_l2c->pL2CA_DisconnectCfm_Cb = NULL; 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_l2c->pL2CA_QoSViolationInd_Cb = RFCOMM_QoSViolationInd; 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_l2c->pL2CA_DataInd_Cb = RFCOMM_BufDataInd; 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_l2c->pL2CA_CongestionStatus_Cb = RFCOMM_CongestionStatusInd; 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_l2c->pL2CA_TxComplete_Cb = NULL; 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_Register (BT_PSM_RFCOMM, p_l2c); 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_ConnectInd 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is a callback function called by L2CAP when 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** L2CA_ConnectInd received. Allocate multiplexer control block 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** and dispatch the event to it. 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_ConnectInd (BD_ADDR bd_addr, UINT16 lcid, UINT16 psm, UINT8 id) 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tRFC_MCB *p_mcb = rfc_alloc_multiplexer_channel(bd_addr, FALSE); 915cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(psm); 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_mcb)&&(p_mcb->state != RFC_MX_STATE_IDLE)) 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if this is collision case */ 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_mcb->is_initiator)&&(p_mcb->state == RFC_MX_STATE_WAIT_CONN_CNF)) 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->pending_lcid = lcid; 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->pending_id = id; 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* wait random timeout (2 - 12) to resolve collision */ 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if peer gives up then local device rejects incoming connection and continues as initiator */ 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if timeout, local device disconnects outgoing connection and continues as acceptor */ 104d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_DEBUG ("RFCOMM_ConnectInd start timer for collision, initiator's LCID(0x%x), acceptor's LCID(0x%x)", 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->lcid, p_mcb->pending_lcid); 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_timer_start(p_mcb, (UINT16)(GKI_get_tick_count()%10 + 2)); 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we cannot accept connection request from peer at this state */ 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* don't update lcid */ 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb = NULL; 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store mcb even if null */ 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_save_lcid_mcb (p_mcb, lcid); 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mcb == NULL) 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConnectRsp (bd_addr, id, lcid, L2CAP_CONN_NO_RESOURCES, 0); 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->lcid = lcid; 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_CONN_IND, &id); 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_ConnectCnf 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is a callback function called by L2CAP when 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** L2CA_ConnectCnf received. Save L2CAP handle and dispatch 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event to the FSM. 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_ConnectCnf (UINT16 lcid, UINT16 result) 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tRFC_MCB *p_mcb = rfc_find_lcid_mcb (lcid); 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_mcb) 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 149d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_ERROR ("RFCOMM_ConnectCnf LCID:0x%x", lcid); 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mcb->pending_lcid) 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if peer rejects our connect request but peer's connect request is pending */ 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result != L2CAP_CONN_OK ) 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 i; 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 idx; 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 161d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_DEBUG ("RFCOMM_ConnectCnf retry as acceptor on pending LCID(0x%x)", p_mcb->pending_lcid); 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove mcb from mapping table */ 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_save_lcid_mcb (NULL, p_mcb->lcid); 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->lcid = p_mcb->pending_lcid; 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->is_initiator = FALSE; 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->state = RFC_MX_STATE_IDLE; 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store mcb into mapping table */ 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_save_lcid_mcb (p_mcb, p_mcb->lcid); 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update direction bit */ 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < RFCOMM_MAX_DLCI; i += 2) 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((idx = p_mcb->port_inx[i]) != 0) 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->port_inx[i] = 0; 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->port_inx[i+1] = idx; 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_cb.port.port[idx - 1].dlci += 1; 181d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_DEBUG ("RFCOMM MX - DLCI:%d -> %d", i, rfc_cb.port.port[idx - 1].dlci); 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_CONN_IND, &(p_mcb->pending_id)); 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 190d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_DEBUG ("RFCOMM_ConnectCnf peer gave up pending LCID(0x%x)", p_mcb->pending_lcid); 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Peer gave up his connection request, make sure cleaning up L2CAP channel */ 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConnectRsp (p_mcb->bd_addr, p_mcb->pending_id, p_mcb->pending_lcid, L2CAP_CONN_NO_RESOURCES, 0); 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->pending_lcid = 0; 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save LCID to be used in all consecutive calls to L2CAP */ 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->lcid = lcid; 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_CONN_CNF, &result); 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** 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_ConfigInd 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is a callback function called by L2CAP when 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** L2CA_ConfigInd received. Save parameters in the control 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** block and dispatch event to the FSM. 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_ConfigInd (UINT16 lcid, tL2CAP_CFG_INFO *p_cfg) 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tRFC_MCB *p_mcb = rfc_find_lcid_mcb (lcid); 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_mcb) 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 221d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_ERROR ("RFCOMM_ConfigInd LCID:0x%x", lcid); 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_CONF_IND, (void *)p_cfg); 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_ConfigCnf 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is a callback function called by L2CAP when 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** L2CA_ConfigCnf received. Save L2CAP handle and dispatch 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event to the FSM. 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_ConfigCnf (UINT16 lcid, tL2CAP_CFG_INFO *p_cfg) 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tRFC_MCB *p_mcb = rfc_find_lcid_mcb (lcid); 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_mcb) 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 244d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_ERROR ("RFCOMM_ConfigCnf no MCB LCID:0x%x", lcid); 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_CONF_CNF, (void *)p_cfg); 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_QoSViolationInd 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is a callback function called by L2CAP when 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** L2CA_QoSViolationIndInd received. Dispatch event to the FSM. 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_QoSViolationInd (BD_ADDR bd_addr) 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2625cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(bd_addr); 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_DisconnectInd 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is a callback function called by L2CAP when 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** L2CA_DisconnectInd received. Dispatch event to the FSM. 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_DisconnectInd (UINT16 lcid, BOOLEAN is_conf_needed) 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tRFC_MCB *p_mcb = rfc_find_lcid_mcb (lcid); 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_conf_needed) 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectRsp (lcid); 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_mcb) 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 285d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_WARNING ("RFCOMM_DisconnectInd LCID:0x%x", lcid); 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_DISC_IND, NULL); 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_BufDataInd 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is a callback function called by L2CAP when 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** data RFCOMM frame is received. Parse the frames, check 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the checksum and dispatch event to multiplexer or port 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** state machine depending on the frame destination. 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_BufDataInd (UINT16 lcid, BT_HDR *p_buf) 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tRFC_MCB *p_mcb = rfc_find_lcid_mcb (lcid); 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port; 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 event; 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_mcb) 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 312d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_WARNING ("RFCOMM_BufDataInd LCID:0x%x", lcid); 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = rfc_parse_data (p_mcb, &rfc_cb.rfc.rx_frame, p_buf); 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the frame did not pass validation just ignore it */ 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == RFC_EVENT_BAD_FRAME) 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (rfc_cb.rfc.rx_frame.dlci == RFCOMM_MX_DLCI) 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Take special care of the Multiplexer Control Messages */ 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == RFC_EVENT_UIH) 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_process_mx_message (p_mcb, p_buf); 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Other multiplexer events go to state machine */ 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_mx_sm_execute (p_mcb, event, NULL); 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The frame was received on the data channel DLCI, verify that DLC exists */ 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_port = port_find_mcb_dlci_port (p_mcb, rfc_cb.rfc.rx_frame.dlci)) == NULL) 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!p_port->rfc.p_mcb)) 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this is a SABME on the new port, check if any appl is waiting for it */ 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event != RFC_EVENT_SABME) 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (( p_mcb->is_initiator && !rfc_cb.rfc.rx_frame.cr) 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!p_mcb->is_initiator && rfc_cb.rfc.rx_frame.cr)) 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_send_dm (p_mcb, rfc_cb.rfc.rx_frame.dlci, rfc_cb.rfc.rx_frame.pf); 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_port = port_find_dlci_port (rfc_cb.rfc.rx_frame.dlci)) == NULL) 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_send_dm (p_mcb, rfc_cb.rfc.rx_frame.dlci, TRUE); 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->port_inx[rfc_cb.rfc.rx_frame.dlci] = p_port->inx; 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->rfc.p_mcb = p_mcb; 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == RFC_EVENT_UIH) 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf->len > 0) 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_port_sm_execute (p_port, event, p_buf); 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (rfc_cb.rfc.rx_frame.credit != 0) 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_inc_credit (p_port, rfc_cb.rfc.rx_frame.credit); 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_port_sm_execute (p_port, event, NULL); 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_CongestionStatusInd 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is a callback function called by L2CAP when 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** data RFCOMM L2CAP congestion status changes 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_CongestionStatusInd (UINT16 lcid, BOOLEAN is_congested) 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tRFC_MCB *p_mcb = rfc_find_lcid_mcb (lcid); 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_mcb) 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 395d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_ERROR ("RFCOMM_CongestionStatusInd dropped LCID:0x%x", lcid); 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 400d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("RFCOMM_CongestionStatusInd LCID:0x%x", lcid); 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_process_l2cap_congestion (p_mcb, is_congested); 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** Function rfc_find_lcid_mcb 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function returns MCB block supporting local cid 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttRFC_MCB *rfc_find_lcid_mcb (UINT16 lcid) 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tRFC_MCB *p_mcb; 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (lcid - L2CAP_BASE_APPL_CID >= MAX_L2CAP_CHANNELS) 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 418d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_ERROR ("rfc_find_lcid_mcb LCID:0x%x", lcid); 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_mcb = rfc_cb.rfc.p_rfc_lcid_mcb[lcid - L2CAP_BASE_APPL_CID]) != NULL) 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mcb->lcid != lcid) 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 427d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_WARNING ("rfc_find_lcid_mcb LCID reused LCID:0x%x current:0x%x", lcid, p_mcb->lcid); 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p_mcb); 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function rfc_save_lcid_mcb 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function returns MCB block supporting local cid 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_save_lcid_mcb (tRFC_MCB *p_mcb, UINT16 lcid) 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_cb.rfc.p_rfc_lcid_mcb[lcid - L2CAP_BASE_APPL_CID] = p_mcb; 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 447