/*******************************************************************************
**
** Function         mca_dcb_event
**
** Description      This function is the DCB state machine main function.
**                  It uses the state and action function tables to execute
**                  action functions.
**
** Returns          void.
**
*******************************************************************************/
void mca_dcb_event(tMCA_DCB *p_dcb, UINT8 event, tMCA_DCB_EVT *p_data)
{
    tMCA_DCB_ST_TBL    state_table;
    UINT8              action;

    if (p_dcb == NULL)
        return;
#if (BT_TRACE_VERBOSE == TRUE)
    MCA_TRACE_EVENT("DCB dcb=%d event=%s state=%s", mca_dcb_to_hdl(p_dcb), mca_dcb_evt_str[event], mca_dcb_st_str[p_dcb->state]);
#else
    MCA_TRACE_EVENT("DCB dcb=%d event=%d state=%d", mca_dcb_to_hdl(p_dcb), event, p_dcb->state);
#endif

    /* look up the state table for the current state */
    state_table = mca_dcb_st_tbl[p_dcb->state - 1];

    /* set next state */
    p_dcb->state = state_table[event][MCA_DCB_NEXT_STATE];

    /* execute action functions */
    if ((action = state_table[event][MCA_DCB_ACT_COL]) < MCA_DCB_IGNORE)
    {
        (*mca_dcb_action[action])(p_dcb, p_data);
    }
}
예제 #2
0
/*******************************************************************************
**
** Function         mca_dcb_report_cong
**
** Description      This function is called to report the congestion flag.
**
** Returns          void.
**
*******************************************************************************/
void mca_dcb_report_cong (tMCA_DCB *p_dcb)
{
    tMCA_CTRL   evt_data;

    evt_data.cong_chg.cong   = p_dcb->cong;
    evt_data.cong_chg.mdl    = mca_dcb_to_hdl(p_dcb);
    evt_data.cong_chg.mdl_id = p_dcb->mdl_id;
    mca_ccb_report_event (p_dcb->p_ccb, MCA_CONG_CHG_EVT, &evt_data);
}
예제 #3
0
/*******************************************************************************
**
** Function         mca_dcb_tc_open
**
** Description      This function is called to report MCA_OPEN_IND_EVT or
**                  MCA_OPEN_CFM_EVT event.
**                  It also clears the congestion flag (dcb.cong).
**
** Returns          void.
**
*******************************************************************************/
void mca_dcb_tc_open (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data)
{
    tMCA_CTRL   evt_data;
    tMCA_CCB    *p_ccb = p_dcb->p_ccb;
    UINT8       event = MCA_OPEN_IND_EVT;

    if (p_data->open.param == MCA_INT)
        event = MCA_OPEN_CFM_EVT;
    p_dcb->cong  = FALSE;
    evt_data.open_cfm.mtu       = p_data->open.peer_mtu;
    evt_data.open_cfm.mdl_id    = p_dcb->mdl_id;
    evt_data.open_cfm.mdl       = mca_dcb_to_hdl(p_dcb);
    mca_ccb_event (p_ccb, MCA_CCB_DL_OPEN_EVT, NULL);
    mca_ccb_report_event (p_ccb, event, &evt_data);
}
/*******************************************************************************
**
** Function         mca_dcb_dealloc
**
** Description      This function deallocates an DCB.
**
** Returns          void.
**
*******************************************************************************/
void mca_dcb_dealloc(tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data)
{
    tMCA_CCB *p_ccb = p_dcb->p_ccb;
    UINT8    event = MCA_CLOSE_IND_EVT;
    tMCA_CTRL   evt_data;

    MCA_TRACE_DEBUG("mca_dcb_dealloc");
    mca_free_buf ((void **)&p_dcb->p_data);
    if (p_data)
    {
        /* non-NULL -> an action function -> report disconnect event */
        evt_data.close_cfm.mdl      = mca_dcb_to_hdl(p_dcb);
        evt_data.close_cfm.reason   = p_data->close.reason;
        evt_data.close_cfm.mdl_id   = p_dcb->mdl_id;
        if (p_data->close.param == MCA_INT)
            event = MCA_CLOSE_CFM_EVT;
        if (p_data->close.lcid)
            mca_ccb_report_event(p_ccb, event, &evt_data);
    }
    mca_free_tc_tbl_by_lcid (p_dcb->lcid);
    memset (p_dcb, 0, sizeof (tMCA_DCB));
}
예제 #5
0
/*******************************************************************************
**
** Function         mca_dcb_hdl_data
**
** Description      This function reports the received data through the data
**                  callback function.
**
** Returns          void.
**
*******************************************************************************/
void mca_dcb_hdl_data (tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data)
{
    (*p_dcb->p_cs->p_data_cback) (mca_dcb_to_hdl(p_dcb), (BT_HDR *)p_data);
}