16ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/******************************************************************************
26ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
36ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  Copyright (C) 1999-2012 Broadcom Corporation
46ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
56ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  Licensed under the Apache License, Version 2.0 (the "License");
66ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  you may not use this file except in compliance with the License.
76ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  You may obtain a copy of the License at:
86ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
96ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  http://www.apache.org/licenses/LICENSE-2.0
106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  Unless required by applicable law or agreed to in writing, software
126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  distributed under the License is distributed on an "AS IS" BASIS,
136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  See the License for the specific language governing permissions and
156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  limitations under the License.
166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/
186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/******************************************************************************
206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  This file contains L2CAP interface functions
226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/
24e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
25e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bt_target.h"
26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "gki.h"
27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
28e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "rfcdefs.h"
29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "port_api.h"
30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "port_int.h"
31e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "l2c_api.h"
32e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "l2cdefs.h"
33e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "rfc_int.h"
34e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
35e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
366ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/*
37e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Define Callback functions to be called by L2CAP
38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*/
39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void RFCOMM_ConnectInd (BD_ADDR bd_addr, UINT16 lcid, UINT16 psm, UINT8 id);
40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void RFCOMM_ConnectCnf (UINT16  lcid, UINT16 err);
41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void RFCOMM_ConfigInd (UINT16 lcid, tL2CAP_CFG_INFO *p_cfg);
42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void RFCOMM_ConfigCnf (UINT16 lcid, tL2CAP_CFG_INFO *p_cfg);
43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void RFCOMM_DisconnectInd (UINT16 lcid, BOOLEAN is_clear);
44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void RFCOMM_QoSViolationInd (BD_ADDR bd_addr);
45e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void RFCOMM_BufDataInd (UINT16 lcid, BT_HDR *p_buf);
46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void RFCOMM_CongestionStatusInd (UINT16 lcid, BOOLEAN is_congested);
47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
48e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
49e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
50e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
51e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfcomm_l2cap_if_init
52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
53e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called during the RFCOMM task startup
54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  to register interface functions with L2CAP.
55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
57e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfcomm_l2cap_if_init (void)
58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tL2CAP_APPL_INFO *p_l2c = &rfc_cb.rfc.reg_info;
60e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
61e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_l2c->pL2CA_ConnectInd_Cb       = RFCOMM_ConnectInd;
62e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_l2c->pL2CA_ConnectCfm_Cb       = RFCOMM_ConnectCnf;
63e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_l2c->pL2CA_ConnectPnd_Cb       = NULL;
64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_l2c->pL2CA_ConfigInd_Cb        = RFCOMM_ConfigInd;
65e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_l2c->pL2CA_ConfigCfm_Cb        = RFCOMM_ConfigCnf;
66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_l2c->pL2CA_DisconnectInd_Cb    = RFCOMM_DisconnectInd;
67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_l2c->pL2CA_DisconnectCfm_Cb    = NULL;
68e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_l2c->pL2CA_QoSViolationInd_Cb  = RFCOMM_QoSViolationInd;
69e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_l2c->pL2CA_DataInd_Cb          = RFCOMM_BufDataInd;
70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_l2c->pL2CA_CongestionStatus_Cb = RFCOMM_CongestionStatusInd;
71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_l2c->pL2CA_TxComplete_Cb       = NULL;
72e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    L2CA_Register (BT_PSM_RFCOMM, p_l2c);
75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
76e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         RFCOMM_ConnectInd
81e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
826ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description      This is a callback function called by L2CAP when
83e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  L2CA_ConnectInd received.  Allocate multiplexer control block
84e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  and dispatch the event to it.
85e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
86e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
87e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_ConnectInd (BD_ADDR bd_addr, UINT16 lcid, UINT16 psm, UINT8 id)
88e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
89e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tRFC_MCB *p_mcb = rfc_alloc_multiplexer_channel(bd_addr, FALSE);
90e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
91e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((p_mcb)&&(p_mcb->state != RFC_MX_STATE_IDLE))
92e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
93e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* if this is collision case */
94e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if ((p_mcb->is_initiator)&&(p_mcb->state == RFC_MX_STATE_WAIT_CONN_CNF))
95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_mcb->pending_lcid = lcid;
97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_mcb->pending_id   = id;
98e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
99e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* wait random timeout (2 - 12) to resolve collision */
100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* if peer gives up then local device rejects incoming connection and continues as initiator */
101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* if timeout, local device disconnects outgoing connection and continues as acceptor */
102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            RFCOMM_TRACE_DEBUG2 ("RFCOMM_ConnectInd start timer for collision, initiator's LCID(0x%x), acceptor's LCID(0x%x)",
103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                  p_mcb->lcid, p_mcb->pending_lcid);
104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            rfc_timer_start(p_mcb, (UINT16)(GKI_get_tick_count()%10 + 2));
106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return;
107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else
109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* we cannot accept connection request from peer at this state */
111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* don't update lcid */
112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_mcb = NULL;
113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* store mcb even if null */
118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_save_lcid_mcb (p_mcb, lcid);
119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_mcb == NULL)
122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        L2CA_ConnectRsp (bd_addr, id, lcid, L2CAP_CONN_NO_RESOURCES, 0);
124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_mcb->lcid     = lcid;
127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_CONN_IND, &id);
129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         RFCOMM_ConnectCnf
135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1366ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description      This is a callback function called by L2CAP when
137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  L2CA_ConnectCnf received.  Save L2CAP handle and dispatch
138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  event to the FSM.
139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_ConnectCnf (UINT16 lcid, UINT16 result)
142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tRFC_MCB *p_mcb = rfc_find_lcid_mcb (lcid);
144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (!p_mcb)
146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        RFCOMM_TRACE_ERROR1 ("RFCOMM_ConnectCnf LCID:0x%x", lcid);
148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_mcb->pending_lcid)
152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* if peer rejects our connect request but peer's connect request is pending */
154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (result != L2CAP_CONN_OK )
155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            UINT16 i;
157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            UINT8  idx;
158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            RFCOMM_TRACE_DEBUG1 ("RFCOMM_ConnectCnf retry as acceptor on pending LCID(0x%x)", p_mcb->pending_lcid);
160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* remove mcb from mapping table */
162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            rfc_save_lcid_mcb (NULL, p_mcb->lcid);
163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_mcb->lcid         = p_mcb->pending_lcid;
165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_mcb->is_initiator = FALSE;
166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_mcb->state        = RFC_MX_STATE_IDLE;
167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* store mcb into mapping table */
169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            rfc_save_lcid_mcb (p_mcb, p_mcb->lcid);
170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* update direction bit */
172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            for (i = 0; i < RFCOMM_MAX_DLCI; i += 2)
173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if ((idx = p_mcb->port_inx[i]) != 0)
175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    p_mcb->port_inx[i] = 0;
177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    p_mcb->port_inx[i+1] = idx;
178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    rfc_cb.port.port[idx - 1].dlci += 1;
179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    RFCOMM_TRACE_DEBUG2 ("RFCOMM MX - DLCI:%d -> %d", i, rfc_cb.port.port[idx - 1].dlci);
180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_CONN_IND, &(p_mcb->pending_id));
184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return;
185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else
187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            RFCOMM_TRACE_DEBUG1 ("RFCOMM_ConnectCnf peer gave up pending LCID(0x%x)", p_mcb->pending_lcid);
189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* Peer gave up his connection request, make sure cleaning up L2CAP channel */
191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            L2CA_ConnectRsp (p_mcb->bd_addr, p_mcb->pending_id, p_mcb->pending_lcid, L2CAP_CONN_NO_RESOURCES, 0);
192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_mcb->pending_lcid = 0;
194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Save LCID to be used in all consecutive calls to L2CAP */
198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_mcb->lcid         = lcid;
199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_CONN_CNF, &result);
201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         RFCOMM_ConfigInd
207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
2086ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description      This is a callback function called by L2CAP when
209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  L2CA_ConfigInd received.  Save parameters in the control
210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  block and dispatch event to the FSM.
211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_ConfigInd (UINT16 lcid, tL2CAP_CFG_INFO *p_cfg)
214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tRFC_MCB *p_mcb = rfc_find_lcid_mcb (lcid);
216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (!p_mcb)
218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        RFCOMM_TRACE_ERROR1 ("RFCOMM_ConfigInd LCID:0x%x", lcid);
220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_CONF_IND, (void *)p_cfg);
224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         RFCOMM_ConfigCnf
230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
2316ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description      This is a callback function called by L2CAP when
232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  L2CA_ConfigCnf received.  Save L2CAP handle and dispatch
233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  event to the FSM.
234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_ConfigCnf (UINT16 lcid, tL2CAP_CFG_INFO *p_cfg)
237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tRFC_MCB *p_mcb = rfc_find_lcid_mcb (lcid);
239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (!p_mcb)
241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        RFCOMM_TRACE_ERROR1 ("RFCOMM_ConfigCnf no MCB LCID:0x%x", lcid);
243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_CONF_CNF, (void *)p_cfg);
247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         RFCOMM_QoSViolationInd
253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
2546ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description      This is a callback function called by L2CAP when
255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  L2CA_QoSViolationIndInd received.  Dispatch event to the FSM.
256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_QoSViolationInd (BD_ADDR bd_addr)
259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         RFCOMM_DisconnectInd
266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
2676ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description      This is a callback function called by L2CAP when
268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  L2CA_DisconnectInd received.  Dispatch event to the FSM.
269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_DisconnectInd (UINT16 lcid, BOOLEAN is_conf_needed)
272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tRFC_MCB *p_mcb = rfc_find_lcid_mcb (lcid);
274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (is_conf_needed)
276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        L2CA_DisconnectRsp (lcid);
278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (!p_mcb)
281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        RFCOMM_TRACE_WARNING1 ("RFCOMM_DisconnectInd LCID:0x%x", lcid);
283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_DISC_IND, NULL);
287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         RFCOMM_BufDataInd
293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
2946ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description      This is a callback function called by L2CAP when
2956ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                  data RFCOMM frame is received.  Parse the frames, check
296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  the checksum and dispatch event to multiplexer or port
297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  state machine depending on the frame destination.
298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_BufDataInd (UINT16 lcid, BT_HDR *p_buf)
301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tRFC_MCB *p_mcb = rfc_find_lcid_mcb (lcid);
303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tPORT    *p_port;
304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8    event;
305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (!p_mcb)
308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        RFCOMM_TRACE_WARNING1 ("RFCOMM_BufDataInd LCID:0x%x", lcid);
310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        GKI_freebuf (p_buf);
311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    event = rfc_parse_data (p_mcb, &rfc_cb.rfc.rx_frame, p_buf);
315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If the frame did not pass validation just ignore it */
317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (event == RFC_EVENT_BAD_FRAME)
318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        GKI_freebuf (p_buf);
320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (rfc_cb.rfc.rx_frame.dlci == RFCOMM_MX_DLCI)
324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Take special care of the Multiplexer Control Messages */
326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (event == RFC_EVENT_UIH)
327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            rfc_process_mx_message (p_mcb, p_buf);
329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return;
330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Other multiplexer events go to state machine */
333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_mx_sm_execute (p_mcb, event, NULL);
334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        GKI_freebuf (p_buf);
335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* The frame was received on the data channel DLCI, verify that DLC exists */
339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (((p_port = port_find_mcb_dlci_port (p_mcb, rfc_cb.rfc.rx_frame.dlci)) == NULL)
340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach     || (!p_port->rfc.p_mcb))
341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* If this is a SABME on the new port, check if any appl is waiting for it */
343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (event != RFC_EVENT_SABME)
344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (( p_mcb->is_initiator && !rfc_cb.rfc.rx_frame.cr)
346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach             || (!p_mcb->is_initiator &&  rfc_cb.rfc.rx_frame.cr))
347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                rfc_send_dm (p_mcb, rfc_cb.rfc.rx_frame.dlci, rfc_cb.rfc.rx_frame.pf);
348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            GKI_freebuf (p_buf);
349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return;
350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if ((p_port = port_find_dlci_port (rfc_cb.rfc.rx_frame.dlci)) == NULL)
353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            rfc_send_dm (p_mcb, rfc_cb.rfc.rx_frame.dlci, TRUE);
355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            GKI_freebuf (p_buf);
356e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return;
357e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
358e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_mcb->port_inx[rfc_cb.rfc.rx_frame.dlci] = p_port->inx;
359e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->rfc.p_mcb = p_mcb;
360e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
361e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
362e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (event == RFC_EVENT_UIH)
363e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (p_buf->len > 0)
365e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            rfc_port_sm_execute (p_port, event, p_buf);
366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else
367e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            GKI_freebuf (p_buf);
3686ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
369e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (rfc_cb.rfc.rx_frame.credit != 0)
370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            rfc_inc_credit (p_port, rfc_cb.rfc.rx_frame.credit);
371e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    rfc_port_sm_execute (p_port, event,  NULL);
375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    GKI_freebuf (p_buf);
376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
380e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         RFCOMM_CongestionStatusInd
381e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
3826ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description      This is a callback function called by L2CAP when
383e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  data RFCOMM L2CAP congestion status changes
384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
385e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_CongestionStatusInd (UINT16 lcid, BOOLEAN is_congested)
387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
388e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tRFC_MCB *p_mcb = rfc_find_lcid_mcb (lcid);
389e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (!p_mcb)
391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
392e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        RFCOMM_TRACE_ERROR1 ("RFCOMM_CongestionStatusInd dropped LCID:0x%x", lcid);
393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
394e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
395e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
396e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
397e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        RFCOMM_TRACE_EVENT1 ("RFCOMM_CongestionStatusInd LCID:0x%x", lcid);
398e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
399e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    rfc_process_l2cap_congestion (p_mcb, is_congested);
400e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
401e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
402e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
403e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
404e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_find_lcid_mcb
405e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
406e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function returns MCB block supporting local cid
407e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
408e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
409e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtRFC_MCB *rfc_find_lcid_mcb (UINT16 lcid)
410e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
411e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tRFC_MCB *p_mcb;
412e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
413e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (lcid - L2CAP_BASE_APPL_CID >= MAX_L2CAP_CHANNELS)
414e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
415e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        RFCOMM_TRACE_ERROR1 ("rfc_find_lcid_mcb LCID:0x%x", lcid);
416e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (NULL);
417e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
418e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
419e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
420e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if ((p_mcb = rfc_cb.rfc.p_rfc_lcid_mcb[lcid - L2CAP_BASE_APPL_CID]) != NULL)
421e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
422e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_mcb->lcid != lcid)
423e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
424e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                RFCOMM_TRACE_WARNING2 ("rfc_find_lcid_mcb LCID reused LCID:0x%x current:0x%x", lcid, p_mcb->lcid);
425e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                return (NULL);
426e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
427e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
428e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
429e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (p_mcb);
430e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
431e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
432e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
433e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
434e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
435e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_save_lcid_mcb
436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function returns MCB block supporting local cid
438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfc_save_lcid_mcb (tRFC_MCB *p_mcb, UINT16 lcid)
441e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
442e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    rfc_cb.rfc.p_rfc_lcid_mcb[lcid - L2CAP_BASE_APPL_CID] = p_mcb;
443e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
444