/[H8]/trunk/PIC/Demo trimmet/arp.c
ViewVC logotype

Annotation of /trunk/PIC/Demo trimmet/arp.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 91 - (hide annotations) (download)
Tue May 8 09:37:15 2007 UTC (17 years, 1 month ago) by hedin
File MIME type: text/plain
File size: 6776 byte(s)
added tcp/ip stack demo, trimmed.
1 hedin 91 /*********************************************************************
2     *
3     * ARP Module for Microchip TCP/IP Stack
4     *
5     *********************************************************************
6     * FileName: ARP.c
7     * Dependencies: string.h
8     * stacktsk.h
9     * helpers.h
10     * arp.h
11     * mac.h
12     * Processor: PIC18, PIC24F, PIC24H, dsPIC30F, dsPIC33F
13     * Complier: Microchip C18 v3.02 or higher
14     * Microchip C30 v2.01 or higher
15     * Company: Microchip Technology, Inc.
16     *
17     * Software License Agreement
18     *
19     * This software is owned by Microchip Technology Inc. ("Microchip")
20     * and is supplied to you for use exclusively as described in the
21     * associated software agreement. This software is protected by
22     * software and other intellectual property laws. Any use in
23     * violation of the software license may subject the user to criminal
24     * sanctions as well as civil liability. Copyright 2006 Microchip
25     * Technology Inc. All rights reserved.
26     *
27     * This software is provided "AS IS." MICROCHIP DISCLAIMS ALL
28     * WARRANTIES, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, NOT LIMITED
29     * TO MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
30     * INFRINGEMENT. Microchip shall in no event be liable for special,
31     * incidental, or consequential damages.
32     *
33     *
34     * Author Date Comment
35     *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
36     * Nilesh Rajbharti 5/1/01 Original (Rev 1.0)
37     * Nilesh Rajbharti 2/9/02 Cleanup
38     * Nilesh Rajbharti 5/22/02 Rev 2.0 (See version.log for detail)
39     ********************************************************************/
40     #include <string.h>
41    
42     #include "StackTsk.h"
43     #include "Helpers.h"
44     #include "ARP.h"
45     #include "MAC.h"
46    
47     // ARP Operation codes.
48     #define ARP_OPERATION_REQ 0x01u
49     #define ARP_OPERATION_RESP 0x02u
50    
51     // ETHERNET packet type as defined by IEEE 802.3
52     #define HW_ETHERNET (0x0001u)
53     #define ARP_IP (0x0800u)
54    
55    
56    
57     // ARP packet
58     typedef struct _ARP_PACKET
59     {
60     WORD HardwareType;
61     WORD Protocol;
62     BYTE MACAddrLen;
63     BYTE ProtocolLen;
64     WORD Operation;
65     MAC_ADDR SenderMACAddr;
66     IP_ADDR SenderIPAddr;
67     MAC_ADDR TargetMACAddr;
68     IP_ADDR TargetIPAddr;
69     } ARP_PACKET;
70    
71     // Helper function
72     static void SwapARPPacket(ARP_PACKET *p);
73    
74    
75    
76     /*********************************************************************
77     * Function: BOOL ARPGet(NODE_INFO* remote, BYTE* opCode)
78     *
79     * PreCondition: ARP packet is ready in MAC buffer.
80     *
81     * Input: remote - Remote node info
82     * opCode - Buffer to hold ARP op code.
83     *
84     * Output: TRUE if a valid ARP packet was received.
85     * FALSE otherwise.
86     *
87     * Side Effects: None
88     *
89     * Overview: None
90     *
91     * Note: None
92     ********************************************************************/
93     BOOL ARPGet(NODE_INFO *remote, BYTE *opCode)
94     {
95     ARP_PACKET packet;
96    
97     MACGetArray((BYTE*)&packet, sizeof(packet));
98    
99     MACDiscardRx();
100    
101     SwapARPPacket(&packet);
102    
103     if ( packet.HardwareType != HW_ETHERNET ||
104     packet.MACAddrLen != sizeof(MAC_ADDR) ||
105     packet.ProtocolLen != sizeof(IP_ADDR) )
106     {
107     return FALSE;
108     }
109    
110     if ( packet.Operation == ARP_OPERATION_RESP )
111     {
112     *opCode = ARP_REPLY;
113     }
114     else if ( packet.Operation == ARP_OPERATION_REQ )
115     *opCode = ARP_REQUEST;
116     else
117     {
118     *opCode = ARP_UNKNOWN;
119     return FALSE;
120     }
121    
122     if(packet.TargetIPAddr.Val == AppConfig.MyIPAddr.Val)
123     {
124     remote->MACAddr = packet.SenderMACAddr;
125     remote->IPAddr = packet.SenderIPAddr;
126     return TRUE;
127     }
128     else
129     return FALSE;
130     }
131    
132    
133     /*********************************************************************
134     * Function: BOOL ARPPut(NODE_INFO* more, BYTE opCode)
135     *
136     * PreCondition: None
137     *
138     * Input: remote - Remote node info
139     * opCode - ARP op code to send
140     *
141     * Output: TRUE - The ARP packet was generated properly
142     * FALSE - Unable to allocate a TX buffer
143     *
144     * Side Effects: None
145     *
146     * Overview: None
147     *
148     * Note: None
149     ********************************************************************/
150     BOOL ARPPut(NODE_INFO *remote, BYTE opCode)
151     {
152     ARP_PACKET packet;
153     BUFFER MyTxBuffer = MACGetTxBuffer(TRUE);
154    
155     // Do not respond if there is no room to generate the ARP reply
156     if(MyTxBuffer == INVALID_BUFFER)
157     return FALSE;
158    
159     MACSetTxBuffer(MyTxBuffer, 0);
160    
161    
162     packet.HardwareType = HW_ETHERNET;
163     packet.Protocol = ARP_IP;
164     packet.MACAddrLen = sizeof(MAC_ADDR);
165     packet.ProtocolLen = sizeof(IP_ADDR);
166    
167     if ( opCode == ARP_REQUEST )
168     {
169     packet.Operation = ARP_OPERATION_REQ;
170     packet.TargetMACAddr.v[0] = 0xff;
171     packet.TargetMACAddr.v[1] = 0xff;
172     packet.TargetMACAddr.v[2] = 0xff;
173     packet.TargetMACAddr.v[3] = 0xff;
174     packet.TargetMACAddr.v[4] = 0xff;
175     packet.TargetMACAddr.v[5] = 0xff;
176     }
177     else
178     {
179     packet.Operation = ARP_OPERATION_RESP;
180     packet.TargetMACAddr = remote->MACAddr;
181     }
182    
183     packet.SenderMACAddr = AppConfig.MyMACAddr;
184     packet.SenderIPAddr = AppConfig.MyIPAddr;
185    
186     // Check to see if target is on same subnet, if not, find Gateway MAC.
187     // Once we get Gateway MAC, all access to remote host will go through Gateway.
188     if((packet.SenderIPAddr.Val ^ remote->IPAddr.Val) & AppConfig.MyMask.Val)
189     {
190     packet.TargetIPAddr = AppConfig.MyGateway;
191     }
192     else
193     packet.TargetIPAddr = remote->IPAddr;
194    
195     SwapARPPacket(&packet);
196    
197     MACPutHeader(&packet.TargetMACAddr, MAC_ARP, sizeof(packet));
198     MACPutArray((BYTE*)&packet, sizeof(packet));
199     MACFlush();
200    
201     return TRUE;
202     }
203    
204    
205     /*********************************************************************
206     * Function: static void SwapARPPacket(ARP_PACKET* p)
207     *
208     * PreCondition: None
209     *
210     * Input: p - ARP packet to be swapped.
211     *
212     * Output: None
213     *
214     * Side Effects: None
215     *
216     * Overview: None
217     *
218     * Note: None
219     ********************************************************************/
220     static void SwapARPPacket(ARP_PACKET *p)
221     {
222     p->HardwareType = swaps(p->HardwareType);
223     p->Protocol = swaps(p->Protocol);
224     p->Operation = swaps(p->Operation);
225     }

  ViewVC Help
Powered by ViewVC 1.1.20