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#include "bt_target.h" 26#include "bt_utils.h" 27#include "gki.h" 28#include "mca_api.h" 29#include "mca_int.h" 30 31/******************************************************************************* 32** 33** Function mca_dcb_report_cong 34** 35** Description This function is called to report the congestion flag. 36** 37** Returns void. 38** 39*******************************************************************************/ 40void mca_dcb_report_cong (tMCA_DCB *p_dcb) 41{ 42 tMCA_CTRL evt_data; 43 44 evt_data.cong_chg.cong = p_dcb->cong; 45 evt_data.cong_chg.mdl = mca_dcb_to_hdl(p_dcb); 46 evt_data.cong_chg.mdl_id = p_dcb->mdl_id; 47 mca_ccb_report_event (p_dcb->p_ccb, MCA_CONG_CHG_EVT, &evt_data); 48} 49 50/******************************************************************************* 51** 52** Function mca_dcb_tc_open 53** 54** Description This function is called to report MCA_OPEN_IND_EVT or 55** MCA_OPEN_CFM_EVT event. 56** It also clears the congestion flag (dcb.cong). 57** 58** Returns void. 59** 60*******************************************************************************/ 61void mca_dcb_tc_open (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data) 62{ 63 tMCA_CTRL evt_data; 64 tMCA_CCB *p_ccb = p_dcb->p_ccb; 65 UINT8 event = MCA_OPEN_IND_EVT; 66 67 if (p_data->open.param == MCA_INT) 68 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*******************************************************************************/ 86void mca_dcb_cong (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data) 87{ 88 p_dcb->cong = p_data->llcong; 89 mca_dcb_report_cong(p_dcb); 90} 91 92/******************************************************************************* 93** 94** Function mca_dcb_free_data 95** 96** Description This function frees the received message. 97** 98** Returns void. 99** 100*******************************************************************************/ 101void mca_dcb_free_data (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data) 102{ 103 UNUSED(p_dcb); 104 105 GKI_freebuf (p_data); 106} 107 108/******************************************************************************* 109** 110** Function mca_dcb_do_disconn 111** 112** Description This function closes a data channel. 113** 114** Returns void. 115** 116*******************************************************************************/ 117void mca_dcb_do_disconn (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data) 118{ 119 tMCA_CLOSE close; 120 UNUSED(p_data); 121 122 if ((p_dcb->lcid == 0) || (L2CA_DisconnectReq(p_dcb->lcid) == FALSE)) 123 { 124 close.param = MCA_INT; 125 close.reason = L2CAP_DISC_OK; 126 close.lcid = 0; 127 mca_dcb_event(p_dcb, MCA_DCB_TC_CLOSE_EVT, (tMCA_DCB_EVT *) &close); 128 } 129} 130 131/******************************************************************************* 132** 133** Function mca_dcb_snd_data 134** 135** Description This function sends the data from application to the peer device. 136** 137** Returns void. 138** 139*******************************************************************************/ 140void mca_dcb_snd_data (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data) 141{ 142 UINT8 status; 143 144 /* do not need to check cong, because API already checked the status */ 145 status = L2CA_DataWrite (p_dcb->lcid, p_data->p_pkt); 146 if (status == L2CAP_DW_CONGESTED) 147 { 148 p_dcb->cong = TRUE; 149 mca_dcb_report_cong(p_dcb); 150 } 151} 152 153/******************************************************************************* 154** 155** Function mca_dcb_hdl_data 156** 157** Description This function reports the received data through the data 158** callback function. 159** 160** Returns void. 161** 162*******************************************************************************/ 163void mca_dcb_hdl_data (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data) 164{ 165 (*p_dcb->p_cs->p_data_cback) (mca_dcb_to_hdl(p_dcb), (BT_HDR *)p_data); 166} 167 168