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

📄 arp.c

📁 DSP2407控制8019芯片实现的网页服务器
💻 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 + -