1 /****************************************************************************** 2 * 3 * Copyright 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_common.h" 28 #include "bt_target.h" 29 #include "bt_utils.h" 30 #include "mca_api.h" 31 #include "mca_int.h" 32 #include "osi/include/osi.h" 33 34 /******************************************************************************* 35 * 36 * Function mca_dcb_report_cong 37 * 38 * Description This function is called to report the congestion flag. 39 * 40 * Returns void. 41 * 42 ******************************************************************************/ 43 void mca_dcb_report_cong(tMCA_DCB* p_dcb) { 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 tMCA_CTRL evt_data; 65 tMCA_CCB* p_ccb = p_dcb->p_ccb; 66 uint8_t event = MCA_OPEN_IND_EVT; 67 68 if (p_data->open.param == MCA_INT) event = MCA_OPEN_CFM_EVT; 69 p_dcb->cong = false; 70 evt_data.open_cfm.mtu = p_data->open.peer_mtu; 71 evt_data.open_cfm.mdl_id = p_dcb->mdl_id; 72 evt_data.open_cfm.mdl = mca_dcb_to_hdl(p_dcb); 73 mca_ccb_event(p_ccb, MCA_CCB_DL_OPEN_EVT, NULL); 74 mca_ccb_report_event(p_ccb, event, &evt_data); 75 } 76 77 /******************************************************************************* 78 * 79 * Function mca_dcb_cong 80 * 81 * Description This function sets the congestion state for the DCB. 82 * 83 * Returns void. 84 * 85 ******************************************************************************/ 86 void mca_dcb_cong(tMCA_DCB* p_dcb, tMCA_DCB_EVT* p_data) { 87 p_dcb->cong = p_data->llcong; 88 mca_dcb_report_cong(p_dcb); 89 } 90 91 /******************************************************************************* 92 * 93 * Function mca_dcb_free_data 94 * 95 * Description This function frees the received message. 96 * 97 * Returns void. 98 * 99 ******************************************************************************/ 100 void mca_dcb_free_data(UNUSED_ATTR tMCA_DCB* p_dcb, tMCA_DCB_EVT* p_data) { 101 osi_free(p_data); 102 } 103 104 /******************************************************************************* 105 * 106 * Function mca_dcb_do_disconn 107 * 108 * Description This function closes a data channel. 109 * 110 * Returns void. 111 * 112 ******************************************************************************/ 113 void mca_dcb_do_disconn(tMCA_DCB* p_dcb, UNUSED_ATTR tMCA_DCB_EVT* p_data) { 114 if ((p_dcb->lcid == 0) || (!L2CA_DisconnectReq(p_dcb->lcid))) { 115 tMCA_CLOSE close; 116 close.param = MCA_INT; 117 close.reason = L2CAP_DISC_OK; 118 close.lcid = 0; 119 tMCA_DCB_EVT mca_dcb_evt; 120 mca_dcb_evt.close = close; 121 mca_dcb_event(p_dcb, MCA_DCB_TC_CLOSE_EVT, &mca_dcb_evt); 122 } 123 } 124 125 /******************************************************************************* 126 * 127 * Function mca_dcb_snd_data 128 * 129 * Description Send the data from application to the peer device. 130 * 131 * Returns void. 132 * 133 ******************************************************************************/ 134 void mca_dcb_snd_data(tMCA_DCB* p_dcb, tMCA_DCB_EVT* p_data) { 135 uint8_t status; 136 137 /* do not need to check cong, because API already checked the status */ 138 status = L2CA_DataWrite(p_dcb->lcid, p_data->p_pkt); 139 if (status == L2CAP_DW_CONGESTED) { 140 p_dcb->cong = true; 141 mca_dcb_report_cong(p_dcb); 142 } 143 } 144 145 /******************************************************************************* 146 * 147 * Function mca_dcb_hdl_data 148 * 149 * Description This function reports the received data through the data 150 * callback function. 151 * 152 * Returns void. 153 * 154 ******************************************************************************/ 155 void mca_dcb_hdl_data(tMCA_DCB* p_dcb, tMCA_DCB_EVT* p_data) { 156 (*p_dcb->p_cs->p_data_cback)(mca_dcb_to_hdl(p_dcb), (BT_HDR*)p_data); 157 } 158