/[H8]/trunk/docs/Microchip TCP_IP stack/TCPIP Stack/ARP.c
ViewVC logotype

Annotation of /trunk/docs/Microchip TCP_IP stack/TCPIP Stack/ARP.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 15 - (hide annotations) (download)
Thu Apr 19 09:01:15 2007 UTC (17 years, 2 months ago) by hedin
File MIME type: text/plain
File size: 10761 byte(s)
added the TCP/IP stack, source code.
1 hedin 15 /*********************************************************************
2     *
3     * Address Resolution Protocol (ARP) Client and Server
4     * Module for Microchip TCP/IP Stack
5     * -Provides IP address to Ethernet MAC address translation
6     * -Reference: RFC 826
7     *
8     *********************************************************************
9     * FileName: ARP.c
10     * Dependencies: string.h
11     * StackTsk.h
12     * Helpers.h
13     * ARP.h
14     * MAC.h
15     * Processor: PIC18, PIC24F, PIC24H, dsPIC30F, dsPIC33F
16     * Complier: Microchip C18 v3.02 or higher
17     * Microchip C30 v2.01 or higher
18     * Company: Microchip Technology, Inc.
19     *
20     * Software License Agreement
21     *
22     * Copyright © 2002-2007 Microchip Technology Inc. All rights
23     * reserved.
24     *
25     * Microchip licenses to you the right to use, modify, copy, and
26     * distribute:
27     * (i) the Software when embedded on a Microchip microcontroller or
28     * digital signal controller product (“Device”) which is
29     * integrated into Licensee’s product; or
30     * (ii) ONLY the Software driver source files ENC28J60.c and
31     * ENC28J60.h ported to a non-Microchip device used in
32     * conjunction with a Microchip ethernet controller for the
33     * sole purpose of interfacing with the ethernet controller.
34     *
35     * You should refer to the license agreement accompanying this
36     * Software for additional information regarding your rights and
37     * obligations.
38     *
39     * THE SOFTWARE AND DOCUMENTATION ARE PROVIDED “AS IS” WITHOUT
40     * WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT
41     * LIMITATION, ANY WARRANTY OF MERCHANTABILITY, FITNESS FOR A
42     * PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL
43     * MICROCHIP BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR
44     * CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF
45     * PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS
46     * BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE
47     * THEREOF), ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER
48     * SIMILAR COSTS, WHETHER ASSERTED ON THE BASIS OF CONTRACT, TORT
49     * (INCLUDING NEGLIGENCE), BREACH OF WARRANTY, OR OTHERWISE.
50     *
51     *
52     * Author Date Comment
53     *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
54     * Nilesh Rajbharti 5/1/01 Original (Rev 1.0)
55     * Nilesh Rajbharti 2/9/02 Cleanup
56     * Nilesh Rajbharti 5/22/02 Rev 2.0 (See version.log for detail)
57     * Howard Schlunder 8/17/06 Combined ARP.c and ARPTsk.c into ARP.c;
58     * rewrote some of it to look more linear
59     ********************************************************************/
60     #define __ARP_C
61    
62     #include "TCPIP Stack/TCPIP.h"
63    
64     #if !defined(STACK_USE_SLIP)
65    
66    
67     // ARP Operation codes.
68     #define ARP_OPERATION_REQ 0x01u
69     #define ARP_OPERATION_RESP 0x02u
70    
71     // ETHERNET packet type as defined by IEEE 802.3
72     #define HW_ETHERNET (0x0001u)
73     #define ARP_IP (0x0800u)
74    
75    
76    
77     // This ARP task caches one ARP response.
78     #ifdef STACK_CLIENT_MODE
79     static NODE_INFO Cache;
80     #endif
81    
82    
83     // ARP packet
84     typedef struct _ARP_PACKET
85     {
86     WORD HardwareType;
87     WORD Protocol;
88     BYTE MACAddrLen;
89     BYTE ProtocolLen;
90     WORD Operation;
91     MAC_ADDR SenderMACAddr;
92     IP_ADDR SenderIPAddr;
93     MAC_ADDR TargetMACAddr;
94     IP_ADDR TargetIPAddr;
95     } ARP_PACKET;
96    
97     // Helper function
98     static void SwapARPPacket(ARP_PACKET *p);
99     static BOOL ARPPut(ARP_PACKET *packet);
100    
101    
102    
103     /*********************************************************************
104     * Function: BOOL ARPPut(NODE_INFO* more, BYTE opCode)
105     *
106     * PreCondition: None
107     *
108     * Input: remote - Remote node info
109     * opCode - ARP op code to send
110     *
111     * Output: TRUE - The ARP packet was generated properly
112     * FALSE - Unable to allocate a TX buffer
113     *
114     * Side Effects: None
115     *
116     * Overview: None
117     *
118     * Note: None
119     ********************************************************************/
120     static BOOL ARPPut(ARP_PACKET *packet)
121     {
122     while(!MACIsTxReady());
123     MACSetWritePtr(BASE_TX_ADDR);
124    
125    
126     packet->HardwareType = HW_ETHERNET;
127     packet->Protocol = ARP_IP;
128     packet->MACAddrLen = sizeof(MAC_ADDR);
129     packet->ProtocolLen = sizeof(IP_ADDR);
130     // packet->SenderMACAddr = AppConfig.MyMACAddr; // HI-TECH PICC-18 compiler can't handle this statement, use memcpy() as a workaround
131     memcpy(&packet->SenderMACAddr, (void*)&AppConfig.MyMACAddr, sizeof(packet->SenderMACAddr));
132     packet->SenderIPAddr = AppConfig.MyIPAddr;
133    
134     SwapARPPacket(packet);
135    
136     MACPutHeader(&packet->TargetMACAddr, MAC_ARP, sizeof(*packet));
137     MACPutArray((BYTE*)packet, sizeof(*packet));
138     MACFlush();
139    
140     return TRUE;
141     }
142    
143    
144    
145     /*********************************************************************
146     * Function: void ARPInit(void)
147     *
148     * PreCondition: None
149     *
150     * Input: None
151     *
152     * Output: ARP Cache is initialized.
153     *
154     * Side Effects: None
155     *
156     * Overview: None
157     *
158     * Note: None
159     ********************************************************************/
160     #ifdef STACK_CLIENT_MODE
161     void ARPInit(void)
162     {
163     Cache.MACAddr.v[0] = 0xff;
164     Cache.MACAddr.v[1] = 0xff;
165     Cache.MACAddr.v[2] = 0xff;
166     Cache.MACAddr.v[3] = 0xff;
167     Cache.MACAddr.v[4] = 0xff;
168     Cache.MACAddr.v[5] = 0xff;
169    
170     Cache.IPAddr.Val = 0x0;
171     }
172     #endif
173    
174    
175    
176     /*********************************************************************
177     * Function: BOOL ARPProcess(void)
178     *
179     * PreCondition: ARP packet is ready in MAC buffer.
180     *
181     * Input: None
182     *
183     * Output: TRUE: If all processing of this ARP packet is complete. Do not call ARPProcess() again until a new ARP packet is waiting in the RX buffer.
184     * FALSE: If ARPProcess() must be called more times. We need more time to sent an ARP response
185     *
186     * Side Effects: None
187     *
188     * Overview: None
189     *
190     * Note: None
191     ********************************************************************/
192     BOOL ARPProcess(void)
193     {
194     ARP_PACKET packet;
195     static NODE_INFO Target;
196     static enum
197     {
198     SM_ARP_IDLE,
199     SM_ARP_REPLY
200     } smARP = SM_ARP_IDLE;
201    
202     switch(smARP)
203     {
204     case SM_ARP_IDLE:
205     // Obtain the incoming ARP packet
206     MACGetArray((BYTE*)&packet, sizeof(packet));
207     MACDiscardRx();
208     SwapARPPacket(&packet);
209    
210     // Validate the ARP packet
211     if ( packet.HardwareType != HW_ETHERNET ||
212     packet.MACAddrLen != sizeof(MAC_ADDR) ||
213     packet.ProtocolLen != sizeof(IP_ADDR) )
214     {
215     return TRUE;
216     }
217    
218     // Handle incoming ARP responses
219     #ifdef STACK_CLIENT_MODE
220     if(packet.Operation == ARP_OPERATION_RESP)
221     {
222     Cache.MACAddr = packet.SenderMACAddr;
223     Cache.IPAddr = packet.SenderIPAddr;
224     return TRUE;
225     }
226     #endif
227    
228     // Handle incoming ARP requests for our MAC address
229     if(packet.Operation == ARP_OPERATION_REQ)
230     {
231     if(packet.TargetIPAddr.Val != AppConfig.MyIPAddr.Val)
232     {
233     return TRUE;
234     }
235     Target.IPAddr = packet.SenderIPAddr;
236     Target.MACAddr = packet.SenderMACAddr;
237    
238     smARP = SM_ARP_REPLY;
239     }
240     // Do not break. If we get down here, we need to send a reply.
241    
242     case SM_ARP_REPLY:
243     packet.Operation = ARP_OPERATION_RESP;
244     packet.TargetMACAddr = Target.MACAddr;
245     packet.TargetIPAddr = Target.IPAddr;
246    
247     // Send an ARP response to a previously received request
248     if(!ARPPut(&packet))
249     {
250     return FALSE;
251     }
252    
253     // Begin listening for ARP requests again
254     smARP = SM_ARP_IDLE;
255     break;
256     }
257    
258     return TRUE;
259     }
260    
261    
262     /*********************************************************************
263     * Function: void ARPResolve(IP_ADDR* IPAddr)
264     *
265     * PreCondition: MACIsTxReady(TRUE) returns TRUE
266     *
267     * Input: IPAddr - IP Address to be resolved.
268     *
269     * Output: None
270     *
271     * Side Effects: None
272     *
273     * Overview: An ARP request is sent.
274     *
275     * Note: This function is available only when
276     * STACK_CLIENT_MODE is defined.
277     ********************************************************************/
278     #ifdef STACK_CLIENT_MODE
279     void ARPResolve(IP_ADDR *IPAddr)
280     {
281     ARP_PACKET packet;
282    
283     packet.Operation = ARP_OPERATION_REQ;
284     packet.TargetMACAddr.v[0] = 0xff;
285     packet.TargetMACAddr.v[1] = 0xff;
286     packet.TargetMACAddr.v[2] = 0xff;
287     packet.TargetMACAddr.v[3] = 0xff;
288     packet.TargetMACAddr.v[4] = 0xff;
289     packet.TargetMACAddr.v[5] = 0xff;
290    
291    
292     // ARP query either the IP address directly (on our subnet), or do an ARP query for our Gateway if off of our subnet
293     packet.TargetIPAddr = ((AppConfig.MyIPAddr.Val ^ IPAddr->Val) & AppConfig.MyMask.Val) ? AppConfig.MyGateway : *IPAddr;
294    
295     ARPPut(&packet);
296     }
297     #endif
298    
299    
300    
301     /*********************************************************************
302     * Function: BOOL ARPIsResolved(IP_ADDR* IPAddr,
303     * MAC_ADDR *MACAddr)
304     *
305     * PreCondition: None
306     *
307     * Input: IPAddr - IPAddress to be resolved.
308     * MACAddr - Buffer to hold corresponding
309     * MAC Address.
310     *
311     * Output: TRUE if given IP Address has been resolved.
312     * FALSE otherwise.
313     *
314     * Side Effects: None
315     *
316     * Overview: None
317     *
318     * Note: This function is available only when
319     * STACK_CLIENT_MODE is defined.
320     ********************************************************************/
321     #ifdef STACK_CLIENT_MODE
322     BOOL ARPIsResolved(IP_ADDR *IPAddr, MAC_ADDR *MACAddr)
323     {
324     if((Cache.IPAddr.Val == IPAddr->Val) || ((Cache.IPAddr.Val == AppConfig.MyGateway.Val) && Cache.IPAddr.Val))
325     {
326     *MACAddr = Cache.MACAddr;
327     return TRUE;
328     }
329     return FALSE;
330     }
331     #endif
332    
333    
334    
335     /*********************************************************************
336     * Function: static void SwapARPPacket(ARP_PACKET* p)
337     *
338     * PreCondition: None
339     *
340     * Input: p - ARP packet to be swapped.
341     *
342     * Output: None
343     *
344     * Side Effects: None
345     *
346     * Overview: None
347     *
348     * Note: None
349     ********************************************************************/
350     static void SwapARPPacket(ARP_PACKET *p)
351     {
352     p->HardwareType = swaps(p->HardwareType);
353     p->Protocol = swaps(p->Protocol);
354     p->Operation = swaps(p->Operation);
355     }
356    
357     #endif //#if !defined(STACK_USE_SLIP)

  ViewVC Help
Powered by ViewVC 1.1.20