📄 arp.lst
字号:
C51 COMPILER V7.06 ARP 09/26/2008 13:35:58 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE ARP
OBJECT MODULE PLACED IN ..\OUT\ARP.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\Source\ARP.C BROWSE DEBUG OBJECTEXTEND PRINT(..\OUT\ARP.lst) OBJECT(..\O
-UT\ARP.obj)
stmt level source
1 /*
2 *****************************************************************************************************
3 *
4 * File name: arp.c
5 *****************************************************************************************************
6 */
7 #include "..\head\includes.h"
8
9
10 #define MaxLenARPtable 10 //ARP表长度
11
12 xdata union arp_table_type arp_tab[MaxLenARPtable]; //ARP表,存在外部RAM区里
13 unsigned char index=0; //ARP table 循环加入点
14
15 /*
16 *****************************************************************************************************
17 *FUNC: 向指定的IP地址发送一个ARP请求
18 *NOTE:
19 *****************************************************************************************************
20 */
21 void ArpRequest(union IP_address ip_address)//ARP请求
22 {
23 1 unsigned char i;
24 1
25 1 txdnet.etherframe.protocal=0x0806; //arp protocal
26 1
27 1 for (i=0; i<3; i++) { //复制对方网卡地址或网关地址
28 2 txdnet.etherframe.uDestID[i] = 0xffff; //IP广播地址
29 2 txdnet.etherframe.uSourceID[i] = my_ethernet_address.words[i]; //指定以太网数据包首部中的源MAC地址
30 2 txdnet.arpframe.sourcenodeid[i] = my_ethernet_address.words[i];
31 2 txdnet.arpframe.destnodeid[i] = 0x0000; //此时目的MAC未知,填0
32 2 }
33 1
34 1 for (i=0;i<2;i++) {
35 2 txdnet.arpframe.sourceip[i] = my_ip_address.words[i]; //我的IP
36 2 }
37 1 txdnet.arpframe.destip[0]=ip_address.words[0]; //目标IP
38 1 txdnet.arpframe.destip[1]=ip_address.words[1];
39 1 txdnet.arpframe.harewaretype=0x0001; //1即表示以太网地址
40 1 txdnet.arpframe.protocaltype=0x0800;
41 1 txdnet.arpframe.halength=0x06;
42 1 txdnet.arpframe.palength=0x04;
43 1 txdnet.arpframe.operation=0x0001; //ARP请求
44 1 for(i=0x2E; i<(0x2E+18); i++) { //不足60补0
45 2 txdnet.bytes.bytebuf[i]=0x00;
46 2 }
47 1 send_packet(&txdnet,60);
48 1 }
49
50 /*
51 *****************************************************************************************************
52 *FUNC: 收到一个ARP应答后,对ARP表进行处理
53 *NOTE: void ArpRequest(union IP_address ip_address)//ARP请求的应答处理
54 *****************************************************************************************************
C51 COMPILER V7.06 ARP 09/26/2008 13:35:58 PAGE 2
55 */
56 void ArpEcho(void) //ARP应答处理
57 {
58 1 unsigned char i,j;
59 1 unsigned char processed=FALSE;
60 1
61 1 //其中的状态字段表示该ARP记录是否已经被占用.1表示占用,0表示未占用
62 1 //当状态为1时,需要对表进行搜索,对表进行更新.显然,当收到一个新的ARP
63 1 //包后,首先需要处理的是该ARP记录是否在表中,如果是,则进行更新;否则添
64 1 //加该记录
65 1
66 1 //对表进行搜索,确定是否需要更新
67 1 for (i=0; i<MaxLenARPtable; i++) {
68 2 if (arp_tab[i].arp.status == 1) {
69 3 if ((arp_tab[i].arp.ip_address.words[0] == rxdnet.arpframe.sourceip[0])
70 3 && (arp_tab[i].arp.ip_address.words[1]==rxdnet.arpframe.sourceip[1])) //判断该记录是否已存在
71 3 {
72 4 arp_tab[i].arp.ttl = 0x80; //已存在,就更新它
73 4 for (j=0; j<2; j++) {
74 5 arp_tab[i].arp.ip_address.words[j]=rxdnet.arpframe.sourceip[j];
75 5 }
76 4 for (j=0; j<3; j++) {
77 5 arp_tab[i].arp.ethernet_address.words[j]=rxdnet.arpframe.sourcenodeid[j];
78 5 }
79 4 processed=TRUE; //已处理更新标志
80 4 break;
81 4 }
82 3 }
83 2 }
84 1
85 1 if (!processed) { //未处理
86 2 for (i=0; i<MaxLenARPtable; i++) { //添加一条记录
87 3 if (arp_tab[i].arp.status == 0) {
88 4 arp_tab[i].arp.status = 1;
89 4 arp_tab[i].arp.ttl = 0x80;
90 4 for (j=0; j<2; j++) {
91 5 arp_tab[i].arp.ip_address.words[j]=rxdnet.arpframe.sourceip[j];
92 5 }
93 4 for(j=0; j<3; j++) {
94 5 arp_tab[i].arp.ethernet_address.words[j]=rxdnet.arpframe.sourcenodeid[j];
95 5 }
96 4 processed=TRUE; //已添加标志
97 4 break;
98 4 }
99 3 }
100 2 }
101 1
102 1 if (!processed) { //未更新,未添加,说明表满
103 2 arp_tab[index].arp.status = 1; //表满处理.其中index为全局变量,循环更新ARP表
104 2 arp_tab[index].arp.ttl = 0x80;
105 2 for (j=0; j<2; j++) {
106 3 arp_tab[index].arp.ip_address.words[j]=rxdnet.arpframe.sourceip[j];
107 3 }
108 2 for (j=0; j<3; j++) {
109 3 arp_tab[index].arp.ethernet_address.words[j]=rxdnet.arpframe.sourcenodeid[j];
110 3 }
111 2 if (++index == MaxLenARPtable) {
112 3 index = 0;
113 3 }
114 2 }
115 1
116 1 if ((arpwait.wait_arp == TRUE) && (arpwait.ipaddr.words[0] == rxdnet.arpframe.sourceip[0])
C51 COMPILER V7.06 ARP 09/26/2008 13:35:58 PAGE 3
117 1 && (arpwait.ipaddr.words[1] == rxdnet.arpframe.sourceip[1])) { //有数据在等待ARP,发送
118 2 arpwait.wait_arp = FALSE;
119 2 ip_send(arpwait.buf, arpwait.ipaddr, arpwait.proto_id, arpwait.len);
120 2 }
121 1 }
122
123 /*
124 *****************************************************************************************************
125 *FUNC: 对ARP请求进行应答
126 *NOTE:
127 *****************************************************************************************************
128 */
129 void ArpAnswer(void)
130 {
131 1 unsigned char i;
132 1
133 1 if (rxdnet.arpframe.destip[0]==my_ip_address.words[0])
134 1 if (rxdnet.arpframe.destip[1]==my_ip_address.words[1]) { //表示是向我这个ip地址的请求
135 2 for (i=16; i<64; i++) { //复制arp到发送缓冲区
136 3 txdnet.bytes.bytebuf[i]=rxdnet.bytes.bytebuf[i];
137 3 }
138 2 for (i=0; i<3; i++) { //复制对方网卡地址或网关地址
139 3 txdnet.etherframe.uDestID[i] = rxdnet.etherframe.uSourceID[i];
140 3 txdnet.etherframe.uSourceID[i]=my_ethernet_address.words[i]; //指定以太网数据包首部中的源MAC地址
141 3 txdnet.arpframe.sourcenodeid[i]=my_ethernet_address.words[i];
142 3 txdnet.arpframe.destnodeid[i]=rxdnet.arpframe.sourcenodeid[i];
143 3 }
144 2
145 2 for (i=0; i<2; i++) {
146 3 txdnet.arpframe.destip[i] = rxdnet.arpframe.sourceip[i];
147 3 txdnet.arpframe.sourceip[i] = rxdnet.arpframe.destip[i];
148 3 }
149 2
150 2 txdnet.arpframe.operation=0x0002; //ARP响应代码
151 2 send_packet(&txdnet,60);
152 2 }
153 1 }
154 /*
155 *****************************************************************************************************
156 *FUNC: 初始化ARP缓存
157 *NOTE:
158 *****************************************************************************************************
159 */
160 void InitArpTable(void)
161 {
162 1 unsigned char i,j;
163 1
164 1 for (i=0; i<MaxLenARPtable; i++) {
165 2 arp_tab[i].arp.status=0;
166 2 arp_tab[i].arp.ttl=0;
167 2 for (j=0; j<4; j++) {
168 3 arp_tab[i].arp.ip_address.bytes[j]=0;
169 3 }
170 2 for (j=0; j<6; j++) {
171 3 arp_tab[i].arp.ethernet_address.bytes[j]=0;
172 3 }
173 2 }
174 1 }
175
176
177 /*
178 *****************************************************************************************************
C51 COMPILER V7.06 ARP 09/26/2008 13:35:58 PAGE 4
179 *FUNC: 更新ARP缓存
180 *NOTE: 每1s调用一次
181 *****************************************************************************************************
182 */
183 void UpdateArpTab()
184 {
185 1 unsigned char i;
186 1
187 1 for (i=0; i<MaxLenARPtable; i++) {
188 2 if (arp_tab[i].arp.status == 1) {
189 3 if (arp_tab[i].arp.ttl > 0) { //生存时间
190 4 arp_tab[i].arp.ttl--;
191 4 } else {
192 4 arp_tab[i].arp.status=0;
193 4 }
194 3 }
195 2 }
196 1 }
197
198
199 /*
200 *****************************************************************************************************
201 *FUNC:在ARP缓存中查找指定IP/MAC映射对
202 *NOTE: 入参: 指定的IP地址,返回MAC地址的指针
203 返回值: bit类型.如果找到,则返回1;找不到则返回0.
204 *****************************************************************************************************
205 */
206 bit FindMac(union IP_address ip,union Ethernet_address xdata *macadr)
207 {
208 1 unsigned char i,j;
209 1
210 1 for (i=0; i<MaxLenARPtable; i++){
211 2 if (arp_tab[i].arp.status == 1) {
212 3 if(arp_tab[i].arp.ip_address.dwords == ip.dwords){
213 4 for(j=0; j<3; j++) {
214 5 macadr->words[j]=arp_tab[i].arp.ethernet_address.words[j];
215 5 }
216 4 return 1;
217 4 }
218 3 }
219 2 }
220 1 return 0;
221 1 }
222
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1636 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 120 ----
PDATA SIZE = ---- ----
DATA SIZE = 1 15
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -