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

📄 lcm_rsock.c

📁 abstract rtos
💻 C
📖 第 1 页 / 共 4 页
字号:
        rs->peer_port = port;        rs->lcl_port  = lcl_port;        rs->tcp_seq   = 0;        rs->tcp_ack   = 0;        rs->tcp_tmr   = NULL;        rs->tcp_last_ack = 0;#if( CONFIG_BOARD_GMPU == TRUE )        rs->if_index  = if_index;#endif                aos_list_add_tail( list, node );		if( g_ulRsockDbgIpFilter == ip )		{			aos_printf( 0, "rsock init:SOCK=%d,REF=%u,ip=%A,port=%u,lclport=%u,allocflag=%u,proto=%u",				(rs - g_pstRsock),rs->ref,ip, port,lcl_port,alloc_lclport_flag,proto );		}        return rs - g_pstRsock;    }    else    {        AOS_ASSERT(0);        if( allocated )        {            if( RSOCK_PROTO_UDP == proto )            {                rsock_free_udp_port( new_port );            }            else            {                rsock_free_tcp_port( new_port );            }        }     }    return NULL_RSOCK;}RSOCK rsock_find( U32 proto, U32 ip, U16 port, U16 lcl_port, U32 if_index){    U32             k;    struct aos_list *list, *node;    rsock_t         *rs;        k = RSOCK_HASHFUNC( port, ip );    if( RSOCK_PROTO_UDP == proto )    {        list = &g_RsockHashList4Udp[k];    }    else if( RSOCK_PROTO_TCP == proto )    {        list = &g_RsockHashList4Tcp[k];    }    else    {        return NULL_RSOCK;    }    for( node = list->next; node != list; node = node->next )    {        rs =  aos_list_entry( node, rsock_t, rsock_next );        if( rs->peer_ip == ip          && rs->peer_port == port         && rs->lcl_port == lcl_port #if( CONFIG_BOARD_GMPU == TRUE )		 && rs->if_index == if_index#endif                  )        {            return rs - g_pstRsock;        }            }    return NULL_RSOCK;}VOID rsock_free( rsock_t *rs ){    aos_list_delete( &rs->rsock_next );    aos_list_add_tail( &g_FreeRsockList, &rs->rsock_next );    if( NULL != rs->tcp_tmr )    {        AOS_ASSERT(0);        aos_timer_stop( &rs->tcp_tmr );    }    if( rs->alloc_flag )    {        if( RSOCK_PROTO_UDP == rs->proto )        {            rsock_free_udp_port( rs->lcl_port );        }        else        {            rsock_free_tcp_port( rs->lcl_port );        }        rs->alloc_flag = 0;    }    rs->init = 0;}U32 rsock_connect( RSOCK s ){    SOCKADDRIN_S addr;        if( s < 0 || s >= MAX_RSOCK_NUM || !g_pstRsock[s].init )    {        return RSOCK_ERR;    }    if( g_pstRsock[s].connected )    {        return AOS_SUCC;    }    if( RSOCK_PROTO_UDP == g_pstRsock[s].proto )    {        g_pstRsock[s].connected = 1;        return AOS_SUCC;    }        if( !g_pstRsock[s].seq_init )    {        g_pstRsock[s].tcp_seq = lcm_get_tcp_iss();        g_pstRsock[s].seq_init = 1;        g_pstRsock[s].tcp_state = RSOCK_STATE_SYN_SEND;                aos_timer_start( &g_pstRsock[s].tcp_tmr,                          MPE_RSOCK,                         RSOCK_SYN_SEND_TIMER_LEN,                          RSOCK_SYN_SEND_TIMER,                         s,                         AOS_TIMER_NO_LOOP );        addr.sin_stAddr.s_ulAddr = g_pstRsock[s].peer_ip;        addr.sin_usPort          = AOS_HTONS(g_pstRsock[s].peer_port);		#if( CONFIG_BOARD_GMPU == TRUE )	        lcm_send_tcp_signal_by_if( g_pstRsock[s].if_index, LCM_TCP_SYN, g_pstRsock[s].lcl_port, g_pstRsock[s].tcp_seq, 	                       g_pstRsock[s].tcp_ack, &addr );		#else			lcm_send_tcp_signal_to_eth( LCM_TCP_SYN, g_pstRsock[s].lcl_port, g_pstRsock[s].tcp_seq, 	                       g_pstRsock[s].tcp_ack, &addr );			#endif        if( g_ulRsockDbgFlag )        {            aos_printf( MPE_RSOCK, "RSOCK(%u): send syn to %A %u", s, g_pstRsock[s].peer_ip, g_pstRsock[s].peer_port );        }    }    return RSOCK_AGAIN;}U32 rsock_is_connect( RSOCK s ){    if( s < 0 || s >= MAX_RSOCK_NUM || !g_pstRsock[s].init )    {        return 0;    }        return g_pstRsock[s].connected;}U32 rsock_close( RSOCK s ){    SOCKADDRIN_S addr;#if( TXRX_INTERUPPT_ENABLE == TRUE )	MSG_S msg;	U32   *pRSock;	if( intCount() )	{		pRSock = aos_msg_alloc( MPE_RSOCK, 4 );		if( pRSock )		{			msg.srcProcessorId = LOCAL_PROCESSOR_ID;			msg.srcMpe         = MPE_RSOCK;			msg.dstProcessorId = LOCAL_PROCESSOR_ID;			msg.dstMpe         = MPE_RSOCK;			msg.msgPrio        = MSG_PRIO_NORMAL;			msg.ulSize         = 4;			msg.pvMsgBuf       = (VOID*)pRSock;			*pRSock = s;			aos_msg_send( &msg );						return AOS_SUCC;		}	}#endif    if( s < 0 || s >= MAX_RSOCK_NUM || !g_pstRsock[s].init || !g_pstRsock[s].ref )    {        return RSOCK_ERR;    }	if( g_ulRsockDbgIpFilter == g_pstRsock[s].peer_ip )	{		aos_printf( 0, "rsock close: sock=%d,ip=%A,port=%u,lclport=%u,ref=%u",			s,g_pstRsock[s].peer_ip,g_pstRsock[s].peer_port,g_pstRsock[s].lcl_port,			g_pstRsock[s].ref );	}    g_pstRsock[s].ref--;    if( g_pstRsock[s].ref )    {        return AOS_SUCC;    }        if( RSOCK_PROTO_TCP == g_pstRsock[s].proto      && !g_pstRsock[s].is_tcp_server)    {        addr.sin_stAddr.s_ulAddr = g_pstRsock[s].peer_ip;        addr.sin_usPort          = AOS_HTONS(g_pstRsock[s].peer_port);		#if( CONFIG_BOARD_GMPU == TRUE )	        lcm_send_tcp_signal_by_if( g_pstRsock[s].if_index, LCM_TCP_FIN|LCM_TCP_ACK, g_pstRsock[s].lcl_port, g_pstRsock[s].tcp_seq, 	                       g_pstRsock[s].tcp_ack, &addr );	        lcm_send_tcp_signal_by_if( g_pstRsock[s].if_index, LCM_TCP_RESET, g_pstRsock[s].lcl_port, g_pstRsock[s].tcp_seq, 	                       g_pstRsock[s].tcp_ack, &addr );		#else	        lcm_send_tcp_signal_to_eth( LCM_TCP_FIN|LCM_TCP_ACK, g_pstRsock[s].lcl_port, g_pstRsock[s].tcp_seq, 	                       g_pstRsock[s].tcp_ack, &addr );	        lcm_send_tcp_signal_to_eth( LCM_TCP_RESET, g_pstRsock[s].lcl_port, g_pstRsock[s].tcp_seq, 	                       g_pstRsock[s].tcp_ack, &addr );					#endif        if( g_ulRsockDbgFlag )        {            aos_printf( MPE_RSOCK, "RSOCK(%u): send fin ack / reset to %A %u", s, g_pstRsock[s].peer_ip, g_pstRsock[s].peer_port );        }    }    if( NULL != g_pstRsock[s].tcp_tmr )    {        aos_timer_stop( &g_pstRsock[s].tcp_tmr );    }    rsock_free( &g_pstRsock[s] );    return AOS_SUCC;}VOID rsock_close_all( ){    RSOCK r;        for( r = 0; r < MAX_RSOCK_NUM; r++ )    {        if( g_pstRsock[r].init )        {            if( 0 == (r % 500 ) )            {                clear_watch_dog();            }                        rsock_close(r);        }    }}U32 rsock_send( RSOCK s, MBUF_S *mbuf ){    U32          ulResult, seq, ack;    TCPIPHDR_S   *tcpip;	IP_S         *ip;	UDPHDR_S     *udp;    IFNET_S	     *ifp;	ROUTE_S	      route;    U32           nexthop = 0;    U16           len;    U32           ulRet;    if( NULL == mbuf )    {		AOS_ASSERT(0);        return AOS_FAIL;    }        if( s < 0 || s >= MAX_RSOCK_NUM || !g_pstRsock[s].init )    {		mbuf_destroy(mbuf);		AOS_ASSERT(0);        return RSOCK_ERR;    }    len = (U16)MBUF_GET_TOTAL_DATA_LENGTH(mbuf);#if( CONFIG_BOARD_GMPU == TRUE )    if( ( g_ulRsGateWay[0] || g_ulRsGateWay[1] )      && g_pstRsock[s].if_index )    {    	ifp = if_get_if_by_index(g_pstRsock[s].if_index);    	if (NULL == ifp || NULL == ifp->if_pfOutput)    	{    		mbuf_destroy(mbuf);    		AOS_ASSERT(0);            g_pstRsock[s].if_index = 0;             return AOS_FAIL;    	}    	if (ifp->if_ulPhyType == PHY_LOOP)    	{    		mbuf_destroy(mbuf);    		AOS_ASSERT(0);            return AOS_FAIL;    	}        if( ( g_pstRsock[s].peer_ip & ifp->if_ulIpMask )         == ( ifp->if_ulIpAddr & ifp->if_ulIpMask ) )        {                        nexthop = g_pstRsock[s].peer_ip;        }        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 = g_pstRsock[s].peer_ip;        rt_alloc(&route);        if (NULL == route.ro_pRt)        {    		mbuf_destroy(mbuf);    		aos_printf( MPE_RSOCK, "LCM RSOCK: No Route to %A", g_pstRsock[s].peer_ip );            return AOS_FAIL;        }    	ifp = if_get_if_by_index(route.ro_pRt->rt_ulIfIndex);    	if (NULL == ifp || NULL == ifp->if_pfOutput)    	{    		mbuf_destroy(mbuf);    		AOS_ASSERT(0);            return AOS_FAIL;    	}    	if (ifp->if_ulPhyType == PHY_LOOP)    	{    		mbuf_destroy(mbuf);    		AOS_ASSERT(0);            return AOS_FAIL;    	}    	if (RT_FIELD_FLAGS(route.ro_pRt) & RTF_GATEWAY)    	{    		nexthop = RT_FIELD_GATEWAY(route.ro_pRt);    	}        else        {            nexthop = g_pstRsock[s].peer_ip;        }    }    if( RSOCK_PROTO_TCP == g_pstRsock[s].proto )    {            	MBUF_PREPEND_MEMORY_SPACE(mbuf, sizeof(TCPIPHDR_S), MPE_RSOCK, ulResult);    	if (MBUF_OK != ulResult)    	{    		mbuf_destroy(mbuf);    		AOS_ASSERT(0);            return AOS_FAIL;    	}        MBUF_COMPRESS( mbuf, 1 , MPE_RSOCK , ulRet);        if( AOS_SUCC != ulRet )        {    		mbuf_destroy(mbuf);    		AOS_ASSERT(0);            return AOS_FAIL;        }        seq = AOS_HTONL(g_pstRsock[s].tcp_seq);        ack = AOS_HTONL(g_pstRsock[s].tcp_ack);        g_pstRsock[s].tcp_seq += len;        g_pstRsock[s].tcp_last_ack = g_pstRsock[s].tcp_ack;    	    	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          	= AOS_HTONS(sizeof(TCPHDR_S) + len);        aos_memcpy((U8*)&tcpip->seqTHSeq, (U8*)&seq, 4);        aos_memcpy((U8*)&tcpip->seqTHAck, (U8*)&ack, 4);        tcpip->ucTHX2          	= 0;        tcpip->ucTHOffset     	= 5;        tcpip->ucTHFlags       	= LCM_TCP_PUSH_ACK;        tcpip->usTHWnd        	= AOS_HTONS(0x1000);        tcpip->usTHCheckSum    	= 0;        tcpip->usTHUrgentPoint 	= 0;    	        tcpip->usTHSrcPort = AOS_HTONS(g_pstRsock[s].lcl_port);    	tcpip->usTHDstPort = AOS_HTONS(g_pstRsock[s].peer_port);        aos_memcpy(&tcpip->adrIHSrc.s_ulAddr, & ifp->if_ulIpAddr, 4);        aos_memcpy(&tcpip->adrIHDst.s_ulAddr, &g_pstRsock[s].peer_ip, 4);    	tcpip->usTHCheckSum = in_cksum(mbuf, (S32)( sizeof(TCPIPHDR_S)+ len));        len += sizeof(TCPIPHDR_S);    }    else    {            	MBUF_PREPEND_MEMORY_SPACE(mbuf, sizeof(UDPHDR_S)+sizeof(IP_S), MPE_RSOCK, ulResult);    	if (MBUF_OK != ulResult)    	{    		mbuf_destroy(mbuf);    		AOS_ASSERT(0);            return AOS_FAIL;    	}        MBUF_COMPRESS( mbuf, 1 , MPE_RSOCK, ulRet );        if( AOS_SUCC != ulRet )        {    		mbuf_destroy(mbuf);    		AOS_ASSERT(0);            return AOS_FAIL;        }        		ip = MBUF_MTOD(mbuf, IP_S*);		udp = (UDPHDR_S*)(ip+1);		udp->uh_usSPort = AOS_HTONS(g_pstRsock[s].lcl_port);		udp->uh_usDPort = AOS_HTONS(g_pstRsock[s].peer_port);		udp->uh_sULen   = (S16)AOS_HTONS(sizeof(UDPHDR_S) + len);		udp->uh_usSum   = 0;        udp->uh_usSum   = rtp_udp_checksum((U8*)udp	                    , ifp->if_ulIpAddr, g_pstRsock[s].peer_ip	                    , AOS_NTOHS(udp->uh_sULen)); 		aos_memcpy( &ip->ip_stSrc.s_ulAddr, &ifp->if_ulIpAddr, 4 );		aos_memcpy( &ip->ip_stDst.s_ulAddr, &g_pstRsock[s].peer_ip, 4 );		ip->ip_chPr = IPPROTO_UDP;        len += sizeof(UDPIPHDR_S);    }    	ip = MBUF_MTOD(mbuf, IP_S*);	ip->ip_chHLen = 5;    ip->ip_chVer  = 4;    ip->ip_usLen  = AOS_HTONS(len);    ip->ip_chTTL  = 128;    ip->ip_chTOS  = 0;		    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;    NAT_SET_FLAG(mbuf,NAT_VOX);    	if (ifp->if_pfLLCOutput(mbuf))	{	}        return AOS_SUCC;}U32 rsock_packet_input( RSOCK s, U8 *buf, U32 if_index ){    IP_S     *ip;    TCPHDR_S *tcp = NULL;    UDPHDR_S *udp = NULL;    U32      tcpSeq,tcpAck,srcIp;    U16      lclPort, srcPort, payLen = 0;    SOCKADDRIN_S addr;    U32          rsock_proto;    rsock_t      *rs;    if( s != NULL_RSOCK )    {        if( s < 0 || s >= MAX_RSOCK_NUM          || !g_pstRsock[s].init )        {            return AOS_FAIL;        }    }	ip = (IP_S*)buf;    aos_memcpy( &srcIp, &ip->ip_stSrc.s_ulAddr, 4 );    if( IPPROTO_TCP == ip->ip_chPr )    {        tcp = (TCPHDR_S*)((U8*)ip + (ip->ip_chHLen << 2));        aos_memcpy( &tcpSeq, &tcp->seqSeqNumber, 4 );        aos_memcpy( &tcpAck, &tcp->seqAckNumber, 4 );        tcpSeq = AOS_NTOHL(tcpSeq);        tcpAck = AOS_NTOHL(tcpAck);        srcPort = AOS_NTOHS( tcp->usSrcPort );        lclPort = AOS_NTOHS( tcp->usDstPort );        payLen = AOS_NTOHS(ip->ip_usLen) - ( ip->ip_chHLen << 2 ) - ( tcp->ucOffset << 2 );        rsock_proto = RSOCK_PROTO_TCP;    }    else    {        udp = (UDPHDR_S*)((U8*)ip + (ip->ip_chHLen << 2));        srcPort = AOS_NTOHS( udp->uh_usSPort );        lclPort = AOS_NTOHS( udp->uh_usDPort );        rsock_proto = RSOCK_PROTO_UDP;        payLen = AOS_NTOHS(ip->ip_usLen) - ( ip->ip_chHLen << 2 ) - 8;		    }    if( NULL_RSOCK == s )    {        s = rsock_find( rsock_proto, srcIp, srcPort, lclPort, if_index);        if( RSOCK_PROTO_TCP == rsock_proto          && NULL_RSOCK == s          && LCM_TCP_SYN == tcp->ucFlags )        {            s = rsock_init( RSOCK_PROTO_TCP, srcIp, srcPort, lclPort, if_index, 0, NULL );            if( NULL_RSOCK != s )            {                g_pstRsock[s].ref = 0;                g_pstRsock[s].is_tcp_server = 1;                aos_timer_start( &g_pstRsock[s].tcp_tmr,                                  MPE_RSOCK,                                 RSOCK_SYN_RECV_TIMER_LEN,                                 RSOCK_SYN_RECV_TIMER,                                 s,                                 AOS_TIMER_NO_LOOP );                if( g_ulRsockDbgFlag )                {                    aos_printf( MPE_RSOCK, "RSOCK(%u): port %u Create a rsock in listening from %A %u",                         s, lclPort, srcIp, srcPort );                }            }        }        if( NULL_RSOCK == s )

⌨️ 快捷键说明

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