1 /****************************************************************************** 2 * 3 * Copyright (C) 2009-2012 Broadcom Corporation 4 * 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: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 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. 16 * 17 ******************************************************************************/ 18 19 /****************************************************************************** 20 * 21 * This is the implementation file for the MCAP Data Channel Action 22 * Functions. 23 * 24 ******************************************************************************/ 25 26 #include <stddef.h> 27 #include "bt_target.h" 28 #include "bt_utils.h" 29 #include "bt_common.h" 30 #include "mca_api.h" 31 #include "mca_int.h" 32 33 /******************************************************************************* 34 ** 35 ** Function mca_dcb_report_cong 36 ** 37 ** Description This function is called to report the congestion flag. 38 ** 39 ** Returns void. 40 ** 41 *******************************************************************************/ 42 void mca_dcb_report_cong (tMCA_DCB *p_dcb) 43 { 44 tMCA_CTRL evt_data; 45 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); 50 } 51 52 /******************************************************************************* 53 ** 54 ** Function mca_dcb_tc_open 55 ** 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). 59 ** 60 ** Returns void. 61 ** 62 *******************************************************************************/ 63 void mca_dcb_tc_open (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data) 64 { 65 tMCA_CTRL evt_data; 66 tMCA_CCB *p_ccb = p_dcb->p_ccb; 67 UINT8 event = MCA_OPEN_IND_EVT; 68 69 if (p_data->open.param == MCA_INT) 70 event = MCA_OPEN_CFM_EVT; 71 p_dcb->cong = FALSE; 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); 77 } 78 79 /******************************************************************************* 80 ** 81 ** Function mca_dcb_cong 82 ** 83 ** Description This function sets the congestion state for the DCB. 84 ** 85 ** Returns void. 86 ** 87 *******************************************************************************/ 88 void mca_dcb_cong (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data) 89 { 90 p_dcb->cong = p_data->llcong; 91 mca_dcb_report_cong(p_dcb); 92 } 93 94 /******************************************************************************* 95 ** 96 ** Function mca_dcb_free_data 97 ** 98 ** Description This function frees the received message. 99 ** 100 ** Returns void. 101 ** 102 *******************************************************************************/ 103 void mca_dcb_free_data(tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data) 104 { 105 UNUSED(p_dcb); 106 osi_free(p_data); 107 } 108 109 /******************************************************************************* 110 ** 111 ** Function mca_dcb_do_disconn 112 ** 113 ** Description This function closes a data channel. 114 ** 115 ** Returns void. 116 ** 117 *******************************************************************************/ 118 void mca_dcb_do_disconn (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data) 119 { 120 tMCA_CLOSE close; 121 UNUSED(p_data); 122 123 if ((p_dcb->lcid == 0) || (L2CA_DisconnectReq(p_dcb->lcid) == FALSE)) 124 { 125 close.param = MCA_INT; 126 close.reason = L2CAP_DISC_OK; 127 close.lcid = 0; 128 mca_dcb_event(p_dcb, MCA_DCB_TC_CLOSE_EVT, (tMCA_DCB_EVT *) &close); 129 } 130 } 131 132 /******************************************************************************* 133 ** 134 ** Function mca_dcb_snd_data 135 ** 136 ** Description This function sends the data from application to the peer device. 137 ** 138 ** Returns void. 139 ** 140 *******************************************************************************/ 141 void mca_dcb_snd_data (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data) 142 { 143 UINT8 status; 144 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) 148 { 149 p_dcb->cong = TRUE; 150 mca_dcb_report_cong(p_dcb); 151 } 152 } 153 154 /******************************************************************************* 155 ** 156 ** Function mca_dcb_hdl_data 157 ** 158 ** Description This function reports the received data through the data 159 ** callback function. 160 ** 161 ** Returns void. 162 ** 163 *******************************************************************************/ 164 void mca_dcb_hdl_data (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data) 165 { 166 (*p_dcb->p_cs->p_data_cback) (mca_dcb_to_hdl(p_dcb), (BT_HDR *)p_data); 167 } 168 169