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

📄 udp.c

📁 实现在ARM上的ICP/IP功能的源代码。
💻 C
字号:
#include "true_false.h"
#include "stdlib.h"
#include "typedef.h"
#include "mem_man.h"
#include "rtl8019.h"
#include "netif.h"
#include "etherif.h"
#include "ip.h"
#include "arp.h"
#include "utilities.h"
#include "tcp.h"
#include "udp.h"
//#if UDP_EN


/*UCB.C*/
struct SUCB   UCBPool[UCP_CONNECTION_MAX_NUM];
struct SUCB   *   UCBFreeList;		/* free list */
struct SUCB   *   UCBList;			/* UCB in use */

void UCPInit()
{
	WORD i;
	/* move TCBPool to TCBFreeList */
	for(i = 0, UCBFreeList = NULL; i<UCP_CONNECTION_MAX_NUM; i++)
	{
		UCBPool[i].pNext =UCBFreeList ;
		UCBFreeList = &UCBPool[i];
	}
	UCBList = NULL;
}/*ok*/

 

struct SUCB *UCPGetUCB() 
{
	struct SUCB   * pUCB;
	if((pUCB = UCBFreeList) != NULL)
	{
		UCBFreeList = UCBFreeList->pNext;
	}
	return pUCB;
}/*ok*/

void TCPInsertUCB(struct SUCB   *pUCB)  
{
	pUCB->pNext = UCBList;
	UCBList = pUCB;
}/*ok*/



/*MUST SCAN ALL THE QUEUE*/
/*
1,FIND THE PREVOIUS NODE,
2,DELETE FORM THE UCBList 
3,INSERT INT THE UCBFreeList
*/
void UCPRelaeseUCB(struct SUCB*arg)
{
    struct SUCB *pUCB ;
    for(pUCB=UCBList;
    pUCB->pNext->pNext!=NULL;
    pUCB=pUCB->pNext)
    {
        if(arg==pUCB->pNext->pNext)
        {
            pUCB->pNext=arg->pNext ;
            arg->pNext=UCBFreeList ;
            UCBFreeList=arg ;
            return ;
        }
    }
}


struct SUCB * find_UCB(u32_t local_ip,u16_t local_port ,u32_t remote_ip,u16_t remote_port)
{
	struct SUCB   * pUCB=UCBList;
	while(NULL!=pUCB)
	{
		if(
		((pUCB->info).remote_ip==remote_ip)&&((pUCB->info).remote_port == remote_port))
		{
			if(((pUCB->info).local_ip==local_ip)&&((pUCB->info).local_port == local_port))
			{
				return pUCB;
			}
		}
		pUCB=pUCB->pNext;
	}
	return NULL;
}




void UCPInput(struct SMemHead *MemHead) 
{
	struct SIPHead   *pIPHead;
	struct SUDPHead  *pUDPHead;
	struct SUCB	*pUCB;
	
	pUDPHead = (struct SUDPHead*)(MemHead->pStart);
	pIPHead	 = (struct SIPHead *)(MemHead->pStart - sizeof(struct SIPHead));
	/*
	 * is check sum ok? 
	 */
pUCB=find_UCB(
pIPHead->IPDest,
pUDPHead->PORTDest,
pIPHead->IPScr,
pUDPHead->PORTSrc
);
/*this udp pack is sent to me so his remote port is our local port!*/
/*
u32_t local_ip,u16_t local_port ,
u32_t remote_ip,u16_t remote_port,
*/
/*
	WORD	PORTSrc;
	WORD	PORTDest;
*/
/* 
	IP_ADDR IPScr;				
	IP_ADDR IPDest;
*/

	if (NULL!=pUCB)
	{
		MemHead->pStart+=UDP_HEAD_LEN;
		pUCB->rcv(MemHead->pStart,(MemHead->pEnd-MemHead->pStart));
	}
	MemFree(MemHead);
}

/* fill a segment and send it,NOTE MemHead->pStart point to TCPData */
BOOL UCPSend(u32_t local_ip,u16_t local_port ,u32_t remote_ip,u16_t remote_port,BYTE *buff,WORD len)
{
	struct SUDPHead 	*pUDPHead;
	struct SIPHead  	*pIPHead;
	struct SMemHead *MemHead ;
	MemHead=MemAllocate(IP_HEAD_MIN_LEN	+NETIF_HEAD_MAX_LEN+UDP_HEAD_LEN+len);
	if (MemHead==NULL)
	return FALSE;
	pUDPHead = (struct SUDPHead *)(MemHead->pStart+IP_HEAD_MIN_LEN + NETIF_HEAD_MAX_LEN+len);
	/* fill tcp header */
	pUDPHead->PORTDest		= htons(remote_port);
	pUDPHead->PORTSrc		= htons(local_port);
	pUDPHead->UDPCheckSum		= 0;

	pIPHead = ((struct SIPHead *)(pUDPHead-IP_HEAD_MIN_LEN));
	pIPHead->IPDest					= htonl(remote_ip);
	pIPHead->IPScr					= htons(local_ip);
	pIPHead->Protocol				= IP_PROTOCOL_UDP;
	
	pIPHead->TotalLen=htons(MemHead->pEnd-MemHead->pStart-NETIF_HEAD_MAX_LEN);	
	/* pStart point to udp data */
//	pUDPHead->UDPCheckSum = UDPCheckSum();

	/* send packet */
	MemHead->pStart = (BYTE  *)pIPHead;	/* dec pStart */
	return 	IPOutput(MemHead);
}

⌨️ 快捷键说明

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