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

📄 arp.c

📁 这是利用AVR的ATmega162单片机
💻 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 + -