📄 etherif.lst.svn-base
字号:
C51 COMPILER V7.06 ETHERIF 07/24/2007 16:32:45 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE ETHERIF
OBJECT MODULE PLACED IN E:\NETBRO~1\TRUNK\NETBRO~1\VW\ETHERIF.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE E:\NETBRO~1\TRUNK\NETBRO~1\VW\ETHERIF.C DB SB OE
stmt level source
1 /*
2 */
3
4 #include "GloblDef.h"
5 #include "TCPIPmem.h"
6 #include "IP.h"
7 #include "etherif.h"
8 #include "ARP.h"
9 #include "Netif.h"
10
11
12 /* call output to put a packet from IP layer to device. After
13 Ip layer selected a device, it use output to send this packet.
14 MemHead contain a packet and Netif tell dirver which netif it
15 is. NOTE:MemHead->pStart point to pIPHead
16 return:
17 TRUE: send successfuly.*/
18 unsigned char EtherOutput(struct SMemHead xdata *MemHead,struct SNetIf xdata* NetIf,
19 IP_ADDR DestIP) reentrant
20 {
21 1 unsigned short NextIP; /* next host to receive the packet in rout */
22 1 struct SEtherHead xdata * pEtherHead;
23 1 struct SMemHead xdata *p;
24 1
25 1 pEtherHead = (struct SEtherHead xdata *)(MemHead->pStart - sizeof(struct SEtherHead));
26 1
27 1 /* if DestIP in this subnet ... */
28 1 if((NetIf->NetMask & NetIf->IPAddr) == (NetIf->NetMask & DestIP))
29 1 NextIP = DestIP;
30 1 else
31 1 NextIP = NetIf->GateWay;
32 1
33 1 /* find Ether addr of NextIP */
34 1 if(ARPFind(pEtherHead->DestAddr,NextIP) == FALSE)
35 1 {
36 2 /* send a arp query */
37 2 if((p = ARPQuery(NetIf,NextIP)) != NULL)
38 2 {
39 3 ((struct SEtherDevice xdata *)(NetIf->Info))->send(
40 3 p->pStart,sizeof(struct SARPPacket) +
41 3 sizeof(struct SEtherHead));
42 3
43 3 MemFree(p);
44 3 }
45 2 }
46 1 else
47 1 {
48 2 /* fill ehter header, DestAddr already filled in ARPFind */
49 2 MemCopy(pEtherHead->ScrAddr,
50 2 ((struct SEtherDevice xdata *)(NetIf->Info))->Addr,ETHER_ADDR_LEN);
51 2
52 2 pEtherHead->type = htons(ETHER_TYPE_IP);
53 2
54 2 /* send the packet. packet lenth is less than MemHead size */
55 2 return ((struct SEtherDevice xdata *)(NetIf->Info))->send(
C51 COMPILER V7.06 ETHERIF 07/24/2007 16:32:45 PAGE 2
56 2 pEtherHead,(WORD)(MemHead->pEnd - (BYTE xdata *)pEtherHead));
57 2 }
58 1 return FALSE;
59 1 /* free MemHead when it is acked in tcp model */
60 1 }
61
62 /* this function is called periodically.Get a packet from specific
63 device. If there is a packet, call NetIf->Input to do more */
64 void EtherInput(struct SNetIf xdata * NetIf) reentrant
65 {
66 1 struct SMemHead xdata *MemHead;
67 1 struct SEtherHead xdata *pEtherHead;
68 1 struct SMemHead xdata *p;
69 1
70 1 /* if there is a packet to deal with */
71 1 while((MemHead = ((struct SEtherDevice xdata *)(NetIf->Info))->recv())
72 1 != NULL)
73 1 {
74 2 /* Note, pStart point to EtherHead */
75 2 pEtherHead = (struct SEtherHead xdata *)(MemHead->pStart);
76 2
77 2 /* which packet type */
78 2 switch(ntohs(pEtherHead->type))
79 2 {
80 3 case ETHER_TYPE_IP:
81 3 /* before pass to IP layer, let MemHead->pStart point
82 3 to IP header */
83 3 MemHead->pStart += sizeof(struct SEtherHead);
84 3
85 3 /* pass to IP layer for more dealing */
86 3 IPInput(MemHead);
87 3 break;
88 3
89 3 case ETHER_TYPE_ARP:
90 3 if((p = ARPInput(MemHead,NetIf)) != NULL)
91 3 {
92 4 /* a arp reply need to be send */
93 4 ((struct SEtherDevice xdata *)(NetIf->Info))->send(
94 4 p->pStart,sizeof(struct SARPPacket)
95 4 + sizeof(struct SEtherHead));
96 4
97 4 MemFree(p);
98 4 }
99 3 /* 'MemHead' is freed in ARPInput() */
100 3 break;
101 3 default:
102 3
103 3 /* unknown packet type free */
104 3 MemFree(MemHead);
105 3 }
106 2 }
107 1 }
108 /* ethernet device init */
109 void EtherDevInit(struct SEtherDevice xdata * pDevice, BYTE EtherAddr[],
110 unsigned char (DT_CODE * send)(void xdata *buf, WORD size) reentrant,
111 struct SMemHead xdata *(DT_CODE * recv)() reentrant) reentrant
112 {
113 1 MemCopy(pDevice->Addr,EtherAddr,ETHER_ADDR_LEN);
114 1 pDevice->recv = recv;
115 1 pDevice->send = send;
116 1 }
117
C51 COMPILER V7.06 ETHERIF 07/24/2007 16:32:45 PAGE 3
118
119
C51 COMPILER V7.06 ETHERIF 07/24/2007 16:32:45 PAGE 4
NAME CLASS MSPACE TYPE OFFSET SIZE
==== ===== ====== ==== ====== ====
DWORD. . . . . . . . . . . . . . . . . TYPEDEF ----- U_INT ----- 2
_?ARPFind. . . . . . . . . . . . . . . EXTERN CODE PROC ----- -----
SARPPacket . . . . . . . . . . . . . . * TAG * ----- STRUCT ----- 28
HardwareType . . . . . . . . . . . . MEMBER ----- U_INT 0000H 2
ProtocolType . . . . . . . . . . . . MEMBER ----- U_INT 0002H 2
HardWareAddrLen. . . . . . . . . . . MEMBER ----- U_CHAR 0004H 1
ProtocolAddrLen. . . . . . . . . . . MEMBER ----- U_CHAR 0005H 1
type . . . . . . . . . . . . . . . . MEMBER ----- U_INT 0006H 2
EtherScrAddr . . . . . . . . . . . . MEMBER ----- ARRAY 0008H 6
IPScrAddr. . . . . . . . . . . . . . MEMBER ----- U_LONG 000EH 4
EtherDestAddr. . . . . . . . . . . . MEMBER ----- ARRAY 0012H 6
IPDestAddr . . . . . . . . . . . . . MEMBER ----- U_LONG 0018H 4
_?ARPInput . . . . . . . . . . . . . . EXTERN CODE PROC ----- -----
_?ARPQuery . . . . . . . . . . . . . . EXTERN CODE PROC ----- -----
SEtherDevice . . . . . . . . . . . . . * TAG * ----- STRUCT ----- 10
Addr . . . . . . . . . . . . . . . . MEMBER ----- ARRAY 0000H 6
send . . . . . . . . . . . . . . . . MEMBER ----- PTR 0006H 2
recv . . . . . . . . . . . . . . . . MEMBER ----- PTR 0008H 2
SNetIf . . . . . . . . . . . . . . . . * TAG * ----- STRUCT ----- 20
pNext. . . . . . . . . . . . . . . . MEMBER ----- PTR 0000H 2
IPAddr . . . . . . . . . . . . . . . MEMBER ----- U_LONG 0002H 4
NetMask. . . . . . . . . . . . . . . MEMBER ----- U_LONG 0006H 4
GateWay. . . . . . . . . . . . . . . MEMBER ----- U_LONG 000AH 4
input. . . . . . . . . . . . . . . . MEMBER ----- PTR 000EH 2
output . . . . . . . . . . . . . . . MEMBER ----- PTR 0010H 2
Info . . . . . . . . . . . . . . . . MEMBER ----- VOID_PTR 0012H 2
BOOL . . . . . . . . . . . . . . . . . TYPEDEF ----- U_CHAR ----- 1
_?EtherInput . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
NetIf. . . . . . . . . . . . . . . . AUTO IDATA PTR 0006H 2
MemHead. . . . . . . . . . . . . . . AUTO IDATA PTR 0000H 2
pEtherHead . . . . . . . . . . . . . AUTO IDATA PTR 0002H 2
p. . . . . . . . . . . . . . . . . . AUTO IDATA PTR 0004H 2
_?EtherOutput. . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
MemHead. . . . . . . . . . . . . . . AUTO IDATA PTR 0006H 2
NetIf. . . . . . . . . . . . . . . . AUTO IDATA PTR 0008H 2
DestIP . . . . . . . . . . . . . . . AUTO IDATA U_LONG 000AH 4
NextIP . . . . . . . . . . . . . . . AUTO IDATA U_INT 0000H 2
pEtherHead . . . . . . . . . . . . . AUTO IDATA PTR 0002H 2
p. . . . . . . . . . . . . . . . . . AUTO IDATA PTR 0004H 2
BYTE . . . . . . . . . . . . . . . . . TYPEDEF ----- U_CHAR ----- 1
WORD . . . . . . . . . . . . . . . . . TYPEDEF ----- U_INT ----- 2
SEtherHead . . . . . . . . . . . . . . * TAG * ----- STRUCT ----- 14
DestAddr . . . . . . . . . . . . . . MEMBER ----- ARRAY 0000H 6
ScrAddr. . . . . . . . . . . . . . . MEMBER ----- ARRAY 0006H 6
type . . . . . . . . . . . . . . . . MEMBER ----- U_INT 000CH 2
_?MemFree. . . . . . . . . . . . . . . EXTERN CODE PROC ----- -----
_?IPInput. . . . . . . . . . . . . . . EXTERN CODE PROC ----- -----
SARPEntry. . . . . . . . . . . . . . . * TAG * ----- STRUCT ----- 12
IPAddr . . . . . . . . . . . . . . . MEMBER ----- U_LONG 0000H 4
EtherAddr. . . . . . . . . . . . . . MEMBER ----- ARRAY 0004H 6
time . . . . . . . . . . . . . . . . MEMBER ----- U_INT 000AH 2
_?EtherDevInit . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
pDevice. . . . . . . . . . . . . . . AUTO IDATA PTR 0000H 2
EtherAddr. . . . . . . . . . . . . . AUTO IDATA PTR 0002H 3
send . . . . . . . . . . . . . . . . AUTO IDATA PTR 0005H 2
recv . . . . . . . . . . . . . . . . AUTO IDATA PTR 0007H 2
_?MemCopy. . . . . . . . . . . . . . . EXTERN CODE PROC ----- -----
C51 COMPILER V7.06 ETHERIF 07/24/2007 16:32:45 PAGE 5
NAME CLASS MSPACE TYPE OFFSET SIZE
==== ===== ====== ==== ====== ====
SIPHead. . . . . . . . . . . . . . . . * TAG * ----- STRUCT ----- 20
Ver_HeadLen. . . . . . . . . . . . . MEMBER ----- U_CHAR 0000H 1
ServeType. . . . . . . . . . . . . . MEMBER ----- U_CHAR 0001H 1
TotalLen . . . . . . . . . . . . . . MEMBER ----- U_INT 0002H 2
FragmentID . . . . . . . . . . . . . MEMBER ----- U_INT 0004H 2
FragmentFlag_Offset. . . . . . . . . MEMBER ----- U_INT 0006H 2
LifeLength . . . . . . . . . . . . . MEMBER ----- U_CHAR 0008H 1
Protocol . . . . . . . . . . . . . . MEMBER ----- U_CHAR 0009H 1
CheckSum . . . . . . . . . . . . . . MEMBER ----- U_INT 000AH 2
IPScr. . . . . . . . . . . . . . . . MEMBER ----- U_LONG 000CH 4
IPDest . . . . . . . . . . . . . . . MEMBER ----- U_LONG 0010H 4
SMemHead . . . . . . . . . . . . . . . * TAG * ----- STRUCT ----- 9
pNext. . . . . . . . . . . . . . . . MEMBER ----- PTR 0000H 2
pPre . . . . . . . . . . . . . . . . MEMBER ----- PTR 0002H 2
used . . . . . . . . . . . . . . . . MEMBER ----- U_CHAR 0004H 1
pStart . . . . . . . . . . . . . . . MEMBER ----- PTR 0005H 2
pEnd . . . . . . . . . . . . . . . . MEMBER ----- PTR 0007H 2
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1017 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
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 + -