📄 arp.c
字号:
#include "GloblDef.h"
#include "MMenage.h"
#include "RTL8019.h"
#include "NetIntef.h"
#include "timer.h"
#include "ARP.h"
extern void MemCopy(BYTE xdata * to,BYTE xdata * from,WORD size);
extern BYTE MemAllocation(WORD size);
extern BYTE xdata * MemPageToPoint(BYTE page);
extern void FreePage(BYTE page);
extern void NetInFillMacHead(struct MACHeader xdata * pMACHead,WORD protocal,BYTE xdata *dest);
extern BYTE RTLSendPacket(BYTE xdata * buffer,WORD size);
extern DWORD xdata ServerIPAddress;
extern DWORD xdata LocalIPAddress;
extern BYTE xdata UnknownMACAddr[];
extern BYTE xdata BroadcastMACAddr[];
extern BYTE xdata LocalMACAddr[];
struct s_IPToPhisical xdata IPToPhisical; /* ARP表 */
struct s_timer xdata ARPTimer; /* ARP时钟*/
BYTE ARPRetrasmitTime; /* ARP需要重传的时间*/
void ARPInitial()
{
IPToPhisical.IP = ServerIPAddress;
IPToPhisical.state = ARP_STATE_NOT_FOUND;
/* 初始化ARP时钟*/
ARPTimer.enable = FALSE;
ARPRetrasmitTime = 0;
}
/* 发送一个ARP请求 */
void ARP_SendRequest(DWORD destIP)
{
BYTE page;
struct MACHeader xdata *pMACHead;
struct ARPHeader xdata *pARPHead;
struct ARPContent xdata *pARPContent;
/* 分配内存空间 */
page = MemAllocation(MIN_PACKET_SIZE);
if(page == PAGE_NOT_FOUND)
return;
IPToPhisical.IP = destIP;
IPToPhisical.state = ARP_STATE_ALREADY_SEND;
pMACHead = (struct MACHeader xdata *)(MemPageToPoint(page) + sizeof(struct MemHeader));
pARPHead = (struct ARPHeader xdata *)((BYTE xdata *)pMACHead + sizeof(struct MACHeader));
pARPContent =(struct ARPContent xdata *)((BYTE xdata *)pARPHead + sizeof(struct ARPHeader));
/* 填写ARP头 */
pARPHead->HardWareAddrLen = ETHERNET_ADDR_LEN;
pARPHead->HardwareType = ARP_HARDWARE_TYPE_ETHERNET;
pARPHead->ProtocolAddrLen = IP_ADDR_LEN;
pARPHead->ProtocolType = ARP_PROTOCOL_TYPE_IP;
pARPHead->type = ARP_TYPE_ARP_REQUEST;
/* 填充ARP内容 */
pARPContent->DestinationIP = destIP;
MemCopy(pARPContent->DestMACAddr,UnknownMACAddr,ETHERNET_ADDR_LEN);
pARPContent->SourceIP = LocalIPAddress;
MemCopy(pARPContent->SourceMACAddr,LocalMACAddr,ETHERNET_ADDR_LEN);
/*填充MAC头*/
NetInFillMacHead(pMACHead,NET_PACKET_TYPE_ARP,BroadcastMACAddr);
/* ARP包小于MIN_PACKET_SIZE */
RTLSendPacket((BYTE xdata *)pMACHead,
MIN_PACKET_SIZE);
/* 释放 */
FreePage(page);
/* 设置时钟*/
ARPTimer.enable = TRUE;
ARPTimer.value = ARP_REQUEST_TIME_OUT;
}
/* 处理ARP */
void ARPIn(BYTE page)
{
struct MACHeader xdata *pMACHead;
struct ARPHeader xdata *pARPHead;
struct ARPContent xdata *pARPContent;
pMACHead = (struct MACHeader xdata *)(MemPageToPoint(page) + sizeof(struct MemHeader));
pARPHead = (struct ARPHeader xdata *)((BYTE xdata *)pMACHead + sizeof(struct MACHeader));
pARPContent =(struct ARPContent xdata *)((BYTE xdata *)pARPHead + sizeof(struct ARPHeader));
/* ARP请求 */
if(pARPHead->type == ARP_TYPE_ARP_REQUEST )
{
/* 本地ARP请求*/
if(pARPContent->DestinationIP == LocalIPAddress)
{
/* 发送ARP应答*/
/* 源端到目的端的复制 */
MemCopy(pARPContent->DestMACAddr,pARPContent->SourceMACAddr,(IP_ADDR_LEN + ETHERNET_ADDR_LEN));
/*填写源内容 */
pARPContent->SourceIP = LocalIPAddress;
MemCopy(pARPContent->SourceMACAddr,LocalMACAddr,ETHERNET_ADDR_LEN);
/* ARP类型 */
pARPHead->type = ARP_TYPE_ARP_REPLY;
/*MAC头 */
NetInFillMacHead(pMACHead,NET_PACKET_TYPE_ARP,pARPContent->DestMACAddr);
/* 发送包 , ARP包小于min_packet_size*/
RTLSendPacket((BYTE xdata *)pMACHead,MIN_PACKET_SIZE);
}
/* 否则指向其它地址 */
}
else
{
/* ARP应答 */
if(pARPHead->type == ARP_TYPE_ARP_REPLY)
{
/* 应答前一ARP请求 */
if(pARPContent->DestinationIP == LocalIPAddress && pARPContent->SourceIP == IPToPhisical.IP)
{
/* 记录ARP */
IPToPhisical.state = ARP_STATE_FOUND;
MemCopy(IPToPhisical.MACAddr,pARPContent->SourceMACAddr,ETHERNET_ADDR_LEN);
/* 关ARP时钟 */
ARPTimer.enable = FALSE;
/* 重传时钟置0 */
ARPRetrasmitTime = 0;
}
}
}
/*释放ARP */
FreePage(page);
}
/* 重传当前ARP */
void ARP_Resend()
{
ARP_SendRequest(IPToPhisical.IP);
ARPRetrasmitTime++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -