📄 arp.c
字号:
//**********************************
//*版本: Test 1.0
//*作者: XUGUOHONG
//*E-MAIL: KK20Y@YAHOO.COM.CN
//*WEBSITE:microdesign.000webhost.com
//**********************************
#include <rtl8019as.h>
//**********************************
//* 系统 MAC地址设定(根据需要修正)
//**********************************
extern unsigned char SYSMAC[6];
//**********************************
//* 系统 IP地址设定(根据需要修正)
//**********************************
extern unsigned char SYSIP[4];
void arp(void);
void arp_request(unsigned char,unsigned char,unsigned char,unsigned char);
void arp_reply(void);
void arp_table_save(void);
//************************************
// ARP
//判断应该采取何种ARP操作
//************************************
void arp(void)
{
unsigned char temp=0;
unsigned char temp1=0;
unsigned char i;
for(i=0;i<6;i++) // 如数据包目标地址为0XFF则为ARP请求
{
if(read_62256(i)==0XFF) // 读取有几个0XFF
temp++;
else if(read_62256(i)==SYSMAC[i]) // 读取有几个MAC地址与本机地址相符
temp1++;
}
for(i=0;i<4;i++)
{
if(read_62256(0x0026+i)==SYSIP[i]) // 读取是否为对本机的ARP请求
temp++;
}
if(temp==0X0A) // temp=10表明条件符合,时对本机的
arp_reply(); // ARP请求,并进行回复
if(temp1==0X06) // temp1=6表明时对本机的ARP回复
arp_table_save();
}
//************************************
// ARP请求
//解析本机所发送IP地址所对应的MAC地址
//************************************
void arp_request(unsigned char IP1,unsigned char IP2,unsigned char IP3,unsigned char IP4)
{
unsigned char i;
for(i=0;i<6;i++) // 1.目标MAC地址
write_62256(i,0XFF); // 0xFF 0XFF 0XFF 0XFF 0XFF 0XFF
for(i=0;i<6;i++) // 2.本机MAC地址
write_62256(0x0006+i,SYSMAC[i]); // SYSMAC[6]
write_62256(0x000C,0X08); // 3.帧类型
write_62256(0x000D,0X06); // 0X0806--ARP
write_62256(0x000E,0X00); // 4.HARD TYPE
write_62256(0x000F,0X01); // ETHERNET
write_62256(0x0010,0X08); // 5.PORT TYPE
write_62256(0x0011,0X00);
write_62256(0x0012,0X06); // 6.HARD SIAE
write_62256(0x0013,0X04); // 7.PORT SIZE
write_62256(0x0014,0X00); // 8.OP
write_62256(0x0015,0X01); // 0x0001--ARP请求
for(i=0;i<6;i++)
write_62256(0x0016+i,SYSMAC[i]); // 9.本机MAC地址
for(i=0;i<4;i++)
write_62256(0x001C+i,SYSIP[i]); // 10.本机IP地址
for(i=0;i<6;i++)
write_62256(0x0020+i,0X00); // 11.目标MAC地址
write_62256(0x0026,IP1);
write_62256(0x0027,IP2);
write_62256(0x0028,IP3);
write_62256(0x0029,IP4); // 12.远程终端IP地址
for(i=0;i<0x12;i++)
write_62256(0x002A+i,0x00); // 13.填冲数据
sendpacket(0x003c); // 发送数据
}
//************************************
// ARP回复
//回复其他网络终端对本机的MAC地址请求
//************************************
void arp_reply(void)
{
unsigned char i;
for(i=0;i<6;i++) // 1.目标MAC地址
write_62256(i,read_62256(0x0016+i)); // COPY 0X16--0X21数据
for(i=0;i<6;i++) // 2.本机MAC地址
write_62256(0x0006+i,SYSMAC[i]); // SYSMAC[6]
write_62256(0x000C,0X08); // 3.帧类型
write_62256(0x000D,0X06); // 0X0806--ARP
write_62256(0x000E,0X00); // 4.HARD TYPE
write_62256(0x000F,0X01); // ETHERNET
write_62256(0x0010,0X08); // 5.PORT TYPE
write_62256(0x0011,0X00);
write_62256(0x0012,0X06); // 6.HARD SIAE
write_62256(0x0013,0X04); // 7.PORT SIZE
write_62256(0x0014,0X00); // 8.OP
write_62256(0x0015,0X02); // 0x0002--ARP回复
for(i=0;i<6;i++)
write_62256(0x0020+i,read_62256(0x0016+i)); // 11.目标MAC地址
for(i=0;i<4;i++)
write_62256(0x0026+i,read_62256(0x001C+i)); // 12.远程终端IP地址
for(i=0;i<6;i++)
write_62256(0x0016+i,SYSMAC[i]); // 9.本机MAC地址
for(i=0;i<4;i++)
write_62256(0x001C+i,SYSIP[i]); // 10.本机IP地址
for(i=0;i<0x12;i++)
write_62256(0x002A+i,0x00); // 13.填冲数据
sendpacket(0x003c); // 发送数据
}
//********************************************
// ARP表格保存
//1.建立ARP IP MAC 对应表,只缓存最新一个ARP
//********************************************
void arp_table_save(void)
{
#define table_start 0X05EE
unsigned char i;
for(i=0;i<4;i++)
write_62256(table_start+i,read_62256(0x001C+i)); // 10.远程终端IP地址
for(i=0;i<6;i++)
write_62256(table_start+i+4,read_62256(0x0016+i)); // 11.远程终端MAC地址
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -