?? 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;
}
/* 發(fā)送一個ARP請求 */
void ARP_SendRequest(DWORD destIP)
{
BYTE page;
struct MACHeader xdata *pMACHead;
struct ARPHeader xdata *pARPHead;
struct ARPContent xdata *pARPContent;
/* 分配內(nèi)存空間 */
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內(nèi)容 */
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);
/* 設(shè)置時鐘*/
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)
{
/* 發(fā)送ARP應答*/
/* 源端到目的端的復制 */
MemCopy(pARPContent->DestMACAddr,pARPContent->SourceMACAddr,(IP_ADDR_LEN + ETHERNET_ADDR_LEN));
/*填寫源內(nèi)容 */
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);
/* 發(fā)送包 , 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);
/* 關(guān)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 + -