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

📄 udp.lst

📁 RTL8019以太网开发板资料
💻 LST
字号:
C51 COMPILER V8.18   UDP                                                                   08/02/2010 19:52:51 PAGE 1   


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

line level    source

   1          /************************************************************************
   2          FileName:      Udp.c
   3          Description:   Udp protocol process  
   4          Date:          2007 09 21                                                                                 
   5          ************************************************************************/
   6          #include "Main.h"
   7          #include "EEPROM.h"
   8          #include "ip.h"
   9          #include "arp.h"
  10          #include "RTL8019.h"
  11          /************************************************************************/
  12          bit EthernetBuf0DataFlag;                                    // 以太网卡缓冲0已有数据             
  13          bit EthernetLinkFlag;                                    // 以太网是否LINK上
  14          bit EthernetNoDataFlag;                                  // 以太网芯片中没有数据 
  15          
  16          UWORK16 RTL8019asRcvNum;                        // 在缓存中以太网包的个数,16K存满64页,每页256字节 
  17          xdata ST_RECEIVE_ETHERNET gstaRevEthernet;             // 接收以太网包 
  18          xdata ST_ETHERNET_STATISTICS gstEthernetStatistics;    // 以太网卡收发统计
  19          xdata UWORK8 MAC_Remote_buf[ETHER_HEAD_LEN];         // 以太网头(目的MAC,源MAC,协议) 
  20          xdata UWORK8 NetSend_buf[NET_SEND_BUFF];           // 以太网发送缓冲 
  21          xdata UWORK8 gucaSegTemp[SEGMENT_DATA];                // 分片数据 
  22          
  23          
  24          /************************************************************************/
  25          xdata UWORK16 LocalIpID;                                 // 本地IP的ID号 
  26          xdata UWORK16 RevIpID;                              // 接收的ID号 
  27          
  28          bit  gbMoreSegFlag;                                    // 还有更多的分片标志 
  29          bit  gbHaveFragment;                                   // 有分片标志 
  30          /***********************************************************************/
  31          xdata UWORK8 SetupIP_RcvSignal[32];              // 接收前导和标志信号 
  32          xdata UWORK8 SetupIP_SendSignal[32];             // 发送前导和标志信号 
  33          xdata ST_UDP_STATISTICS gstUDPStatistics;              // UDP统计 
  34          /*********************************************************************
  35          函数名:       void UdpReceive(void)
  36          功能:         Udp处理,因为是接收一帧处理一帧,不用返回成功失败
  37          输入:         none 
  38          输出:         处理Udp报文
  39          返回:         None
  40          日期:         2004/12/27
  41          *********************************************************************/
  42          void UdpReceive(void)
  43          {
  44   1          ST_UDP_HEAD_FORMAT *pUdpHead;
  45   1          ST_IP_HEAD_FORMAT *pIpHead;
  46   1          UWORK8 *pucUDPData;
  47   1          UWORK16 usCheckSum,usCheckSumBak;
  48   1          UWORK8 ucTTLBak;
  49   1      
  50   1          if(FALSE == gbHaveFragment)
  51   1          {                             // 没有分片的数据 
  52   2              pUdpHead = (ST_UDP_HEAD_FORMAT *)&gstaRevEthernet.ucaPacket[20];    // 指向udP头 
  53   2              pIpHead  = (ST_IP_HEAD_FORMAT *)&gstaRevEthernet.ucaPacket[0];      // 指向IP头 
  54   2          }
  55   1          else
C51 COMPILER V8.18   UDP                                                                   08/02/2010 19:52:51 PAGE 2   

  56   1          {                             // 分片的数据 
  57   2              pUdpHead = (ST_UDP_HEAD_FORMAT *)&gucaSegTemp[20];                  // 指向udP头 
  58   2              pIpHead  = (ST_IP_HEAD_FORMAT *)&gucaSegTemp[0];                    // 指向IP头 
  59   2          }
  60   1                       // 检验端口号,本地端口号,DHCP端口号,配置端口号 
  61   1          if((pUdpHead->usDesPort != NetParameter.Port_Local) && (CONFIG_PORT != pUdpHead->usDesPort))
  62   1          {
  63   2              //IcmpSend(ICMP_PORT_UNREACHABLE,PORT_UNREACHABLE);                     // 发送端口不可达报文 
  64   2              //gstUDPStatistics.ulUDPPortError++;                                    // 端口号错误统计
  65   2              return;
  66   2          }
  67   1          if(pIpHead->usTotalLen < pUdpHead->usTotalLen)                              // 属于恶意攻击 
  68   1          {
  69   2              return;
  70   2          }
  71   1                     // 发送端没有进行UDP校验和计算,直接送入串口缓冲
  72   1          if((0 == pUdpHead->usCheckSum) && (CONFIG_PORT != pUdpHead->usDesPort))
  73   1          {
  74   2                    // 初始化数据指针 
  75   2              if(FALSE == gbHaveFragment)                                           // 没有分片的数据 
  76   2              {
  77   3                  pucUDPData = &gstaRevEthernet.ucaPacket[28];
  78   3              }
  79   2              else
  80   2              {
  81   3                  pucUDPData = &gucaSegTemp[28];                                      // 分片的数据
  82   3              }
  83   2              
  84   2              SerialSendbuf(pucUDPData,pUdpHead->usTotalLen - 8);
  85   2              gstUDPStatistics.ulUDPReceiveDataNum += (pUdpHead->usTotalLen - 8);     // 统计UDP接收的数据个数
  86   2          }
  87   1          else
  88   1          {                       // 备份数据,以便发远端抑制报文 
  89   2              ucTTLBak = pIpHead->ucTTL;
  90   2              usCheckSumBak = pIpHead->usCheckSum;        
  91   2                                  // 组装UDP伪头 
  92   2              pIpHead->ucTTL = 0;
  93   2              pIpHead->usCheckSum = pUdpHead->usTotalLen;
  94   2                                  // 计算校验和 
  95   2              if(FALSE == gbHaveFragment)
  96   2              {
  97   3                  usCheckSum = CheckSum((UWORK16 *)&gstaRevEthernet.ucaPacket[8],pUdpHead->usTotalLen + 12);    
             -// 12个字节的伪头 
  98   3              }
  99   2              else
 100   2              {
 101   3                  usCheckSum = CheckSum((UWORK16 *)&gucaSegTemp[8],pUdpHead->usTotalLen + 12);                  
             -// 12个字节的伪头 
 102   3              }
 103   2              if(0x0000 == usCheckSum)
 104   2              {
 105   3                  pIpHead->ucTTL = ucTTLBak;                                                    // 可能会发抑制

⌨️ 快捷键说明

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