1 /******************************************************************************
3 * Copyright (C) 2009-2012 Broadcom Corporation
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 ******************************************************************************/
19 /******************************************************************************
21 * This is the implementation file for the MCAP Data Channel Action
24 ******************************************************************************/
27 #include "bt_target.h"
29 #include "bt_common.h"
33 /*******************************************************************************
35 ** Function mca_dcb_report_cong
37 ** Description This function is called to report the congestion flag.
41 *******************************************************************************/
42 void mca_dcb_report_cong (tMCA_DCB *p_dcb)
46 evt_data.cong_chg.cong = p_dcb->cong;
47 evt_data.cong_chg.mdl = mca_dcb_to_hdl(p_dcb);
48 evt_data.cong_chg.mdl_id = p_dcb->mdl_id;
49 mca_ccb_report_event (p_dcb->p_ccb, MCA_CONG_CHG_EVT, &evt_data);
52 /*******************************************************************************
54 ** Function mca_dcb_tc_open
56 ** Description This function is called to report MCA_OPEN_IND_EVT or
57 ** MCA_OPEN_CFM_EVT event.
58 ** It also clears the congestion flag (dcb.cong).
62 *******************************************************************************/
63 void mca_dcb_tc_open (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data)
66 tMCA_CCB *p_ccb = p_dcb->p_ccb;
67 UINT8 event = MCA_OPEN_IND_EVT;
69 if (p_data->open.param == MCA_INT)
70 event = MCA_OPEN_CFM_EVT;
72 evt_data.open_cfm.mtu = p_data->open.peer_mtu;
73 evt_data.open_cfm.mdl_id = p_dcb->mdl_id;
74 evt_data.open_cfm.mdl = mca_dcb_to_hdl(p_dcb);
75 mca_ccb_event (p_ccb, MCA_CCB_DL_OPEN_EVT, NULL);
76 mca_ccb_report_event (p_ccb, event, &evt_data);
79 /*******************************************************************************
81 ** Function mca_dcb_cong
83 ** Description This function sets the congestion state for the DCB.
87 *******************************************************************************/
88 void mca_dcb_cong (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data)
90 p_dcb->cong = p_data->llcong;
91 mca_dcb_report_cong(p_dcb);
94 /*******************************************************************************
96 ** Function mca_dcb_free_data
98 ** Description This function frees the received message.
102 *******************************************************************************/
103 void mca_dcb_free_data(tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data)
109 /*******************************************************************************
111 ** Function mca_dcb_do_disconn
113 ** Description This function closes a data channel.
117 *******************************************************************************/
118 void mca_dcb_do_disconn (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data)
123 if ((p_dcb->lcid == 0) || (L2CA_DisconnectReq(p_dcb->lcid) == FALSE))
125 close.param = MCA_INT;
126 close.reason = L2CAP_DISC_OK;
128 mca_dcb_event(p_dcb, MCA_DCB_TC_CLOSE_EVT, (tMCA_DCB_EVT *) &close);
132 /*******************************************************************************
134 ** Function mca_dcb_snd_data
136 ** Description This function sends the data from application to the peer device.
140 *******************************************************************************/
141 void mca_dcb_snd_data (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data)
145 /* do not need to check cong, because API already checked the status */
146 status = L2CA_DataWrite (p_dcb->lcid, p_data->p_pkt);
147 if (status == L2CAP_DW_CONGESTED)
150 mca_dcb_report_cong(p_dcb);
154 /*******************************************************************************
156 ** Function mca_dcb_hdl_data
158 ** Description This function reports the received data through the data
159 ** callback function.
163 *******************************************************************************/
164 void mca_dcb_hdl_data (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data)
166 (*p_dcb->p_cs->p_data_cback) (mca_dcb_to_hdl(p_dcb), (BT_HDR *)p_data);