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

📄 lcm_drv.c

📁 abstract rtos
💻 C
📖 第 1 页 / 共 4 页
字号:
            aos_printf( MPE_LCM, "q921<-:lcm_recv_phy_data,trans v5 msg to an,slot=%s,hdlc=%d",                        dev_get_local_slot(), port_no );            #endif            linkp_2 = &m_links[LCM_DRV_ETH][active_mpu_id-processor_id_base];                        ui_framep = (LCM_UI_FRAME_S*)msg_push( mb, ELEMENT_OFFSET( LCM_UI_FRAME_S, info ) );            ui_framep->srcProcessorId = LOCAL_PROCESSOR_ID;            ui_framep->srcMpe = MPE_LCM;            ui_framep->dstProcessorId = active_mpu_id;            ui_framep->dstMpe = MPE_LCM;            ui_framep->ulSize = mb->len-L3_MSG_HEAD_LEN;            ui_framep->type    = TRANS_V5_MSG_TO_AN;            ui_framep->slot    = dev_get_local_slot();            ui_framep->hdlc_no = (U8)port_no;            q921_unit_data_request( linkp_2, mb );            return;        }        {                        U8 slot;            U16 commport;            slot = dev_get_local_slot();            dev_get_commport_by_slot_hdlc( slot, (U8)port_no, &commport );            port_no = commport;        }#endif    }        else    {        U16 *ef_addrp;	    if( LCM_DRV_ETH == phy_type )	    {	        U32 processor_id,len;	        U8 slot = (U8)(port_no & 0xff), subc = (U8)( (port_no&0xff00)>>8 );	        if( FALSE == dev_get_processorid_by_slot_subc( slot, subc, &processor_id ) )	        {	            goto lcm_recv_err_ret;	        }	        port_no = processor_id - processor_id_base;	        	        len = AOS_NTOHS(*(U16*)mb->data);	        AOS_ASSERT_FUNC( mb->len >= len, goto lcm_recv_err_ret );	        mb->len = len;	        msg_pull( mb, sizeof(U16) );	    }#if( CONFIG_BOARD_EIA == TRUE )	    else if ( LCM_DRV_UDP4EIA == phy_type )	    {	        port_no = 0;	    }#endif                ef_addrp = (U16*)msg_push( mb, sizeof(U16) );        *ef_addrp = dev_dl_ef_addr;    }    if( phy_type >= LCM_DRV_BUTT ||        port_no >= phy_port_num[phy_type] )    {        goto lcm_recv_err_ret;    }        pU32 = (U32*)msg_push( mb, 2*sizeof(U32) );    *pU32 = phy_type;    pU32++;    *pU32 = port_no;        msg_que_tail( &lcm_phy_que, mb );    aos_event_post( lcm_rcv_task_id, MSG_SYNC_EVENT );    return;lcm_recv_err_ret:    if( NULL != mb )    {        aos_dmem_free( (VOID*)mb->head );        msg_free( mb );    }}VOID lcm_recv_task(){    U32 event;    struct msg_blk *mb;    for(;;)    {        aos_event_wait( MSG_SYNC_EVENT, AOS_WAIT_ANY, 0, &event );        while( NULL != (mb=msg_deque( &lcm_phy_que )) )        {            U32 *pU32;                        pU32 = (U32*)mb->data;            msg_pull( mb, 2*sizeof(U32) );            if( LCM_DRV_HDLC == *pU32 )            {                                LCM_TRACE_L2_MSG( mb, *(pU32+1), TRACE_DIRECTION_DOWN );            }            SYS_HANDLE_LOCK();            q921_phy_data_ind( *pU32, *(pU32+1), mb );            SYS_HANDLE_UNLOCK();                        aos_task_yield_time();            aos_dmem_free( (VOID*)mb->head );            msg_free( mb );        }    }}U32 lcm_add_drv( U32 phy_type, U32 mtu, LCM_PHY_SND send_func, LCM_PHY_RCV *recvp ){    if( phy_type >= LCM_DRV_BUTT )    {        return AOS_FAIL;    }    if( NULL == send )    {        return AOS_FAIL;    }    if( mtu < I_FRAME_LEN )    {        return AOS_FAIL;    }    if( NULL == recvp )    {        return AOS_FAIL;    }    lcm_phy_drv[phy_type].is_use_mbuf = FALSE;    lcm_phy_drv[phy_type].tx.mb_send = send_func;    lcm_phy_drv[phy_type].mtu  = mtu;    *recvp = lcm_recv_phy_data;    return AOS_SUCC;}U32 lcm_add_drv_2( U32 phy_type, U32 mtu, LCM_MBUF_SND send_func, LCM_MBUF_RCV *recvp ){    if( phy_type >= LCM_DRV_BUTT )    {        return AOS_FAIL;    }    if( NULL == send )    {        return AOS_FAIL;    }    if( mtu < I_FRAME_LEN )    {        return AOS_FAIL;    }    if( NULL == recvp )    {        return AOS_FAIL;    }    lcm_phy_drv[phy_type].is_use_mbuf = TRUE;    lcm_phy_drv[phy_type].tx.mbuf_send = send_func;    lcm_phy_drv[phy_type].mtu  = mtu;    *recvp = lcm_recv_phy_data_with_mbuf;    return AOS_SUCC;}U32 lcm_set_link_paras( U32 phy_type, U32 n200, U32 t200_len, U32 t203_len ){    if( phy_type >= LCM_DRV_BUTT )    {        return AOS_FAIL;    }    lcm_phy_drv[phy_type].n200 = n200;    lcm_phy_drv[phy_type].t200_len = t200_len;    lcm_phy_drv[phy_type].t203_len = t203_len;    return AOS_SUCC;}VOID lcm_recv_phy_data_with_mbuf( U32 phy_type, U32 port_no, MBUF_S* mbuf ){    struct msg_blk *newmb;    if( NULL == mbuf )    {        return;    }    if( NULL != mbuf->pstNextMBuf || 1 != mbuf->ulDataBlockNumber )    {        mbuf_destroy(mbuf);        return;    }    newmb = msg_alloc();    if( NULL == newmb )    {        mbuf_destroy(mbuf);        return;    }    newmb->head    = mbuf->stDataBlockDescriptor.pucDataBlock;    newmb->truelen = mbuf->stDataBlockDescriptor.ulDataBlockLength;    newmb->end     = newmb->head + newmb->truelen;    newmb->data = mbuf->stDataBlockDescriptor.pucData;    newmb->len  = mbuf->stDataBlockDescriptor.ulDataLength;    newmb->tail = newmb->data + newmb->len;        aos_dmem_free( (VOID*)mbuf );    lcm_recv_phy_data( phy_type, port_no, newmb );}U32 lcm_is_rapid_pkt( MBUF_S* pMBuf ){    IP_S            *ip;    UDPHDR_S        *udp;    TCPHDR_S        *tcp;	U16				dst_port;    U32             dstip;	ip = MBUF_MTOD(pMBuf, IP_S*);    aos_memcpy((U8*) &dstip, (U8*)&(ip->ip_stDst.s_ulAddr),4);    if( dstip != AOS_HTONL(0x7F000001)     && dstip != if_get_out_ip_by_ifindex( MBUF_GET_RECEIVE_IFNET_INDEX(pMBuf) )     && AOS_HTONL(0x7F000001) != if_get_out_ip_by_ifindex( MBUF_GET_RECEIVE_IFNET_INDEX(pMBuf) ) )    {         return FALSE;    }	if (ip->ip_chHLen < 5)	{				return FALSE;	}        if( AOS_NTOHS(ip->ip_usOff) &(~IP_DF) )    {        return FALSE;    }    if( LCM_IS_UDP_PKT(ip) )    {    	udp = (UDPHDR_S*)((U8*)ip + ip->ip_chHLen * 4);    	dst_port = AOS_NTOHS(udp->uh_usDPort);    }    else if( LCM_IS_TCP_PKT(ip) )    {    	tcp = (TCPHDR_S*)((U8*)ip + ip->ip_chHLen * 4);        dst_port = AOS_NTOHS(tcp->usDstPort);    }    else    {        return FALSE;    }    if( IS_MGCP_STACK_UDPPORT(dst_port) )    {		MBUF_ASSIGN_RECEIVE_IFNET_INDEX(pMBuf, MPE_MGCP_STACK );        return TRUE;    }#if (AOS_INCLUDE_SERVICE_ROUTE_SRV_SERVER == TRUE || AOS_INCLUDE_SERVICE_ROUTE_SRV_CLIENT == TRUE)    else if( LCM_IS_UDP_PKT(ip) && IS_RS_UDPPORT(dst_port) )    {		MBUF_ASSIGN_RECEIVE_IFNET_INDEX(pMBuf, MPE_RS );        return TRUE;    }#endif    else if( IS_LCM_UDPPORT(dst_port) )	{  		MBUF_ASSIGN_RECEIVE_IFNET_INDEX(pMBuf, MPE_EDRV);		return TRUE;	}	else if(IS_SIP_UDPPORT(dst_port))	{		MBUF_ASSIGN_RECEIVE_IFNET_INDEX(pMBuf, MPE_SIP);		return TRUE;	}    else if( IS_APING_UDPPORT(dst_port) )    {        MBUF_ASSIGN_RECEIVE_IFNET_INDEX(pMBuf, MPE_APING);        return TRUE;    }    else if (LCM_IS_UDP_PKT(ip) && IS_RC_PORT(dst_port))    {        MBUF_ASSIGN_RECEIVE_IFNET_INDEX(pMBuf, MPE_SST);        return TRUE;    }	return FALSE;}VOID lcm_init_rapid_pkt_list( ){    U32 s;    s = aos_int_lock();    MBUF_QUE_INIT( &lcm_rapid_pkt_list, LCM_RAPID_PKT_LIST_SIZE );    aos_int_unlock(s);}U32 lcm_rapid_recv_from_eth( MBUF_S* pstMBuf ){    U32         s;    MPE         dstMpe;    IP_S        *ip;    UDPHDR_S    *udp = NULL;    TCPHDR_S    *tcp = NULL;    U16         src_port,payload_len;    U8          *payload;#if( CONFIG_BOARD_GMPU == TRUE )	U32          src_ip;#endif    if( FALSE == m_ulMsgEnable )    {        mbuf_destroy(pstMBuf);        return AOS_SUCC;    }    dstMpe = (U16)MBUF_GET_RECEIVE_IFNET_INDEX(pstMBuf);#if( CONFIG_BOARD_GMPU == TRUE )    if( FALSE == g_blIsDbMaster )    {        if( MPE_MGCP_STACK == dstMpe || MPE_SIP == dstMpe ||            MPE_EDRV == dstMpe )        {            mbuf_destroy(pstMBuf);            return AOS_SUCC;        }    }#endif    ip = MBUF_MTOD(pstMBuf, IP_S*);    if( LCM_IS_UDP_PKT(ip) )    {    	udp = (UDPHDR_S*)((U8*)ip + ip->ip_chHLen * 4);         src_port = AOS_NTOHS(udp->uh_usSPort);        payload = (U8*)(udp+1);        payload_len = (U16)(AOS_NTOHS(udp->uh_sULen) - sizeof(UDPHDR_S));    }    else    {#if( CONFIG_BOARD_GMPU == TRUE )        if( g_lcm_tcp_signal_disable )        {            mbuf_destroy(pstMBuf);            return AOS_SUCC;        }#endif        tcp = (TCPHDR_S*)((U8*)ip + ip->ip_chHLen * 4);         payload_len = AOS_NTOHS(ip->ip_usLen) - ip->ip_chHLen * 4 - tcp->ucOffset * 4;        if( 0 == payload_len )        {            goto rapid_enque;        }        src_port = AOS_NTOHS(tcp->usSrcPort);        payload = (U8*)((U8*)tcp + tcp->ucOffset* 4);    }    switch(dstMpe)    {#if( CONFIG_BOARD_GMPU == TRUE )                case MPE_EDRV:                        if(payload_len > 10)            {                U8 *ptr;                if( LCM_IS_UDP_PKT(ip) )                {                    ptr = (U8*)(udp + 1);                }                else                {                    ptr = (U8*)(tcp + 1);                }                if( lcm_is_keepalive_frame(ptr) )                {                    aos_memcpy( &src_ip, &ip->ip_stSrc.s_ulAddr, 4 );                    edrv_keepalive_handle( payload, src_ip, src_port );                    mbuf_destroy(pstMBuf);                    return AOS_SUCC;                }            }			break;#endif        default:            break;    }rapid_enque:    #if CONFIG_BOARD_EIA == TRUE        if(FALSE == rtp_check_packet_valid(ip))        {            S8 buf[121], *str;            U8 *addr;            for(str = buf, addr = (U8*)ip; str < &buf[120]; str+=3, addr++)            {                aos_sprintf(str,"%02X ",*addr);            }            ssp_assert( buf, "lcm_drv.c", __LINE__ );            mbuf_destroy(pstMBuf);            return AOS_SUCC;        }    #endif    s = aos_int_lock();  	if(!MBUF_QUE_IS_FULL(&lcm_rapid_pkt_list))  	{        MBUF_QUE_ENQUEUE( &lcm_rapid_pkt_list,pstMBuf );  	}    else    {        mbuf_destroy(pstMBuf);    }    aos_int_unlock(s);    return AOS_SUCC;}VOID lcm_rapid_eth_recv_task(){    MBUF_S          *pstMBuf;    IP_S            *ip;    UDPHDR_S        *udp;    TCPHDR_S        *tcp;    MPE              dstMpe;    SOCKADDRIN_S     addr;    struct msg_blk  *mb;    L3_MSG_HEAD_S   *pL3Msg;    U32              s, count, tcpflag = 0;    U32              tcpSeq, tcpAck, *pU32;    for( count = LCM_RAPID_PKT_LIST_SIZE; count > 0; count-- )    {        s = aos_int_lock();        MBUF_QUE_DEQUEUE( &lcm_rapid_pkt_list,pstMBuf );        aos_int_unlock(s);        if( NULL == pstMBuf )        {            break;        }#if( CONFIG_BOARD_GDSP == TRUE )        mbuf_destroy(pstMBuf);#else    	dstMpe = (U16)MBUF_GET_RECEIVE_IFNET_INDEX(pstMBuf);        mb = msg_alloc();        if( NULL == mb )        {            mbuf_destroy(pstMBuf);            break;        }    	dstMpe = (U16)MBUF_GET_RECEIVE_IFNET_INDEX(pstMBuf);    	ip = MBUF_MTOD(pstMBuf, IP_S*);        addr.sin_chLen    = sizeof(SOCKADDRIN_S);        addr.sin_chFamily = AF_INET;        aos_memcpy((U8*) &(addr.sin_stAddr.s_ulAddr),  (U8*)&(ip->ip_stSrc.s_ulAddr), 4);        *(U32*)(&addr.sin_chZero_a)    = 0;        *(U32*)(&addr.sin_chZero_a[4]) = 0;        mb->head    = pstMBuf->stDataBlockDescriptor.pucDataBlock;        mb->truelen = pstMBuf->stDataBlockDescriptor.ulDataBlockLength;        mb->end     = mb->head + mb->truelen;        if( LCM_IS_UDP_PKT(ip) )        {            tcpflag = 0;        	udp = (UDPHDR_S*)((U8*)ip + ip->ip_chHLen * 4);             mb->data = (U8*)udp + sizeof(UDPHDR_S);            mb->len  = (U32)(AOS_NTOHS(udp->uh_sULen) - sizeof(UDPHDR_S));            tcpSeq   = 0;            tcpAck   = 0;            addr.sin_usPort   = udp->uh_usSPort;        }        else        {            tcp = (TCPHDR_S*)((U8*)ip + ip->ip_chHLen * 4);             mb->data = (U8*)tcp + tcp->ucOffset* 4;            mb->len  = AOS_NTOHS(ip->ip_usLen) - ip->ip_chHLen * 4 - tcp->ucOffset * 4;            aos_memcpy( &tcpSeq, &tcp->seqSeqNumber, sizeof(U32) );            aos_memcpy( &tcpAck, &tcp->seqAckNumber, sizeof(U32) );            tcpSeq = AOS_NTOHL(tcpSeq);            tcpAck = AOS_NTOHL(tcpAck);            addr.sin_usPort   = tcp->usSrcPort;            tcpflag = tcp->ucFlags;            if( !tcpflag )            {                AOS_ASSERT(0);                tcpflag = LCM_TCP_ACK;            }        }        mb->tail = mb->data + mb->len;        msg_align(mb);        if( MPE_MGCP_STACK == dstMpe || MPE_SIP == dstMpe        || MPE_P2P_MNGT == dstMpe || MPE_SST == dstMpe || MPE_RS == dstMpe)        {        	aos_memcpy( msg_push(mb,sizeof(SOCKADDRIN_S)),&addr,sizeof(SOCKADDRIN_S) );            pU32 = (U32*)msg_push(mb,3*sizeof(U32));            if( !tcpflag )            {                aos_memset( (U8*)pU32, 0, 3*sizeof(U32) );            }            else            {                aos_memcpy( pU32++, &tcpflag, sizeof(U32) );                aos_memcpy( pU32++, &tcpSeq, sizeof(U32) );                aos_memcpy( pU32, &tcpAck, sizeof(U32) );            }            pL3Msg = (L3_MSG_HEAD_S*)msg_push( mb, L3_MSG_HEAD_LEN );            pL3Msg->srcProcessorId  = LOCAL_PROCESSOR_ID;            pL3Msg->srcMpe  = dstMpe;            pL3Msg->dstProcessorId  = LOCAL_PROCESSOR_ID;            pL3Msg->dstMpe  = dstMpe;            pL3Msg->ulSize  = mb->len - L3_MSG_HEAD_LEN;    		mb->tail[0] = 0;            MSG_QUE_SEND( dstMpe, mb, MSG_PRIO_NORMAL );        }#if( CONFIG_BOARD_GMPU == TRUE ) || (CONFIG_BOARD_EIA == TRUE )        else if( MPE_APING != dstMpe )        {            if( LCM_TCP_PUSH_ACK == tcpflag || !tcpflag )            {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -