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*******************************************************************************/ 42void 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*******************************************************************************/ 63void 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*******************************************************************************/ 88void 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*******************************************************************************/ 103void 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*******************************************************************************/ 119void 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*******************************************************************************/ 142void 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*******************************************************************************/ 165void 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