⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcm_q921.c

📁 abstract rtos
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 + -