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

📄 arp.lst

📁 本程序是一个RS232转网口的。是一个透明传输的模块
💻 LST
字号:
C51 COMPILER V7.06   ARP                                                                   09/26/2008 13:35:58 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE ARP
OBJECT MODULE PLACED IN ..\OUT\ARP.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\Source\ARP.C BROWSE DEBUG OBJECTEXTEND PRINT(..\OUT\ARP.lst) OBJECT(..\O
                    -UT\ARP.obj)

stmt level    source

   1          /*
   2          *****************************************************************************************************
   3          *
   4          *  File name: arp.c
   5          *****************************************************************************************************
   6          */
   7          #include "..\head\includes.h"
   8          
   9          
  10          #define MaxLenARPtable  10                                         //ARP表长度
  11          
  12          xdata union arp_table_type arp_tab[MaxLenARPtable];        //ARP表,存在外部RAM区里
  13          unsigned char index=0;                                                             //ARP table 循环加入点
  14          
  15          /*
  16          *****************************************************************************************************
  17          *FUNC: 向指定的IP地址发送一个ARP请求
  18          *NOTE: 
  19          *****************************************************************************************************
  20          */
  21          void ArpRequest(union IP_address ip_address)//ARP请求
  22          {
  23   1              unsigned char i;
  24   1      
  25   1              txdnet.etherframe.protocal=0x0806;                                   //arp protocal
  26   1      
  27   1              for (i=0; i<3; i++) {                                                //复制对方网卡地址或网关地址
  28   2                      txdnet.etherframe.uDestID[i]    = 0xffff;                        //IP广播地址
  29   2                      txdnet.etherframe.uSourceID[i]  = my_ethernet_address.words[i];  //指定以太网数据包首部中的源MAC地址
  30   2                      txdnet.arpframe.sourcenodeid[i] = my_ethernet_address.words[i];
  31   2                      txdnet.arpframe.destnodeid[i]   = 0x0000;                        //此时目的MAC未知,填0
  32   2          }
  33   1      
  34   1              for (i=0;i<2;i++) {
  35   2                      txdnet.arpframe.sourceip[i] = my_ip_address.words[i];   //我的IP
  36   2              }
  37   1          txdnet.arpframe.destip[0]=ip_address.words[0];              //目标IP
  38   1          txdnet.arpframe.destip[1]=ip_address.words[1];
  39   1              txdnet.arpframe.harewaretype=0x0001;                        //1即表示以太网地址
  40   1              txdnet.arpframe.protocaltype=0x0800;
  41   1              txdnet.arpframe.halength=0x06;
  42   1              txdnet.arpframe.palength=0x04;
  43   1              txdnet.arpframe.operation=0x0001;                           //ARP请求 
  44   1              for(i=0x2E; i<(0x2E+18); i++) {                             //不足60补0                       
  45   2                      txdnet.bytes.bytebuf[i]=0x00;
  46   2              }
  47   1              send_packet(&txdnet,60);
  48   1      }
  49          
  50          /*
  51          *****************************************************************************************************
  52          *FUNC: 收到一个ARP应答后,对ARP表进行处理
  53          *NOTE: void ArpRequest(union IP_address ip_address)//ARP请求的应答处理
  54          *****************************************************************************************************
C51 COMPILER V7.06   ARP                                                                   09/26/2008 13:35:58 PAGE 2   

  55          */
  56          void ArpEcho(void)                        //ARP应答处理
  57          {
  58   1              unsigned char i,j;
  59   1              unsigned char processed=FALSE;
  60   1      
  61   1              //其中的状态字段表示该ARP记录是否已经被占用.1表示占用,0表示未占用
  62   1              //当状态为1时,需要对表进行搜索,对表进行更新.显然,当收到一个新的ARP
  63   1              //包后,首先需要处理的是该ARP记录是否在表中,如果是,则进行更新;否则添
  64   1              //加该记录
  65   1      
  66   1              //对表进行搜索,确定是否需要更新
  67   1              for (i=0; i<MaxLenARPtable; i++) {
  68   2                      if (arp_tab[i].arp.status == 1) {
  69   3                              if ((arp_tab[i].arp.ip_address.words[0] == rxdnet.arpframe.sourceip[0])
  70   3                                  && (arp_tab[i].arp.ip_address.words[1]==rxdnet.arpframe.sourceip[1])) //判断该记录是否已存在
  71   3                              {
  72   4                                              arp_tab[i].arp.ttl = 0x80;                                        //已存在,就更新它
  73   4                                              for (j=0; j<2; j++) {
  74   5                                                      arp_tab[i].arp.ip_address.words[j]=rxdnet.arpframe.sourceip[j];
  75   5                                              }
  76   4                                              for (j=0; j<3; j++) {
  77   5                                                      arp_tab[i].arp.ethernet_address.words[j]=rxdnet.arpframe.sourcenodeid[j];
  78   5                                              }
  79   4                                              processed=TRUE;                                                   //已处理更新标志
  80   4                                              break;
  81   4                              }
  82   3                      }
  83   2              }
  84   1      
  85   1              if (!processed) {                               //未处理        
  86   2                      for (i=0; i<MaxLenARPtable; i++) {          //添加一条记录
  87   3                              if (arp_tab[i].arp.status == 0) {
  88   4                                      arp_tab[i].arp.status = 1;
  89   4                                      arp_tab[i].arp.ttl = 0x80;
  90   4                                      for (j=0; j<2; j++) {
  91   5                                              arp_tab[i].arp.ip_address.words[j]=rxdnet.arpframe.sourceip[j];
  92   5                                      }
  93   4                                      for(j=0; j<3; j++) {
  94   5                                              arp_tab[i].arp.ethernet_address.words[j]=rxdnet.arpframe.sourcenodeid[j];
  95   5                                      }
  96   4                                      processed=TRUE;                     //已添加标志
  97   4                                      break;
  98   4                              }
  99   3                      }
 100   2              }
 101   1      
 102   1              if (!processed) {                               //未更新,未添加,说明表满
 103   2                      arp_tab[index].arp.status = 1;              //表满处理.其中index为全局变量,循环更新ARP表
 104   2                      arp_tab[index].arp.ttl = 0x80;
 105   2                      for (j=0; j<2; j++) {
 106   3                              arp_tab[index].arp.ip_address.words[j]=rxdnet.arpframe.sourceip[j];
 107   3                      }
 108   2                      for (j=0; j<3; j++) {
 109   3                              arp_tab[index].arp.ethernet_address.words[j]=rxdnet.arpframe.sourcenodeid[j];
 110   3                      }
 111   2                      if (++index == MaxLenARPtable) {
 112   3                      index = 0;
 113   3                      }
 114   2              }
 115   1      
 116   1              if ((arpwait.wait_arp == TRUE) && (arpwait.ipaddr.words[0] == rxdnet.arpframe.sourceip[0]) 
C51 COMPILER V7.06   ARP                                                                   09/26/2008 13:35:58 PAGE 3   

 117   1                 && (arpwait.ipaddr.words[1] == rxdnet.arpframe.sourceip[1])) {  //有数据在等待ARP,发送
 118   2                      arpwait.wait_arp = FALSE;
 119   2                      ip_send(arpwait.buf, arpwait.ipaddr, arpwait.proto_id, arpwait.len);
 120   2              }
 121   1      }
 122          
 123          /*
 124          *****************************************************************************************************
 125          *FUNC: 对ARP请求进行应答
 126          *NOTE: 
 127          *****************************************************************************************************
 128          */
 129          void ArpAnswer(void)
 130          {
 131   1              unsigned char i;
 132   1      
 133   1              if (rxdnet.arpframe.destip[0]==my_ip_address.words[0])
 134   1              if (rxdnet.arpframe.destip[1]==my_ip_address.words[1]) {              //表示是向我这个ip地址的请求
 135   2              for (i=16; i<64; i++) {                                           //复制arp到发送缓冲区
 136   3                      txdnet.bytes.bytebuf[i]=rxdnet.bytes.bytebuf[i];
 137   3                      }
 138   2              for (i=0; i<3; i++) {                                             //复制对方网卡地址或网关地址
 139   3                      txdnet.etherframe.uDestID[i] = rxdnet.etherframe.uSourceID[i];
 140   3                      txdnet.etherframe.uSourceID[i]=my_ethernet_address.words[i];  //指定以太网数据包首部中的源MAC地址
 141   3                      txdnet.arpframe.sourcenodeid[i]=my_ethernet_address.words[i];
 142   3                      txdnet.arpframe.destnodeid[i]=rxdnet.arpframe.sourcenodeid[i];
 143   3              }
 144   2      
 145   2                  for (i=0; i<2; i++) {
 146   3                          txdnet.arpframe.destip[i]   = rxdnet.arpframe.sourceip[i];
 147   3                      txdnet.arpframe.sourceip[i] = rxdnet.arpframe.destip[i];
 148   3                  }
 149   2      
 150   2                      txdnet.arpframe.operation=0x0002;                                 //ARP响应代码
 151   2                  send_packet(&txdnet,60);
 152   2              }
 153   1      }
 154          /*
 155          *****************************************************************************************************
 156          *FUNC: 初始化ARP缓存
 157          *NOTE: 
 158          *****************************************************************************************************
 159          */
 160          void InitArpTable(void)
 161          {
 162   1              unsigned char i,j;
 163   1      
 164   1              for (i=0; i<MaxLenARPtable; i++) {
 165   2                      arp_tab[i].arp.status=0;
 166   2                      arp_tab[i].arp.ttl=0;
 167   2                      for (j=0; j<4; j++) {
 168   3                              arp_tab[i].arp.ip_address.bytes[j]=0;
 169   3                      }
 170   2                      for (j=0; j<6; j++) {
 171   3                              arp_tab[i].arp.ethernet_address.bytes[j]=0;
 172   3                      }
 173   2              }
 174   1      }
 175          
 176          
 177          /*
 178          *****************************************************************************************************
C51 COMPILER V7.06   ARP                                                                   09/26/2008 13:35:58 PAGE 4   

 179          *FUNC: 更新ARP缓存
 180          *NOTE: 每1s调用一次
 181          *****************************************************************************************************
 182          */
 183          void UpdateArpTab()
 184          {
 185   1              unsigned char i;
 186   1      
 187   1              for (i=0; i<MaxLenARPtable; i++) {
 188   2                      if (arp_tab[i].arp.status == 1) {
 189   3                          if (arp_tab[i].arp.ttl > 0) {   //生存时间
 190   4                      arp_tab[i].arp.ttl--;
 191   4                              } else {
 192   4                      arp_tab[i].arp.status=0;
 193   4                              }
 194   3              }
 195   2              }
 196   1      }
 197          
 198          
 199          /*
 200          *****************************************************************************************************
 201          *FUNC:在ARP缓存中查找指定IP/MAC映射对
 202          *NOTE: 入参:   指定的IP地址,返回MAC地址的指针
 203                返回值:  bit类型.如果找到,则返回1;找不到则返回0.
 204          *****************************************************************************************************
 205          */
 206          bit FindMac(union IP_address ip,union Ethernet_address xdata *macadr)
 207          {
 208   1              unsigned char i,j;
 209   1      
 210   1              for (i=0; i<MaxLenARPtable; i++){
 211   2                      if (arp_tab[i].arp.status == 1) {
 212   3                              if(arp_tab[i].arp.ip_address.dwords == ip.dwords){
 213   4                                      for(j=0; j<3; j++) {
 214   5                                              macadr->words[j]=arp_tab[i].arp.ethernet_address.words[j];
 215   5                                      }
 216   4                                      return 1;
 217   4                          }
 218   3                      }
 219   2              }
 220   1              return 0;
 221   1      }
 222          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1636    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =    120    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1      15
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -