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

📄 arp.lst

📁 RTL8019以太网开发板资料
💻 LST
字号:
C51 COMPILER V8.18   ARP                                                                   04/26/2010 19:37:30 PAGE 1   


C51 COMPILER V8.18, COMPILATION OF MODULE ARP
OBJECT MODULE PLACED IN ARP.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ARP.C LARGE BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include "main.h"
   2          #include "ARP.h"
   3          #include "ip.h"
   4          
   5          
   6          /*************************************************************************************/
   7          bit  ARPFinishFlag;                                    // ARP完成标志
   8          bit  IPConflitTestFlag;                                  // IP冲突测试 
   9          bit  IPOrMacConfiltFlag;                             // IP,MAC冲突标志 
  10          bit  StartConfiltLedFlag;                                // 冲突时启动快闪 
  11          /************************************************************************/
  12          xdata ST_ARP_FORMAT ArpRequestFormat;                     // ARP帧请求格式
  13          xdata ST_ARP_FORMAT ArpAnswerFormat;                         // ARP应答格式 
  14          xdata ST_ARP_CACHE  ArpCache_Buf[REMOTE_IP_NUM];       // ARP高速缓存 
  15          UWORK8 IpModeNum;                                  // 在不同模式下IP数据不一样 
  16          UWORK8 ArpCachePoniter;                        // ARP高速缓存指针 
  17          xdata UWORK8 gucARPOddNum;                             // 老化后,ARP完不成的次数 
  18          xdata UWORK8 ArpPhases;                              //ARP阶段    
  19          
  20          /*********************************************************************
  21          函数名:       void ArpProcess(void)
  22          功能:         ARP应答,因为是接收一帧处理一帧,不用返回成功失败
  23          输入:         接收的帧是ARP帧 
  24          输出:         回应ARP查询
  25          返回:         None
  26          日期:         2004/12/11
  27          *********************************************************************/
  28          void ArpProcess(void)
  29          {
  30   1          xdata ST_ARP_FORMAT *pArpRcv;
  31   1          UWORK8 ucLoop;
  32   1      
  33   1          pArpRcv = (ST_ARP_FORMAT *)&gstaRevEthernet.ucaPacket[0];              // 指向ARP数据包内容           
             -                                                         
  34   1          if((HTYPE == pArpRcv->usHTYPE) && (PTYPE == pArpRcv->usPTYPE)          // 验证是否是以太网ARP 
  35   1              &&(HLEN == pArpRcv->ucHLEN) && (PLEN == pArpRcv->ucPLEN))
  36   1           {
  37   2             if((0 == memcmp(&pArpRcv->ucaSHA[0],&NetParameter.MAC_Local_buf[0],MAC_LEN))  //发送端的IP或MAC与本
             -地IP或MAC相同则表示有冲突 
  38   2                 || (0 == memcmp(&pArpRcv->ucaSPA[0],&IPLocalAddress_buf[0],IP_LEN)))
  39   2               {
  40   3                  IPOrMacConfiltFlag = TRUE;
  41   3                  ARPFinishFlag = FALSE;                                       // 清ARP完成标志
  42   3                  StopArpCounter();                                              // 检测到冲突,停止ARP相关计数器
             - 
  43   3                  StartTimer(12,400);                                            // 4秒种后再次检测 
  44   3               }                                  
  45   2             switch(pArpRcv->usOPER)
  46   2              {
  47   3                  case OPER_REQUEST:                                             // 收到ARP请求帧 
  48   3                      memcpy(&ArpAnswerFormat.ucaTHA[0],&pArpRcv->ucaSHA[0],MAC_LEN);  // ARP应答
  49   3                      memcpy(&ArpAnswerFormat.ucaTPA[0],&pArpRcv->ucaSPA[0],IP_LEN);
  50   3                      memcpy(&ArpAnswerFormat.ucaSPA[0],&IPLocalAddress_buf[0],IP_LEN);
  51   3                      memcpy(&NetSend_buf[0],&ArpAnswerFormat,sizeof(ArpAnswerFormat));
  52   3                      memcpy(&MAC_Remote_buf[0],&pArpRcv->ucaSHA[0],MAC_LEN);
C51 COMPILER V8.18   ARP                                                                   04/26/2010 19:37:30 PAGE 2   

  53   3                      MAC_Remote_buf[12] = 0x08;
  54   3                      MAC_Remote_buf[13] = 0x06;
  55   3                      SendEthernetPacket(28);
  56   3                      break;
  57   3      
  58   3                  case OPER_APLY:                                                // 收到ARP应答帧  
  59   3                                      
  60   3                     for(ucLoop = 0; ucLoop < IpModeNum; ucLoop++)
  61   3                      {
  62   4                        if(0 == memcmp(&ArpCache_Buf[ucLoop].ucaArpIp[0],&pArpRcv->ucaSPA[0],IP_LEN))
  63   4                         {
  64   5                              memcpy(&ArpCache_Buf[ucLoop].ucaMAC[0],&pArpRcv->ucaSHA[0],MAC_LEN);              
             -         
  65   5                              ARPFinishFlag = TRUE;                           // 置ARP完成标志
  66   5                              if('r' != ArpCache_Buf[ucLoop].ucStatus)
  67   5                              {
  68   6                                  ArpCache_Buf[ucLoop].ucStatus = 'r';           
  69   6                              }
  70   5                              else             // 此时应该是老化阶段,停止了定时器6,需要打开定时器4来启动定时器7 
  71   5                               {
  72   6                                  StopTimer(6);
  73   6                                  gucARPOddNum = 0;                              // 有了回应,老化计数器清零 
  74   6                                  StartTimer(4,10);                              // 定时器4来启动定时器7 
  75   6                               }
  76   5                              break;                      
  77   5                         }
  78   4                      }
  79   3                      break;
  80   3      
  81   3                  default:
  82   3                      
  83   3                      break;
  84   3              }
  85   2           }
  86   1      }
  87          
  88          /*********************************************************************
  89          函数名:       void ArpStartRequest(UWORK8 *pucaIP)
  90          功能:         ARP请求
  91          输入:         ARP请求需要 
  92          输出:         组ARP请求包
  93          返回:         None
  94          日期:         2004/12/19
  95          修改:         2006/6/01
  96          *********************************************************************/
  97          void ArpStartRequest(UWORK8 *pucaIP)
  98          {                                                                // 以太网头     
  99   1          memset(&MAC_Remote_buf[0],0xff,MAC_LEN);                   // 发广播包 
 100   1          MAC_Remote_buf[12] = 0x08;
 101   1          MAC_Remote_buf[13] = 0x06;
 102   1                ArpRequestFormat.usOPER  = OPER_REQUEST;                        // ARP请求 
 103   1                memcpy(&ArpRequestFormat.ucaTPA[0],pucaIP,IP_LEN);              // 目的IP 
 104   1          
 105   1          memcpy(&ArpRequestFormat.ucaSPA[0],&IPLocalAddress_buf[0],IP_LEN);   // 源IP    
 106   1          memcpy(&NetSend_buf[0],&ArpRequestFormat,sizeof(ArpRequestFormat));
 107   1          SendEthernetPacket(28);
 108   1      
 109   1          if(IPConflitTestFlag)                                          // IP冲突测试 
 110   1          {
 111   2              StartTimer(5,501);                                       // 启动IP冲突超时 
 112   2          }
 113   1      }
C51 COMPILER V8.18   ARP                                                                   04/26/2010 19:37:30 PAGE 3   

 114          /*********************************************************************
 115          函数名:       void StopArpCounter(void)
 116          功能:         停止ARP相关的计数器
 117          输入:         检测到了IP或MAC冲突 
 118          输出:         停止ARP
 119          返回:         None
 120          日期:         2006/06/22
 121          *********************************************************************/
 122          void StopArpCounter(void)
 123          {
 124   1          StopTimer(5);
 125   1          StopTimer(6);
 126   1          StopTimer(7);
 127   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    664    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     79       7
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      4    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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