📄 lcm_q921.c
字号:
switch( cmd ) { case _SABME: send_u_frame( linkp, linkp->own_resp, _UA, framep->frm.u_frame.p_f, mb ); CLEAR_EXCEPTION_COND(linkp); mdl_error_indication( linkp, Q921_ERR_F ); if( linkp->v_s != linkp->v_a ) { discard_i_que( linkp ); send_msg_to_l3( linkp, MDL_ESTABLISH_INDICATION ); } stop_t200( linkp ); start_t203( linkp ); linkp->v_s = 0; linkp->v_a = 0; linkp->v_r = 0; break; case _DISC: discard_i_que( linkp ); send_u_frame( linkp, linkp->own_resp, _UA, framep->frm.u_frame.p_f, mb ); send_msg_to_l3( linkp, MDL_RELEASE_INDICATION ); stop_t200(linkp); stop_t203(linkp); SET_LINK_STATUS( linkp, LINK_NOT_ESTABLISHED ); break; case _UA: mdl_error_indication( linkp, Q921_ERR_C ); break; case _DM: if( !framep->frm.u_frame.p_f ) { mdl_error_indication( linkp, Q921_ERR_E ); establish_data_link( linkp ); CLEAR_L3_INITED( linkp ); SET_LINK_STATUS( linkp, AWAITING_ESTABLISHMENT ); } else { mdl_error_indication( linkp, Q921_ERR_B ); } break; case _RR: case _RNR: case _REJ: if( _RNR == cmd ) { SET_PEER_RCV_BUSY( linkp ); } else { CLEAR_PEER_RCV_BUSY( linkp ); } if( framep->frm.s_frame.c_r == linkp->peer_cmd ) { if( framep->frm.s_frame.p_f ) { enquiry_response( linkp ); } } else { if( framep->frm.s_frame.p_f ) { mdl_error_indication( linkp, Q921_ERR_A ); } } if( IS_NR_CORRECT( linkp, framep->frm.s_frame.n_r ) ) { confirm_i_frame( linkp, framep->frm.s_frame.n_r ); if( _RR == cmd ) { if( framep->frm.s_frame.n_r == linkp->v_s ) { stop_t200( linkp ); start_t203( linkp ); } else if( framep->frm.s_frame.n_r != linkp->v_a ) { start_t200( linkp ); } } else if( _RNR == cmd ) { stop_t203(linkp); start_t200(linkp); } else { invoke_retransmission( linkp ); stop_t200( linkp ); start_t203( linkp ); } } else { #ifdef LCM_DEBUG aos_printf( MPE_LCM, "q921<-:on_multi_frame_estblished,unexpected rr nr=%d between va=%d and vs=%d " "at phy=%s portno=%d, dl=%s", framep->frm.s_frame.n_r, linkp->v_a, linkp->v_s, PHY_STRING(linkp->phy_type), linkp->phy_port_no, DL_STRING(linkp->link_type) ); #endif n_r_error_recovery( linkp ); SET_LINK_STATUS( linkp, AWAITING_ESTABLISHMENT ); } break; case _FRMR: mdl_error_indication( linkp, Q921_ERR_K ); establish_data_link( linkp ); CLEAR_L3_INITED(linkp); SET_LINK_STATUS( linkp, AWAITING_ESTABLISHMENT ); break; case _I_COMMAND: q921_i_frame_handle( linkp, mb ); break; default: break; } }VOID on_timer_recovery( L2_LINK_S *linkp, U32 cmd, struct msg_blk *mb ){ Q921_FRAME_S *framep; AOS_ASSERT( NULL != linkp && NULL != mb ); AOS_ASSERT( TIMER_RECOVERY == linkp->status ); framep = (Q921_FRAME_S*)mb->data; switch( cmd ) { case _SABME: send_u_frame( linkp, linkp->own_resp, _UA, framep->frm.u_frame.p_f, mb ); CLEAR_EXCEPTION_COND(linkp); mdl_error_indication( linkp, Q921_ERR_F ); if( linkp->v_s != linkp->v_a ) { discard_i_que(linkp); send_msg_to_l3( linkp, MDL_ESTABLISH_INDICATION ); } stop_t200(linkp); start_t203(linkp); linkp->v_s = 0; linkp->v_a = 0; linkp->v_r = 0; SET_LINK_STATUS( linkp, MULTIPLE_FRAME_ESTABLISHED ); break; case _DISC: discard_i_que(linkp); send_u_frame( linkp, linkp->own_resp, _UA, framep->frm.u_frame.p_f, mb ); send_msg_to_l3( linkp, MDL_RELEASE_INDICATION ); stop_t200(linkp); SET_LINK_STATUS( linkp, LINK_NOT_ESTABLISHED ); break; case _UA: mdl_error_indication( linkp, Q921_ERR_C ); break; case _DM: if( !framep->frm.u_frame.p_f ) { mdl_error_indication( linkp, Q921_ERR_E ); } else { mdl_error_indication( linkp, Q921_ERR_B ); } establish_data_link( linkp ); CLEAR_L3_INITED( linkp ); SET_LINK_STATUS( linkp, AWAITING_ESTABLISHMENT ); break; case _RR: case _REJ: case _RNR: if( _RNR == cmd ) { SET_PEER_RCV_BUSY(linkp); } else { CLEAR_PEER_RCV_BUSY(linkp); } if( framep->frm.s_frame.c_r == linkp->peer_cmd ) { if( framep->frm.s_frame.p_f ) { enquiry_response( linkp ); }change_va: if( IS_NR_CORRECT(linkp, framep->frm.s_frame.n_r ) ) { confirm_i_frame( linkp, framep->frm.s_frame.n_r ); } else { #ifdef LCM_DEBUG aos_printf( MPE_LCM, "q921<-:on_timer_recovery,unexpected s frame nr=%d between va=%d and vs=%d " "at phy=%s portno=%d, dl=%s", framep->frm.s_frame.n_r, linkp->v_a, linkp->v_s, PHY_STRING(linkp->phy_type), linkp->phy_port_no, DL_STRING(linkp->link_type) ); #endif n_r_error_recovery(linkp); SET_LINK_STATUS(linkp, AWAITING_ESTABLISHMENT); } break; } else if( !framep->frm.s_frame.p_f ) { goto change_va; } else { if( IS_NR_CORRECT(linkp, framep->frm.s_frame.n_r ) ) { confirm_i_frame( linkp, framep->frm.s_frame.n_r ); invoke_retransmission( linkp ); stop_t200( linkp ); start_t203( linkp ); SET_LINK_STATUS( linkp, MULTIPLE_FRAME_ESTABLISHED ); } else { #ifdef LCM_DEBUG aos_printf( MPE_LCM, "q921<-:on_timer_recovery,unexpected s resp nr=%d between va=%d and vs=%d " "at phy=%s portno=%d, dl=%s", framep->frm.s_frame.n_r, linkp->v_a, linkp->v_s, PHY_STRING(linkp->phy_type), linkp->phy_port_no, DL_STRING(linkp->link_type) ); #endif n_r_error_recovery(linkp); SET_LINK_STATUS(linkp, AWAITING_ESTABLISHMENT); } } break; case _FRMR: mdl_error_indication( linkp, Q921_ERR_K ); establish_data_link(linkp); CLEAR_L3_INITED(linkp); SET_LINK_STATUS(linkp, AWAITING_ESTABLISHMENT); break; case _I_COMMAND: q921_i_frame_handle( linkp, mb ); break; default: break; } }VOID q921_i_frame_handle( L2_LINK_S *linkp, struct msg_blk *mb ){ Q921_FRAME_S *framep; U8 tmp_nr, tmp_pf; AOS_ASSERT( NULL != linkp && NULL != mb ); framep = (Q921_FRAME_S*)mb->data; tmp_nr = framep->frm.i_frame.n_r; if( linkp->own_rcv_busy ) { if( framep->frm.i_frame.p_f ) { send_s_frame( linkp, linkp->own_resp, _RNR, F_1 ); CLEAR_ACK_PENDING(linkp); } } else if( framep->frm.i_frame.n_s == linkp->v_r ) { tmp_pf = framep->frm.i_frame.p_f; linkp->v_r++; linkp->v_r &= MOD_MASK; CLEAR_REJ_EXCEPTION(linkp); send_data_to_l3( linkp, mb ); if( tmp_pf ) { send_s_frame( linkp, linkp->own_resp, _RR, tmp_pf ); CLEAR_ACK_PENDING(linkp); } else { if( !linkp->ack_pending ) { send_msg_to_self( linkp, ACK_PENDING ); SET_ACK_PENDING(linkp); } } } else { if( linkp->rej_exception ) { if( framep->frm.i_frame.p_f ) { send_s_frame( linkp, linkp->own_resp, _RR, framep->frm.i_frame.p_f ); CLEAR_ACK_PENDING(linkp); } } else { SET_REJ_EXCEPTION(linkp); send_s_frame( linkp, linkp->own_resp, _REJ, framep->frm.i_frame.p_f ); } } if( IS_NR_CORRECT( linkp, tmp_nr ) ) { confirm_i_frame( linkp, tmp_nr ); if( (!linkp->peer_rcv_busy) && (MULTIPLE_FRAME_ESTABLISHED == linkp->status) ) { if( tmp_nr == linkp->v_s ) { stop_t200(linkp); start_t203(linkp); } else if( tmp_nr != linkp->v_a ) { start_t200(linkp); } } } else { #ifdef LCM_DEBUG aos_printf( MPE_LCM, "q921<-:q921_i_frame_handle,unexpected i cmd nr=%d between va=%d and vs=%d " "at phy=%s portno=%d, dl=%s", tmp_nr, linkp->v_a, linkp->v_s, PHY_STRING(linkp->phy_type), linkp->phy_port_no, DL_STRING(linkp->link_type) ); #endif n_r_error_recovery(linkp); SET_LINK_STATUS(linkp, AWAITING_ESTABLISHMENT); } }VOID q921_mngt_handle( U32 srcMpe, DL_MSG_S*pL3L2Prim ){ L2_LINK_S *linkp; if( (MPE_V5MNGT == srcMpe) || (MPE_V5PSTN == srcMpe) || (MPE_V5CTRL == srcMpe) || (MPE_V5BCC == srcMpe) || (MPE_V5LINKC == srcMpe) || (MPE_V5PROT == srcMpe) || (MPE_Q931 == srcMpe) ) { if( NULL == m_links[LCM_DRV_HDLC] ) { aos_printf( MPE_LCM, "q921:hdlc driver is null" ); return; } pL3L2Prim->ucPhyType = LCM_DRV_HDLC; linkp = lcm_get_link_cb( pL3L2Prim->ucPhyType, pL3L2Prim->ucV5DLType,pL3L2Prim->usCommPort ); if( NULL == linkp ) { return; } if( MDL_ESTABLISH_REQUEST == pL3L2Prim->ucPrimID ) { if( MPE_Q931 != srcMpe ) { FILL_EF_ADDR( linkp->ef_addr, LINK_EF_ADDR(linkp->link_type) );#if( CONDIF_BIG_ENDIAN == TRUE ) linkp->sapi = (linkp->ef_addr&0xfc00)>>10; linkp->tei = (linkp->ef_addr&0xfe)>>1;#else linkp->sapi = (linkp->ef_addr&0xfc)>>2; linkp->tei = (linkp->ef_addr&0xfe00)>>9;#endif linkp->is_for_dss1 = 0; } else { linkp->ef_addr = 0; linkp->sapi = SAPI_0; linkp->tei = g_ucPriTei; linkp->is_for_dss1 = 1; } } } else if( MPE_DEV == srcMpe ) { pL3L2Prim->ucV5DLType = V5DL_ID_DEV_MNGT; linkp = lcm_get_link_cb( pL3L2Prim->ucPhyType, pL3L2Prim->ucV5DLType,pL3L2Prim->usCommPort ); if( NULL == linkp ) { return; }#if( CONFIG_BOARD_EIA == TRUE ) if( LCM_DRV_UDP4EIA == linkp->phy_type ) { linkp->phy_port_no = pL3L2Prim->usCommPort; }#endif } else if ( MPE_FAXD == srcMpe ) { pL3L2Prim->ucV5DLType = V5DL_ID_DEV_MNGT; linkp = lcm_get_link_cb( pL3L2Prim->ucPhyType, pL3L2Prim->ucV5DLType,pL3L2Prim->usCommPort ); if( NULL == linkp ) { return; } } else { aos_printf( MPE_LCM, "Unknown src mpe=%d", srcMpe ); return; } if(LCM_PRINT_MNGT(linkp) && (DL_DATA_REQUEST!=pL3L2Prim->ucPrimID)) { aos_printf( MPE_LCM, "q921:dl mngt handle,prim=%s phy=%s,portno=%d, dl=%s status=%s", PRIM_STRING(pL3L2Prim->ucPrimID), PHY_STRING(pL3L2Prim->ucPhyType), pL3L2Prim->usCommPort, DL_STRING(pL3L2Prim->ucV5DLType), STATUS_STRING(linkp->status) ); } switch( pL3L2Prim->ucPrimID ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -