1 /**
2 * @file netif.h
3 *
4 * @brief
5 * Internal header file used only by the NET Boot Module
6 * This header file is not accessible by the DEVICE layers.
7 *
8 * \par
9 * NOTE:
10 * (C) Copyright 2008, Texas Instruments, Inc.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 *
16 * Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 *
19 * Redistributions in binary form must reproduce the above copyright
20 * notice, this list of conditions and the following disclaimer in the
21 * documentation and/or other materials provided with the
22 * distribution.
23 *
24 * Neither the name of Texas Instruments Incorporated nor the names of
25 * its contributors may be used to endorse or promote products derived
26 * from this software without specific prior written permission.
27 *
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 *
40 * \par
41 */
43 #ifndef __NETIF_H__
44 #define __NETIF_H__
46 /**
47 * @brief This is the protocol identification field in the Ethernet
48 * header which identifies the packet as an IPv4 packet.
49 */
50 #define ETH_IP 0x800
52 /**
53 * @brief This is the protocol identification field in the Ethernet
54 * header which identifies the packet as an IPv4 packet.
55 */
56 #define ETH_ARP 0x806
58 /**
59 * @brief This is the protocol identification field in the IPv4 header
60 * which identifies the packet as an ICMP packet.
61 */
62 #define IPPROTO_ICMP 1
64 /**
65 * @brief This is the protocol identification field in the IPv4 header
66 * which identifies the packet as a UDP packet.
67 */
68 #define IPPROTO_UDP 17
70 /**
71 * @brief This is the ICMP Echo request type field which is present in the
72 * ICMP header. This is the only type handled in the ICMP Network Boot Module.
73 */
74 #define ICMP_ECHO_REQUEST_TYPE 8
76 /**
77 * @brief This is the ICMP Echo reply type field which is present in the
78 * ICMP header. This is the reply packet generated in response to the REQ
79 * packet.
80 */
81 #define ICMP_ECHO_REPLY_TYPE 0
83 /**
84 * @brief This is the BOOTP SERVER port to which BOOTP requests are sent
85 * by the BOOTP client module.
86 */
87 #define BOOTP_SERVER_PORT 67
89 /**
90 * @brief This is the BOOTP Local port using which the BOOTP client will
91 * send requests.
92 */
93 #define BOOTP_CLIENT_PORT 68
95 /**
96 * @brief This is the BOOTP OP definition for a BOOTP request
97 */
98 #define BOOTP_OP_REQUEST 1
100 /**
101 * @brief This is the BOOTP OP definition for a BOOTP reply
102 */
103 #define BOOTP_OP_REPLY 2
105 /**
106 * @brief This is the BOOTP HTYPE definition for Ethernet.
107 */
108 #define BOOTP_HTYPE_ETHERNET 1
110 /**
111 * @brief This is the BOOTP Seed Timeout (in milliseconds) which is being used.
112 */
113 #define BOOTP_SEED_TIMEOUT 4000
115 /**
116 * @brief This is the max. number of retries for which the BOOTP client
117 * will wait.
118 */
119 #define BOOTP_MAX_RETRIES 5
121 /**
122 * @brief This is the default BOOTP subnet mask which is used if there
123 * is none present in the BOOTP options.
124 */
125 #define BOOTP_DEFAULT_MASK htonl(0xFFFFFF00)
127 /**
128 * @brief This is the well defined TFTP Server port.
129 */
130 #define TFTP_SERVER_PORT 69
132 /**
133 * @brief This is the maximum TFTP data size that is sent out.
134 */
135 #define TFTP_DATA_SIZE 512
137 /**
138 * @brief This is the TFTP opcode for READ
139 */
140 #define TFTP_OPCODE_RRQ 1
142 /**
143 * @brief This is the TFTP opcode for DATA
144 */
145 #define TFTP_OPCODE_DATA 3
147 /**
148 * @brief This is the TFTP opcode for ACK
149 */
150 #define TFTP_OPCODE_ACK 4
152 /**
153 * @brief This is the TFTP opcode for ERROR
154 */
155 #define TFTP_OPCODE_ERROR 5
157 /**
158 * @brief This is the TFTP timeout (in milliseconds) used
159 * to send out periodic READ Requests if there is no response
160 * detected.
161 */
162 #define TFTP_TIMEOUT 1000
164 /**
165 * @brief This is the TFTP Server timeout (in milliseconds)
166 * to detect the condition where the TFTP Server goes away in
167 * the middle of the download.
168 */
169 #define TFTP_SERVER_TIMEOUT 60000
171 /**
172 * @brief This is the maximum number of retransmits allowed
173 * in the TFTP Client after which an error is indicated.
174 */
175 #define MAX_TFTP_RETRANSMITS 5
177 /**
178 * @brief This is the the ARP timeout (in milliseconds) used
179 * to resend ARP requests.
180 */
181 #define ARP_TIMEOUT 1000
183 /***********************************************************************
184 ****************** STANDARD NETWORK HEADER DEFINITIONS ****************
185 ***********************************************************************/
187 #define ETHHDR_SIZE 14
188 typedef struct ETHHDR
189 {
190 Uint8 DstMac[6];
191 Uint8 SrcMac[6];
192 Uint16 Type;
193 } ETHHDR;
195 #define IPHDR_SIZE 20
196 typedef struct IPHDR
197 {
198 Uint8 VerLen;
199 Uint8 Tos;
200 Uint16 TotalLen;
201 Uint16 Id;
202 Uint16 FlagOff;
203 Uint8 Ttl;
204 Uint8 Protocol;
205 Uint16 Checksum;
206 Uint32 IPSrc;
207 Uint32 IPDst;
208 Uint8 Options[1];
209 } IPHDR;
211 #define ARPHDR_SIZE 28
212 typedef struct ARPHDR
213 {
214 Uint16 HardType;
215 Uint16 ProtocolType;
216 Uint8 HardSize;
217 Uint8 ProtocolSize;
218 Uint16 Op;
219 Uint8 SrcAddr[6];
220 Uint8 IPSrc[4];
221 Uint8 DstAddr[6];
222 Uint8 IPDst[4];
223 } ARPHDR;
225 typedef struct PSEUDOHDR
226 {
227 IPN IPSrc;
228 IPN IPDst;
229 Uint16 Length;
230 Uint8 Null;
231 Uint8 Protocol;
232 } PSEUDOHDR;
234 #define UDPHDR_SIZE 8
235 typedef struct UDPHDR
236 {
237 Uint16 SrcPort;
238 Uint16 DstPort;
239 Uint16 Length;
240 Uint16 UDPChecksum;
241 }UDPHDR;
243 #define ICMPHDR_SIZE 4
244 typedef struct ICMPHDR
245 {
246 Uint8 Type;
247 Uint8 Code;
248 Uint16 Checksum;
249 Uint8 Data[1];
250 }ICMPHDR;
252 typedef struct BOOTPHDR
253 {
254 Uint8 op;
255 Uint8 htype;
256 Uint8 hlen;
257 Uint8 hops;
258 Uint32 xid;
259 Uint16 secs;
260 Uint16 unused;
261 Uint32 ciaddr;
262 Uint32 yiaddr;
263 Uint32 siaddr;
264 Uint32 giaddr;
265 Uint8 chaddr[16];
266 Uint8 sname[64];
267 Uint8 file[128];
268 Uint8 options[64];
269 } BOOTPHDR;
271 #define TFTPHEADER_SIZE 4
272 typedef struct TFTPHDR
273 {
274 Uint16 opcode;
275 Uint16 block;
276 Uint8 data[1];
277 }TFTPHDR;
279 /**
280 * @brief
281 * The structure describes the ROUTE Entry.
282 *
283 * @details
284 * This structures describes the routing entry. This is used by the network
285 * boot module to determine the next hop address. The next hop address might
286 * not be the same as the destination IP address if there exists a default
287 * gateway.
288 */
289 typedef struct RT_ENTRY
290 {
291 /**
292 * @brief Flags which describe the routing entry.
293 */
294 Uint32 flags;
296 /**
297 * @brief IP Address associated with the route
298 */
299 IPN ip_addr;
301 /**
302 * @brief Network Mask associated with the route
303 */
304 IPN net_mask;
306 /**
307 * @brief Network Address associated with the route
308 */
309 IPN net_addr;
311 /**
312 * @brief Next Hop Address associated with the route
313 */
314 IPN next_hop;
315 }RT_ENTRY;
317 /**
318 * @brief
319 * The structure describes the NET Master Control Block.
320 *
321 * @details
322 * This is an *internal* structure used by the NET Core Module for storing
323 * information. This structure should not be used or be accessed by the
324 * platform team.
325 */
326 typedef struct NET_MCB
327 {
328 /**
329 * @brief This is the network device which is attached to the network
330 * boot module.
331 */
332 NET_DRV_DEVICE net_device;
334 /**
335 * @brief This is the receive packet which is passed to the driver
336 * when the Net boot module invokes the receive API. The driver copies
337 * data from its internal buffers to this buffer. The network boot module
338 * only operates on this buffer.
339 */
340 Uint8 rx_packet[NET_MAX_MTU];
342 /**
343 * @brief This is the IP ID field which is globally incremented on
344 * every packet transmitted from the Network boot module.
345 */
346 Uint16 ipID;
348 /**
349 * @brief This indicates the status of the transmission buffer and whether
350 * it is available to be used or not. This is manipulated by the alloc_tx
351 * and free_tx routines to ensure there is no corruption with respect to the
352 * internal buffers.
353 */
354 Uint32 txuse;
356 /**
357 * @brief This flag indicates if there was an Error detected in the
358 * NET Boot Module or not? This is then used to break out of the NET Boot
359 * Module Scheduler. If there is no error detected the flag is set to 0.
360 */
361 Int32 error_flag;
363 /**
364 * @brief This is the transmit packet which is used by the network
365 * module to send a packet to the driver.
366 */
367 Uint8 tx_packet[NET_MAX_MTU];
370 /**
371 * @brief This tracks the current read byte in the file
372 */
373 Uint32 fileOffset;
376 }NET_MCB;
378 /**********************************************************************
379 **************************** Extern Data *****************************
380 **********************************************************************/
381 extern NET_MCB netmcb;
383 /**********************************************************************
384 **************************** Exported API ****************************
385 **********************************************************************/
386 extern void net_init (void);
387 extern Uint8* net_alloc_tx_packet(Int32 packet_len);
388 extern void net_free_tx_packet (Uint8* ptr);
389 extern ETHHDR* net_create_eth_header (Uint8* ptr_l3_hdr, Uint8* dst_mac, Uint16 protocol);
390 extern void net_send_packet (ETHHDR* ptr_l2_hdr, Uint16 length);
392 /* ARP Module exported API. */
393 extern void arp_init (void);
394 extern Int32 arp_receive (ARPHDR* ptr_arphdr, Int32 num_bytes);
395 extern void arp_resolve (IPN dst_ip, IPHDR* ptr_iphdr, Uint16 l3_pkt_size);
397 /* IPv4 Module exported API. */
398 extern void ip_init (void);
399 extern Int32 ip_receive (IPHDR* ptr_iphdr, Int32 num_bytes);
400 extern void ip_send (IPHDR* ptr_iphdr, Uint16 size);
401 extern RT_ENTRY* ip_lookup_route (IPN ip_address);
403 /* UDP Module exported API. */
404 extern void udp_init (void);
405 extern Int32 udp_receive (IPHDR* ptr_iphdr);
407 /* BOOTP Module exported API */
408 void bootp_init (void (*asyncComplete)(void *));
410 #ifdef INCLUDE_BLF_NET_ICMP
411 extern void icmp_receive (IPHDR* ptr_iphdr);
412 #endif
414 #endif /* __NETIF_H__ */