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

📄 udp.lst

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

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

⌨️ 快捷键说明

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