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 "gki.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 107 GKI_freebuf (p_data); 108 } 109 110 /******************************************************************************* 111 ** 112 ** Function mca_dcb_do_disconn 113 ** 114 ** Description This function closes a data channel. 115 ** 116 ** Returns void. 117 ** 118 *******************************************************************************/ 119 void mca_dcb_do_disconn (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data) 120 { 121 tMCA_CLOSE close; 122 UNUSED(p_data); 123 124 if ((p_dcb->lcid == 0) || (L2CA_DisconnectReq(p_dcb->lcid) == FALSE)) 125 { 126 close.param = MCA_INT; 127 close.reason = L2CAP_DISC_OK; 128 close.lcid = 0; 129 mca_dcb_event(p_dcb, MCA_DCB_TC_CLOSE_EVT, (tMCA_DCB_EVT *) &close); 130 } 131 } 132 133 /******************************************************************************* 134 ** 135 ** Function mca_dcb_snd_data 136 ** 137 ** Description This function sends the data from application to the peer device. 138 ** 139 ** Returns void. 140 ** 141 *******************************************************************************/ 142 void mca_dcb_snd_data (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data) 143 { 144 UINT8 status; 145 146 /* do not need to check cong, because API already checked the status */ 147 status = L2CA_DataWrite (p_dcb->lcid, p_data->p_pkt); 148 if (status == L2CAP_DW_CONGESTED) 149 { 150 p_dcb->cong = TRUE; 151 mca_dcb_report_cong(p_dcb); 152 } 153 } 154 155 /******************************************************************************* 156 ** 157 ** Function mca_dcb_hdl_data 158 ** 159 ** Description This function reports the received data through the data 160 ** callback function. 161 ** 162 ** Returns void. 163 ** 164 *******************************************************************************/ 165 void mca_dcb_hdl_data (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data) 166 { 167 (*p_dcb->p_cs->p_data_cback) (mca_dcb_to_hdl(p_dcb), (BT_HDR *)p_data); 168 } 169 170