/******************************************************************************* ** ** 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); } }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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)); }
/******************************************************************************* ** ** 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); }