📄 arp.c
字号:
/*********************************************************************************
* arp.c v1.00 arp协议程序 *
* 版权(c) 2004- 北京百科融创科技有限公司 *
* 设计者: 赵治心 *
* 邮箱: ourui.wl@263.net *
**********************************************************************************/
#include "stdio.h"
#include "tcp_ip.h"
#include "global.h"
#include "8019head.h"
UCHAR sed_lclEthAddr[6] = { 0x00, 0x30, 0x6E, 0x1C, 0x0EE, 0x0E1 };
UCHAR sed_lclIPAddr[4] = { 192, 168, 1, 2 };
UCHAR sed_desIPAddr[4] = { 0, 0, 0, 0};
UCHAR broadcast_hwaddr[6] = { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF };
UCHAR sed_desEthAddr[6] = { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF };
ARP_CACHE Arp_Chche;
void arp_send(UCHAR *hwaddr,UCHAR *ipaddr,UCHAR msg_type)
{
int i;
UCHAR * outbuf;
ARP_HEADER * arp;
outbuf = (UCHAR *)SendBuffer;
if (outbuf == NULL)
return;
arp = (ARP_HEADER *)(outbuf + 14);
arp->hardware_type[0] = (DIX_ETHERNET & 0xFF00)>>8;
arp->hardware_type[1] = DIX_ETHERNET & 0x00FF;
arp->protocol_type[0] = (IP_PACKET & 0xFF00)>>8;
arp->protocol_type[1] = IP_PACKET & 0x00FF;
arp->hwaddr_len = 6;
arp->ipaddr_len = 4;
arp->message_type[0] = (UINT)(msg_type & 0xFF00)>>8;
arp->message_type[1] = (UINT)(msg_type & 0x00FF);
for(i=0;i<6;i++)
arp->source_hwaddr[i]=sed_lclEthAddr[i];
for(i=0;i<4;i++)
arp->source_ipaddr[i]=sed_lclIPAddr[i];
if (msg_type == ARP_REQUEST)
for(i=0;i<6;i++)
arp->dest_hwaddr[i]=0;
else
for(i=0;i<6;i++)
arp->dest_hwaddr[i]=*(hwaddr+i);
for(i=0;i<4;i++)
arp->dest_ipaddr[i]=*(ipaddr+i);
// If request then the message is a brodcast, if a response then
// send to specified hwaddr
// ARP payload size is always 28 bytes
if (msg_type == ARP_REQUEST) eth_send(outbuf, broadcast_hwaddr, ARP_PACKET, 28);
else eth_send(outbuf, hwaddr, ARP_PACKET, 28);
}
UINT arp_resolve(void)
{
int i,temp;
ARP_HEADER *arp;
arp=(ARP_HEADER *)&RevBuffer[14];
if(arp->message_type[1]==ARP_RESPONSE)
{
for(i=0;i<6;i++)
sed_desEthAddr[i]=arp->source_hwaddr[i];
return 1;
}
else if(arp->message_type[1]==ARP_REQUEST)
{
temp=0;
for(i=0;i<6;i++)
{
if((arp->dest_hwaddr[i]) == 0x00)
temp++;
}
if(temp == 6)
{
for(i=0;i<6;i++)
sed_desEthAddr[i]=arp->source_hwaddr[i];
for(i=0;i<4;i++)
sed_desIPAddr[i]=arp->source_ipaddr[i];
arp_send(sed_desEthAddr, sed_desIPAddr, ARP_RESPONSE);
}
else
{
temp=0;
for(i=0;i<4;i++)
{
if((arp->dest_ipaddr[i]) == sed_lclIPAddr[i])
temp++;
}
if(temp!=0)
return 0;
for(i=0;i<6;i++)
sed_desEthAddr[i]=arp->source_hwaddr[i];
arp_send(sed_desEthAddr, sed_desIPAddr, ARP_RESPONSE);
return 1;
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -