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