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

📄 arp.c

📁 mc51单片机对rtl8019编程,实现ethernet的收发控制.
💻 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 + -