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

📄 arp.c

📁 ARM嵌入式常用模块的原理图和源码
💻 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 + -