📄 udp.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 + -