Home | History | Annotate | Download | only in mcap
      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