📄 udp.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 + -