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