📄 lcm_q921.c
字号:
send_msg_to_l3( linkp, MDL_RELEASE_CONFIRM ); stop_t200(linkp); SET_LINK_STATUS( linkp, LINK_NOT_ESTABLISHED ); } else { send_u_frame_2( linkp, linkp->own_cmd, _DISC, P_1 ); start_t200( linkp ); SET_LINK_STATUS( linkp, AWAITING_RELEASE ); } break; default: AOS_ASSERT( 0 ); break; }}VOID establish_data_link( L2_LINK_S *linkp ){ AOS_ASSERT( NULL != linkp ); CLEAR_EXCEPTION_COND(linkp); linkp->rc = 0; send_u_frame_2( linkp, linkp->own_cmd, _SABME, P_1 ); start_t200(linkp); stop_t203(linkp);}AOS_INLINE VOID start_t200( L2_LINK_S *linkp ){ AOS_ASSERT( NULL != linkp ); aos_timer_start( &linkp->t200, MPE_LCM, linkp->t200_len, Q921_T200, (U32)linkp, AOS_TIMER_NO_LOOP );}AOS_INLINE VOID start_t203( L2_LINK_S *linkp ){ AOS_ASSERT( NULL != linkp ); aos_timer_start( &linkp->t203, MPE_LCM, linkp->t203_len, Q921_T203, (U32)linkp, AOS_TIMER_NO_LOOP );}AOS_INLINE VOID stop_t200( L2_LINK_S *linkp ){ AOS_ASSERT( NULL != linkp ); aos_timer_stop( &linkp->t200 );}AOS_INLINE VOID stop_t203( L2_LINK_S *linkp ){ AOS_ASSERT( NULL != linkp ); aos_timer_stop( &linkp->t203 );}AOS_INLINE U32 able_to_establish( L2_LINK_S *linkp ){ AOS_ASSERT( NULL != linkp ); if( LCM_DRV_HDLC == linkp->phy_type ) {#if( CONFIG_BOARD_GMPU == TRUE ) if( !linkp->is_for_dss1 &&FALSE == v5_is_dl_allow_establish( (U16)linkp->phy_port_no, linkp->link_type ) ) { return FALSE; }#endif } else if( LCM_DRV_ETH == linkp->phy_type || LCM_DRV_UDP4EIA == linkp->phy_type ) { U32 proc_id = LOCAL_PROCESSOR_ID; if( (TRUE == dev_card_is_mpu( proc_id )) &&(FALSE == dev_mpu_card_is_master() ) &&(FALSE == dev_card_is_mpu( linkp->phy_port_no )) ) { return FALSE; } } return TRUE;}VOID transmit_enquiry( L2_LINK_S *linkp ){ AOS_ASSERT( NULL != linkp ); if( linkp->own_rcv_busy ) { send_s_frame( linkp, linkp->own_cmd, _RNR, P_1 ); } else { send_s_frame( linkp, linkp->own_cmd, _RR, P_1 ); } CLEAR_ACK_PENDING(linkp); start_t200(linkp);}VOID enquiry_response( L2_LINK_S *linkp ){ AOS_ASSERT( NULL != linkp ); if( linkp->own_rcv_busy ) { send_s_frame( linkp, linkp->own_resp, _RNR, F_1 ); } else { send_s_frame( linkp, linkp->own_resp, _RR, F_1 ); } CLEAR_ACK_PENDING(linkp);}VOID n_r_error_recovery( L2_LINK_S *linkp ){ #ifdef LCM_DEBUG aos_printf( MPE_LCM, "q921<-:n_r_error_recovery" "at phy=%s portno=%d, dl=%s", PHY_STRING(linkp->phy_type), linkp->phy_port_no, DL_STRING(linkp->link_type) ); #endif mdl_error_indication( linkp, Q921_ERR_J ); establish_data_link( linkp ); CLEAR_L3_INITED( linkp );}VOID mdl_error_indication( L2_LINK_S *linkp, U32 errCode ){ S8 errString[33]={0,}; AOS_ASSERT_FUNC( NULL != linkp, return ); if( LCM_PRINT_ERROR_IND(linkp) ) { error_string( errCode, errString ); aos_printf( MPE_LCM, "q921<-:mdl_error_indication" "at phy=%s portno=%d, dl=%s, status=%s, errCode=0x%x,errString=%s", PHY_STRING(linkp->phy_type), linkp->phy_port_no, DL_STRING(linkp->link_type), STATUS_STRING(linkp->status), errCode, errString ); } linkp->error_code |= errCode;}VOID invoke_retransmission( L2_LINK_S *linkp ){ if( linkp->v_s != linkp->v_a ) { mdl_error_indication( linkp, Q921_ERR_P ); linkp->v_s = linkp->v_a; }}VOID put_in_i_que( L2_LINK_S *linkp, struct msg_blk *mb ){ AOS_ASSERT( NULL != linkp && NULL != mb ); if( LCM_PRINT_L3_MSG(linkp) ) { aos_printf( MPE_LCM,"put_in_i_que at phy=%s portno=%d, dl=%s, status=%s", PHY_STRING(linkp->phy_type), linkp->phy_port_no, DL_STRING(linkp->link_type), STATUS_STRING(linkp->status) ); } if( LCM_DRV_UDP4EIA == linkp->phy_type || LCM_DRV_UDP4SIPTRUNK == linkp->phy_type ) { if( linkp->i_frame_q.qlen >= CONFIG_LCM_QUEUE_LEN ) { if( NULL != mb ) { aos_dmem_free( (VOID*)mb->head ); msg_free(mb); } linkp->discard_pkt++; return; } } msg_que_tail( &linkp->i_frame_q, mb ); send_i_frame(linkp); }VOID discard_i_que( L2_LINK_S *linkp ){ struct msg_blk *mb; AOS_ASSERT( NULL != linkp ); #ifdef LCM_DEBUG aos_printf( MPE_LCM,"discard_i_que" ); #endif while( NULL != (mb=msg_deque(&linkp->i_frame_q) ) ) { aos_dmem_free( (VOID*)mb->head ); msg_free(mb); linkp->discard_pkt++; }}VOID confirm_i_frame( L2_LINK_S *linkp, U8 n_r ){ struct msg_blk *mb; AOS_ASSERT( NULL != linkp ); while( linkp->v_a != n_r ) { mb = msg_deque( &linkp->i_frame_q ); if( NULL == mb ) { aos_printf( MPE_LCM, "q921:confirm_i_frame:get null pointer frome i " "frame queue,phy=%s,portno=%d,dl=%s", PHY_STRING(linkp->phy_type), linkp->phy_port_no, DL_STRING(linkp->link_type) ); break; } aos_dmem_free( (VOID*)mb->head ); msg_free(mb); linkp->v_a++; linkp->v_a &= MOD_MASK; }}U32 get_cmd( struct msg_blk *mb, L2_LINK_S *linkp ){ Q921_FRAME_S *framep; EF_ADDR_S temp_ef; U32 cmd; U8 peer_rsp; AOS_ASSERT( NULL != mb && NULL != linkp ); framep = (Q921_FRAME_S *)mb->data; if( framep->frm.u_frame.ea_0) { return _ERR_EA0; } if( !framep->frm.u_frame.ea_1 ) { return _ERR_EA1; } if( !linkp->is_for_dss1 ) { temp_ef.ef = framep->ef_addr; if( temp_ef.s.ea_0 &1 ) { return _ERR_EA1; } if( !temp_ef.s.ea_1 ) { return _ERR_EA0; } if( temp_ef.s.zero ) { return _ERR_EF_ZERO; } } if( IS_I_FRAME( framep ) ) { if( mb->len < I_FRAME_LEN ) { return _ERR_FRAME; } if( mb->len > (linkp->n201+I_FRAME_LEN) ) { return _ERR_FRAME_TOO_LONG; } if( framep->frm.u_frame.c_r != linkp->peer_cmd ) { return _ERR_C_R; } return _I_COMMAND; } else if( IS_U_FRAME( framep ) ) { cmd = framep->frm.info[2] & 0xef; peer_rsp = (linkp->peer_cmd == NET_CMD ? NET_ACK : USER_ACK); if( ((_SABME == cmd || _UI == cmd || _DISC == cmd)&&(framep->frm.u_frame.c_r != linkp->peer_cmd) ) ||((_DM == cmd || _UA == cmd || _FRMR == cmd )&&(framep->frm.u_frame.c_r != peer_rsp) ) ) { return _ERR_C_R; } if( _UI != cmd ) { if( mb->len != U_FRAME_LEN ) { return _ERR_FRAME; } if( _SABME == cmd || _DM == cmd || _DISC == cmd || _UA == cmd || _FRMR == cmd || _XID == cmd ) { return cmd; } } else { if( mb->len < U_FRAME_LEN ) { return _ERR_FRAME; } if( mb->len > (linkp->n201+I_FRAME_LEN) ) { return _ERR_FRAME_TOO_LONG; } return _UI; } } else if( IS_S_FRAME( framep ) ) { cmd = framep->frm.info[2] & 0xef; if( mb->len != S_FRAME_LEN ) { return _ERR_FRAME; } if( _RR == cmd || _RNR == cmd || _REJ == cmd ) { return cmd; } } return _ERR_UNKNOWN_FRAME;}S8 *cmd_string( U32 cmd ){ S8 *s; switch( cmd ) { case _I_COMMAND: s = "i comand"; break; case _UI: s = "ui"; break; case _SABME: s = "sabme"; break; case _DISC: s = "disc"; break; case _UA: s = "ua"; break; case _DM: s = "dm"; break; case _RR: s = "rr"; break; case _RNR: s = "rnr"; break; case _REJ: s = "rej"; break; case _FRMR: s = "frmr"; break; case _XID: s = "xid"; break; case _ERR_FRAME: s = "err frame"; break; case _ERR_EA0: s = "err ea0"; break; case _ERR_EA1: s = "err ea1"; break; case _ERR_EF_ZERO: s = "err ef zero field"; break; case _ERR_FRAME_TOO_LONG: s = "frame too long"; break; default : s = "err cmd"; break; } return s;}AOS_INLINE U8 get_link_type( U32 tei ){ U8 result; switch( tei ) { case PSTN_TEI: result = V5DL_ID_PSTN; break; case CTRL_TEI: result = V5DL_ID_CTRL; break; case BCC_TEI: result = V5DL_ID_BCC; break; case PROT_TEI: result = V5DL_ID_PROT1; break; case LCTRL_TEI: result = V5DL_ID_LINKC; break; case DEV_TEI: result = 0; break; default: result = V5DL_ID_BUTT; break; } return result;}U16 lcm_get_dev_ef_addr( ){ U16 ef_addr; FILL_EF_ADDR( ef_addr, LINK_EF_ADDR(V5DL_ID_DEV_MNGT) ); return ef_addr;}VOID error_string( U32 errCode, S8 *string ){ S8 ch='A'; U32 i=0,j=0; while(i<('P'-'A'+1)) { if( errCode & 1 ) { string[j+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -