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

📄 lcm_drv.c

📁 abstract rtos
💻 C
📖 第 1 页 / 共 4 页
字号:
#if (AOS_INCLUDE_DEV_CLIENT == TRUE)	if(ht_istunnelmode())	{	    ht_send_msg_rapid(mb, src_port, AOS_NTOHS(addr->sin_usPort));	    return;    }#elif(AOS_INCLUDE_DEV_SERVER == TRUE)	if((addr->sin_stAddr.s_ulAddr == AOS_HTONL(0x7F000001)	|| addr->sin_stAddr.s_ulAddr == if_get_out_ipaddr())	&& ht_istunneludp(AOS_NTOHS(addr->sin_usPort)))	{		ht_send_msg_rapid(mb, src_port						, AOS_NTOHS(addr->sin_usPort));		return;	}#endif    lcm_tcp_rapid_send_to_eth_no_warpper(src_port, seq, ack, mb, v_addr);}U8 g_ucLcmTcpSynOpt[] = {0x02, 0x04, 0x05, 0x28, 0x01, 0x01, 0x04, 0x02};U8 g_ucLcmTcpSynAckOpt[] = {0x02, 0x04, 0x05, 0x28 };extern U32 g_ulRsGateWay[];VOID lcm_send_tcp_signal_by_if( U32 if_index, U32 flag, U16 src_port, U32 seq, U32 ack, VOID *v_addr ){    SOCKADDRIN_S *addr = (SOCKADDRIN_S*)v_addr;    MBUF_S       *mbuf;    TCPIPHDR_S   *tcpip;	IP_S         *ip;    IFNET_S	     *ifp;	ROUTE_S	      route;    U32           srcip, nexthop = 0;    U32           tcpOptLen;    U8            *tcpOpt;    if(0 == addr->sin_stAddr.s_ulAddr    || 0 == AOS_NTOHS(addr->sin_usPort)    || U32_BUTT == addr->sin_stAddr.s_ulAddr    || U16_BUTT == AOS_NTOHS(addr->sin_usPort))    {        return;    }#if(CONFIG_BOARD_GMPU == TRUE)	if((addr->sin_stAddr.s_ulAddr == AOS_HTONL(0x7F000001)	|| addr->sin_stAddr.s_ulAddr == if_get_out_ipaddr()))	{		return;	}#endif    if( LCM_TCP_SYN == flag )    {        tcpOpt    = g_ucLcmTcpSynOpt;        tcpOptLen = sizeof(g_ucLcmTcpSynOpt);    }    else if( LCM_TCP_SYN_ACK == flag )    {        tcpOpt    = g_ucLcmTcpSynAckOpt;        tcpOptLen = sizeof(g_ucLcmTcpSynAckOpt);    }    else    {        tcpOpt    = NULL;        tcpOptLen = 0;    }#if( CONFIG_BOARD_GMPU == TRUE )    if( ( g_ulRsGateWay[0] || g_ulRsGateWay[1] ) && if_index )    {    	ifp = if_get_if_by_index(if_index);    	if (NULL == ifp || NULL == ifp->if_pfOutput)    	{    		AOS_ASSERT(0);            return;    	}    	if (ifp->if_ulPhyType == PHY_LOOP)    	{    		AOS_ASSERT(0);            return;    	}        if( ( addr->sin_stAddr.s_ulAddr & ifp->if_ulIpMask )         == ( ifp->if_ulIpAddr & ifp->if_ulIpMask ) )        {                        nexthop = addr->sin_stAddr.s_ulAddr;        }        else        {            if( ifp->if_ulPortNum <= SERVICE_ETHNET_PORT )            {                nexthop = g_ulRsGateWay[ifp->if_ulPortNum];            }        }    }        if( !nexthop )#endif    {    	((SOCKADDRIN_S *)&(route.ro_stDst))->sin_stAddr.s_ulAddr = addr->sin_stAddr.s_ulAddr;        rt_alloc(&route);        if (NULL == route.ro_pRt)        {    		aos_printf( MPE_LCM, "LCM DRV: No Route to %A", addr->sin_stAddr.s_ulAddr );            return;        }    	ifp = if_get_if_by_index(route.ro_pRt->rt_ulIfIndex);    	if (NULL == ifp || NULL == ifp->if_pfOutput)    	{    		AOS_ASSERT(0);            return;    	}    	if (ifp->if_ulPhyType == PHY_LOOP)    	{    		AOS_ASSERT(0);            return;    	}    	if (RT_FIELD_FLAGS(route.ro_pRt) & RTF_GATEWAY)    	{    		nexthop = RT_FIELD_GATEWAY(route.ro_pRt);    	}        else        {            nexthop = addr->sin_stAddr.s_ulAddr;        }    }	if (NULL == (mbuf = mbuf_create(34, sizeof(TCPIPHDR_S)+tcpOptLen, MBUF_TYPE_DATA, MPE_LCM)))	{		AOS_ASSERT(0);		return ;	}#if( CONFIG_BOARD_EIA == TRUE )    srcip = if_get_out_ipaddr();#else    srcip = ifp->if_ulIpAddr;#endif		tcpip = MBUF_MTOD(mbuf, TCPIPHDR_S *);    aos_memzero(&tcpip->pIHNext, 4);    aos_memzero(&tcpip->pIHPrev, 4);    tcpip->ucIHX1          	= 0;    tcpip->ucIHProtocol     = IPPROTO_TCP;    tcpip->sIHLen          	= (S16)AOS_HTONS((U16)(sizeof(TCPHDR_S)+tcpOptLen));    seq = AOS_HTONL(seq);    aos_memcpy((U8*)&tcpip->seqTHSeq, (U8*)&seq, 4);    ack = AOS_HTONL(ack);    aos_memcpy((U8*)&tcpip->seqTHAck, (U8*)&ack, 4);    tcpip->ucTHX2          	= 0;    tcpip->ucTHOffset     	= 5;    if( tcpOptLen )    {        tcpip->ucTHOffset   += tcpOptLen/4;    }    tcpip->ucTHFlags       	= (U8)flag;    tcpip->usTHWnd        	= (( LCM_TCP_RESET & flag ) ? 0 : AOS_HTONS(0x1000));    tcpip->usTHCheckSum    	= 0;    tcpip->usTHUrgentPoint 	= 0;    tcpip->usTHSrcPort = AOS_HTONS(src_port);	tcpip->usTHDstPort = addr->sin_usPort;     aos_memcpy(&tcpip->ihOverlaidIP.ih_stSrc.s_ulAddr, &srcip, 4);    aos_memcpy(&tcpip->ihOverlaidIP.ih_stDst.s_ulAddr, &addr->sin_stAddr.s_ulAddr, 4);        if( tcpOptLen )    {        aos_memcpy( (U8*)(tcpip+1), tcpOpt, tcpOptLen );    }	tcpip->usTHCheckSum = in_cksum( mbuf, (S32)(sizeof(TCPIPHDR_S)+ tcpOptLen) );    	ip = MBUF_MTOD(mbuf, IP_S*);	ip->ip_chHLen = 5;    ip->ip_chVer  = 4;    ip->ip_usLen  = AOS_HTONS( (U16)(sizeof(TCPIPHDR_S) + tcpOptLen) );    ip->ip_chTTL  = 128;    ip->ip_usId = AOS_HTONS(g_usIpId);    ip->ip_usOff = 0;    ip->ip_usOff |= AOS_HTONS(IP_DF);    ip->ip_usSum  = 0;    ip->ip_usSum = rtp_ip_cksum( (U8*)ip, sizeof(IP_S) );    g_stIpStat.ips_ulLocalOut++;	g_usIpId++;	MBUF_ASSIGN_TAG_NETWORK_TYPE(mbuf, AF_INET);	MBUF_ASSIGN_SEND_IFNET_INDEX(mbuf, ifp->if_ulIfIndex);	MBUF_GET_TAG_NETWORK_IP_PTR(mbuf)->ulNextHopIpAddress = nexthop;	if (ifp->if_pfLLCOutput(mbuf))	{	}}VOID lcm_send_tcp_signal_to_eth( U32 flag, U16 src_port, U32 seq, U32 ack, VOID *v_addr ){    lcm_send_tcp_signal_by_if( 0, flag, src_port, seq, ack, v_addr );}#ifndef TCP_ISSINCR#define TCP_ISSINCR   128000#endifextern TCP_SEQ  g_stSeqTCPISS;              	U32 lcm_get_tcp_iss(){    U32 seq = g_stSeqTCPISS;    g_stSeqTCPISS += TCP_ISSINCR / 2;    return seq;}VOID lcm_p2p_rapid_fwd(U8 *buf, U32 len, U16 usDstPort, U32 ulSrcIp, U16 usSrcPort){    MPE             dstMpe;    MBUF_S          *pstMbuf;    U32              ulResult, ulDstIp, lockKey;    IP_S            *ip;    UDPHDR_S        *udp;    if( FALSE == m_ulMsgEnable )    {        aos_dmem_free(mem_obj_head(buf));        return;    }    dstMpe = lcm_get_mpe_by_port(usDstPort);    if( U32_BUTT == dstMpe )    {        aos_dmem_free(mem_obj_head(buf));        return;    }        MBUF_CREATE_BY_DATA_BLOCK( pstMbuf, mem_obj_head(buf), mem_obj_size(buf), buf, len, dstMpe, MPE_LCM );    if( NULL == pstMbuf )    {        aos_dmem_free(mem_obj_head(buf));        return;    }    MBUF_PREPEND_MEMORY_SPACE( pstMbuf, sizeof(IP_S)+sizeof(UDPHDR_S), MPE_LCM, ulResult );    if( MBUF_OK != ulResult )    {        mbuf_destroy( pstMbuf );        return;    }    ip  = MBUF_MTOD(pstMbuf, IP_S*);    udp = (UDPHDR_S*)(ip+1);    udp->uh_sULen  = AOS_HTONS((U16)( len+sizeof(UDPHDR_S)));    udp->uh_usSPort = AOS_HTONS(usSrcPort);    udp->uh_usDPort = AOS_HTONS(usDstPort);    udp->uh_usSum  = 0;    ip->ip_chHLen = 5;    ip->ip_chVer  = 4;    ip->ip_chTOS  = 0;		    ip->ip_usLen  = AOS_HTONS((U16)(len+sizeof(UDPHDR_S)+sizeof(IP_S)));    ip->ip_usId   = 0;    ip->ip_sOff  = 0;    ip->ip_chTTL  = 64;    ip->ip_chPr   = 0x11;     ip->ip_usSum  = 0;    ulDstIp = if_get_out_ipaddr();    aos_memcpy(&ip->ip_stSrc.s_ulAddr, &ulSrcIp, 4);    aos_memcpy(&ip->ip_stDst.s_ulAddr, &ulDstIp, 4);    lockKey = 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(lockKey);}#ifdef CONFIG_SIMULATE_E1#include "ip/ip_pub.h"#include "socket/sock_pub.h"#include "socket/sock_err.h"#include "db_pub.h"LCM_PHY_RCV hdlc_rcv=0;struct msg_blk_que hdlc_tx_que = {0,};U32 lcm_sim_hdlc_tx_task_id    = U32_BUTT;U32 lcm_sim_hdlc_rcv_task_id    = U32_BUTT;extern BOOL_T      v5_get_phyc_v5no_by_commport( U16 usCommPort, U8 *pucPhyC, U8 *ucV5No );extern BOOL_T v5_get_commport_by_phyc( U8 ucPhyC, U16 *usCommPort );VOID lcm_sim_tx_task( );VOID lcm_sim_hdlc_recv_task( );U32 lcm_sim_hdlc_send_over_udp( U32 port, struct msg_blk *mb );U32 lcm_hdlc_sim_init(){    U32 result;    msg_que_init(&hdlc_tx_que);    result = aos_task_create((U8 *)"h_rcv", 10*1024, TASK_PRIO_NORMAL, AOS_TASK_NOPREEMPT,                 (VOID(*)(VOID *))lcm_sim_hdlc_recv_task, (VOID*)0, &lcm_sim_hdlc_rcv_task_id);    if( AOS_SUCC != result )    {        return result;    }    result = aos_task_create((U8 *)"h_tx", 10*1024, TASK_PRIO_NORMAL, AOS_TASK_NOPREEMPT,                 (VOID(*)(VOID *))lcm_sim_tx_task, (VOID*)0, &lcm_sim_hdlc_tx_task_id);    if( AOS_SUCC != result )    {        return result;    }    result= lcm_add_drv( LCM_DRV_HDLC,                         N201, (LCM_PHY_SND)lcm_sim_hdlc_send_over_udp, &hdlc_rcv );    return result;}U32 lcm_sim_hdlc_send_over_udp( U32 port, struct msg_blk *mb ){    U32 v5_id;    U8 phy_c, v5_no, link_id, ts_no;    if( NULL == mb || NULL == mb->data )    {        if( NULL != mb )        {            msg_free( mb );        }        return AOS_FAIL;    }    if( FALSE == v5_get_phyc_v5no_by_commport( (U16)port, &phy_c, &v5_no ) )    {        goto sim_send_fail;    }    if( FALSE == db_get_linkid_tsno_by_phyc_index(phy_c, &link_id, &ts_no) )    {        goto sim_send_fail;    }    if( FALSE == db_get_v5id_by_v5no(v5_no, &v5_id) )    {        goto sim_send_fail;    }        *(U32*)msg_push( mb, sizeof(U32) ) = AOS_HTONL(v5_id);    *(U8*)msg_push( mb, sizeof(U8) )   = link_id;    *(U8*)msg_push( mb, sizeof(U8) )   = ts_no;    if( U32_BUTT != lcm_sim_hdlc_tx_task_id )    {        msg_que_tail( &hdlc_tx_que, mb );        aos_event_post( lcm_sim_hdlc_tx_task_id, MSG_SYNC_EVENT );        return 0;    }sim_send_fail:    aos_dmem_free( (VOID*)mb->head );    msg_free( mb );	return AOS_FAIL;}VOID lcm_sim_hdlc_recv_task( ){    S32 iFd,iRet;    SOCKADDRIN_S  addr;    S32 Len = sizeof(addr);    struct msg_blk *mb;    if( NULL == hdlc_rcv )    {        return;    }#ifndef CONFIG_SIM_HDLC_PEER_IP#error pls define CONFIG_SIM_HDLC_PEER_IP#endif    aos_memset(&addr,0,(U32)Len);    addr.sin_chFamily = AF_INET;    addr.sin_usPort   = AOS_HTONS(CONFIG_SIM_HDLC_UDP_PORT);    addr.sin_stAddr.s_ulAddr = 0;    iFd = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP);    if( iFd < 0 )    {        aos_printf( MPE_EDRV, "Hdlc:create edrv recv sock fail" );        return;    }        iRet = bind(iFd,(SOCKADDRIN_S *)&addr,sizeof(SOCKADDRIN_S));    if( iRet < 0 )    {        aos_printf( MPE_EDRV, "Hdlc:bind hdlc recv sock fail" );        return;    }    mb = msg_alloc4drv( N201 );    if( NULL == mb )    {        return;    }    for(;;)    {        struct msg_blk *newmb;        U32 v5_id;        U8  link_id, ts_no, v5_no, phy_c;        U16 commport;        iRet = recvfrom(iFd, (S8*)mb->data, mb->end-mb->data, 0,  (SOCKADDRIN_S *)&addr , (S32*)&Len);        if( iRet <= 0)        {            aos_task_delay(1);            continue;        }        newmb = msg_alloc4drv( N201 );        if( NULL == newmb )        {                                    continue;        }        mb->len = (U32)iRet;        mb->tail = mb->data + mb->len;                ts_no = *(U8*)mb->data;        msg_pull( mb, sizeof(U8) );        link_id = (U8)AOS_NTOHL( *(U32*)mb->data );        msg_pull( mb, sizeof(U8) );        v5_id = AOS_NTOHL(*(U32*)mb->data);        msg_pull( mb, sizeof(U32) );        if( FALSE == db_get_v5no_by_v5id( v5_id, &v5_no) )        {            mb = newmb;            continue;        }        if( FALSE == db_get_phyc_by_v5no_linkid_tsno(v5_no, link_id, ts_no, &phy_c) )        {            mb = newmb;            continue;        }        if( FALSE == v5_get_commport_by_phyc( phy_c, &commport) )        {            mb = newmb;            continue;        }        (*hdlc_rcv)( LCM_DRV_HDLC, commport, mb );        mb = newmb;    }}VOID lcm_sim_tx_task( ){    S32 iRet, iFd;    SOCKADDRIN_S  dst_addr,addr;    S32 Len = sizeof(SOCKADDRIN_S);    U32 event;    struct msg_blk *mb;    aos_memset(&addr,0,(U32)Len);    addr.sin_chFamily = AF_INET;    addr.sin_usPort   = AOS_HTONS(CONFIG_SIM_HDLC_UDP_PORT);    addr.sin_stAddr.s_ulAddr = 0;    iFd = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP);    if( iFd < 0 )    {        aos_printf( MPE_EDRV, "Hdlc:create edrv recv sock fail" );        return;    }    #if 0    if( bind(iFd,&addr,Len) )    {        aos_printf( MPE_EDRV, "Hdlc:bind edrv recv sock fail" );        return;    }#endif    aos_memset(&dst_addr,0,(U32)Len);    dst_addr.sin_chFamily = AF_INET;    dst_addr.sin_usPort   = AOS_HTONS(CONFIG_SIM_HDLC_UDP_PORT);    aos_strtoipaddr(CONFIG_SIM_HDLC_PEER_IP, &dst_addr.sin_stAddr.s_ulAddr);    dst_addr.sin_stAddr.s_ulAddr = AOS_HTONL(dst_addr.sin_stAddr.s_ulAddr);    aos_printf( MPE_EDRV, "Hdlc:start to send message" );    for(;;)    {        aos_event_wait( MSG_SYNC_EVENT, AOS_WAIT_ANY, 0, &event );        while( NULL != (mb=msg_deque( &hdlc_tx_que )) )        {                        iRet = sendto(iFd, (S8*)mb->data, (S32)mb->len, 0, &dst_addr, (S32)Len);            if( iRet <= 0)            {                #ifdef LCM_DEBUG                {                    S8  str[20];                    aos_ipaddrtostr( AOS_NTOHL(dst_addr.sin_stAddr.s_ulAddr), str );                    aos_printf( MPE_EDRV,"Hdlc:Send data fail,ip=%s,port=%d",                                str, AOS_NTOHS(dst_addr.sin_usPort) );                }                #endif            }            aos_dmem_free( (VOID*)mb->head );            msg_free( mb );        }    }}#endif#ifdef __cplusplus}#endif 

⌨️ 快捷键说明

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