📄 arp.lst
字号:
C51 COMPILER V6.23a ARP 05/11/2004 18:03:27 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE ARP
OBJECT MODULE PLACED IN arp.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE arp.c LARGE ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2 #include "types.h"
3 #include "ethernet.h"
4 #include "arp.h"
5
6 Arp_cache_struc arp_cache[ARP_CACHE_LENGTH];
7 Uint8 arp_buf[64];
8 extern Net_inf_struc net_inf;
9
10 //-----------------------------------------------------------------
11 void arp_init()
12 {
13 1 memset(&arp_cache,0,sizeof(Arp_cache_struc)*ARP_CACHE_LENGTH);
14 1 }
15
16 Uint8 * get_macaddr( const Uint8* aIP)
17 {
18 1 Uint8 i;
19 1 for(i=0;i<ARP_CACHE_LENGTH;i++) {
20 2 if( (memcmp(aIP, &(arp_cache[i].ip_addr), INADDR_LEN)==0)
21 2 &&arp_cache[i].TTL){
22 3 arp_cache[i].TTL=0xffff;
23 3 return ( Uint16*)&(arp_cache[i].mac_addr);
24 3 }
25 2 }
26 1 return NULL;
27 1 }
28 void add_macaddr( const Uint8* aIP,const Uint8*pMac)
29 {
30 1 Uint8 i,j,k;
31 1 k=0xff;
32 1 for(i=0;i<ARP_CACHE_LENGTH;i++) {
33 2 if( memcmp(aIP, arp_cache[i].ip_addr, INADDR_LEN)==0){
34 3 arp_cache[i].TTL=0xff;
35 3 memcpy(arp_cache[i].mac_addr ,pMac,ETHER_ADDR_LEN);
36 3 return ;
37 3 }
38 2 else{
39 3 if(k>arp_cache[i].TTL){
40 4 k = arp_cache[i].TTL;
41 4 j=i;
42 4 }
43 3 }
44 2 }
45 1 arp_cache[j].TTL=0xff;
46 1 memcpy(arp_cache[j].mac_addr ,pMac,ETHER_ADDR_LEN);
47 1 memcpy(arp_cache[j].ip_addr ,aIP,INADDR_LEN);
48 1 return;
49 1 }
50 //-----------------------------------------------------------------
51 // ARP packet generation
52 Bool arp_send(Uint16 aOperation, const Uint8* aDestMAC, const Uint8* aDestIP)
53 {
54 1 Ether_header_struc* ethHdr;
55 1 Ether_arp_struc* arpPkt;
C51 COMPILER V6.23a ARP 05/11/2004 18:03:27 PAGE 2
56 1
57 1 ethHdr = ( Ether_header_struc*)arp_buf;
58 1 arpPkt = ( Ether_arp_struc*) (arp_buf + sizeof(Ether_header_struc));
59 1 // build MAC header
60 1 memcpy(ethHdr->ether_dhost, aDestMAC, ETHER_ADDR_LEN);
61 1 memcpy(ethHdr->ether_shost, net_inf.mac, ETHER_ADDR_LEN);
62 1 ethHdr->ether_type = ETHERTYPE_ARP;
63 1 // build ARP packet header
64 1 arpPkt->ea_hdr.ar_hrd = ARPHRD_ETHER;
65 1 arpPkt->ea_hdr.ar_pro = ETHERTYPE_IP;
66 1 arpPkt->ea_hdr.ar_hln = ETHER_ADDR_LEN<<1;
67 1 arpPkt->ea_hdr.ar_pln = INADDR_LEN<<1;
68 1 arpPkt->ea_hdr.ar_op = aOperation;
69 1 memcpy(arpPkt->arp_sha, net_inf.mac, ETHER_ADDR_LEN);
70 1 memcpy(arpPkt->arp_tha, aDestMAC, ETHER_ADDR_LEN);
71 1 memcpy(arpPkt->arp_spa, net_inf.ip_local, INADDR_LEN);
72 1 memcpy(arpPkt->arp_tpa, aDestIP, INADDR_LEN);
73 1 ethernet_send(arp_buf,64);
74 1 return TRUE;
75 1 }
76
77 //-----------------------------------------------------------------
78 // ARP packet receive & action
79 Bool arp_receive(Uint8 *pbuf)
80 {
81 1 const Ether_arp_struc* arpPkt;
82 1 arpPkt = ( Ether_arp_struc*) (pbuf + sizeof(Ether_header_struc));
83 1 if ((arpPkt->ea_hdr.ar_hrd == ARPHRD_ETHER)
84 1 && (arpPkt->ea_hdr.ar_pro == ETHERTYPE_IP)){
85 2 if (!memcmp(net_inf.ip_local, arpPkt->arp_tpa, INADDR_LEN)){
86 3 add_macaddr(arpPkt->arp_spa,arpPkt->arp_sha);
87 3 }
88 2 if(arpPkt->ea_hdr.ar_op==ARPOP_REQUEST){
89 3 arp_send(ARPOP_REPLY, arpPkt->arp_sha, arpPkt->arp_spa);
90 3 }
91 2 return TRUE;
92 2 }
93 1 return FALSE;
94 1 }
95
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1014 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 174 30
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
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 + -