📄 arp.c
字号:
#include "types.h"
#include "ethernet.h"
#include "arp.h"
Arp_cache_struc arp_cache[ARP_CACHE_LENGTH];
Uint8 arp_buf[64];
extern Net_inf_struc net_inf;
//-----------------------------------------------------------------
void arp_init()
{
memset(&arp_cache,0,sizeof(Arp_cache_struc)*ARP_CACHE_LENGTH);
}
Uint8 * get_macaddr( const Uint8* aIP)
{
Uint8 i;
for(i=0;i<ARP_CACHE_LENGTH;i++) {
if( (memcmp(aIP, &(arp_cache[i].ip_addr), INADDR_LEN)==0)
&&arp_cache[i].TTL){
arp_cache[i].TTL=0xffff;
return ( Uint16*)&(arp_cache[i].mac_addr);
}
}
return NULL;
}
void add_macaddr( const Uint8* aIP,const Uint8*pMac)
{
Uint8 i,j,k;
k=0xff;
for(i=0;i<ARP_CACHE_LENGTH;i++) {
if( memcmp(aIP, arp_cache[i].ip_addr, INADDR_LEN)==0){
arp_cache[i].TTL=0xff;
memcpy(arp_cache[i].mac_addr ,pMac,ETHER_ADDR_LEN);
return ;
}
else{
if(k>arp_cache[i].TTL){
k = arp_cache[i].TTL;
j=i;
}
}
}
arp_cache[j].TTL=0xff;
memcpy(arp_cache[j].mac_addr ,pMac,ETHER_ADDR_LEN);
memcpy(arp_cache[j].ip_addr ,aIP,INADDR_LEN);
return;
}
//-----------------------------------------------------------------
// ARP packet generation
Bool arp_send(Uint16 aOperation, const Uint8* aDestMAC, const Uint8* aDestIP)
{
Ether_header_struc* ethHdr;
Ether_arp_struc* arpPkt;
ethHdr = ( Ether_header_struc*)arp_buf;
arpPkt = ( Ether_arp_struc*) (arp_buf + sizeof(Ether_header_struc));
// build MAC header
memcpy(ethHdr->ether_dhost, aDestMAC, ETHER_ADDR_LEN);
memcpy(ethHdr->ether_shost, net_inf.mac, ETHER_ADDR_LEN);
ethHdr->ether_type = ETHERTYPE_ARP;
// build ARP packet header
arpPkt->ea_hdr.ar_hrd = ARPHRD_ETHER;
arpPkt->ea_hdr.ar_pro = ETHERTYPE_IP;
arpPkt->ea_hdr.ar_hln = ETHER_ADDR_LEN<<1;
arpPkt->ea_hdr.ar_pln = INADDR_LEN<<1;
arpPkt->ea_hdr.ar_op = aOperation;
memcpy(arpPkt->arp_sha, net_inf.mac, ETHER_ADDR_LEN);
memcpy(arpPkt->arp_tha, aDestMAC, ETHER_ADDR_LEN);
memcpy(arpPkt->arp_spa, net_inf.ip_local, INADDR_LEN);
memcpy(arpPkt->arp_tpa, aDestIP, INADDR_LEN);
ethernet_send(arp_buf,64);
return TRUE;
}
//-----------------------------------------------------------------
// ARP packet receive & action
Bool arp_receive(Uint8 *pbuf)
{
const Ether_arp_struc* arpPkt;
arpPkt = ( Ether_arp_struc*) (pbuf + sizeof(Ether_header_struc));
if ((arpPkt->ea_hdr.ar_hrd == ARPHRD_ETHER)
&& (arpPkt->ea_hdr.ar_pro == ETHERTYPE_IP)){
if (!memcmp(net_inf.ip_local, arpPkt->arp_tpa, INADDR_LEN)){
add_macaddr(arpPkt->arp_spa,arpPkt->arp_sha);
}
if(arpPkt->ea_hdr.ar_op==ARPOP_REQUEST){
arp_send(ARPOP_REPLY, arpPkt->arp_sha, arpPkt->arp_spa);
}
return TRUE;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -