blob: 396f36e6df7023affbbe9929dc79938e9393ba11 [file] [log] [blame]
wdenk2d966952002-10-31 22:12:35 +00001/*
2 * LiMon Monitor (LiMon) - Network.
3 *
4 * Copyright 1994 - 2000 Neil Russell.
5 * (See License)
6 *
7 *
8 * History
9 * 9/16/00 bor adapted to TQM823L/STK8xxL board, RARP/TFTP boot added
10 */
11
12#ifndef __NET_H__
13#define __NET_H__
14
15#if !defined(CONFIG_NET_MULTI) && defined(CONFIG_8xx)
16#include <commproc.h>
17#if defined(FEC_ENET) || defined(SCC_ENET)
18#define CONFIG_NET_MULTI
19#endif
20#endif
21#include <asm/byteorder.h> /* for nton* / ntoh* stuff */
22
23
24/*
25 * The number of receive packet buffers, and the required packet buffer
26 * alignment in memory.
27 *
28 */
29
wdenk2582f6b2002-11-11 21:14:20 +000030#ifndef CONFIG_EEPRO100
wdenk2d966952002-10-31 22:12:35 +000031#define PKTBUFSRX 4
wdenk2582f6b2002-11-11 21:14:20 +000032#else
33#define PKTBUFSRX 8
34#endif
35
wdenk2d966952002-10-31 22:12:35 +000036#define PKTALIGN 32
37
38typedef ulong IPaddr_t;
39
40
41
42/*
43 * The current receive packet handler. Called with a pointer to the
44 * application packet, and a protocol type (PORT_BOOTPC or PORT_TFTP).
45 * All other packets are dealt with without calling the handler.
46 */
47typedef void rxhand_f(uchar *, unsigned, unsigned, unsigned);
48
49/*
50 * A timeout handler. Called after time interval has expired.
51 */
52typedef void thand_f(void);
53
54#ifdef CONFIG_NET_MULTI
55
56#define NAMESIZE 16
57
58enum eth_state_t {
59 ETH_STATE_INIT,
60 ETH_STATE_PASSIVE,
61 ETH_STATE_ACTIVE
62};
63
64struct eth_device {
65 char name[NAMESIZE];
66 unsigned char enetaddr[6];
67 int iobase;
68 int state;
69
70 int (*init) (struct eth_device*, bd_t*);
71 int (*send) (struct eth_device*, volatile void* pachet, int length);
72 int (*recv) (struct eth_device*);
73 void (*halt) (struct eth_device*);
74
75 struct eth_device *next;
76 void *priv;
77};
78
79extern int eth_initialize(bd_t *bis); /* Initialize network subsystem */
80extern int eth_register(struct eth_device* dev);/* Register network device */
81extern void eth_try_another(int first_restart); /* Change the device */
82extern struct eth_device *eth_get_dev(void); /* get the current device MAC */
83extern void eth_set_enetaddr(int num, char* a); /* Set new MAC address */
84#endif
85
86extern int eth_init(bd_t *bis); /* Initialize the device */
87extern int eth_send(volatile void *packet, int length); /* Send a packet */
88extern int eth_rx(void); /* Check for received packets */
89extern void eth_halt(void); /* stop SCC */
90
91
92/**********************************************************************/
93/*
94 * Protocol headers.
95 */
96
97/*
98 * Ethernet header
99 */
100typedef struct {
101 uchar et_dest[6]; /* Destination node */
102 uchar et_src[6]; /* Source node */
103 ushort et_protlen; /* Protocol or length */
104 uchar et_dsap; /* 802 DSAP */
105 uchar et_ssap; /* 802 SSAP */
106 uchar et_ctl; /* 802 control */
107 uchar et_snap1; /* SNAP */
108 uchar et_snap2;
109 uchar et_snap3;
110 ushort et_prot; /* 802 protocol */
111} Ethernet_t;
112
113#define ETHER_HDR_SIZE 14 /* Ethernet header size */
114#define E802_HDR_SIZE 22 /* 802 ethernet header size */
115#define PROT_IP 0x0800 /* IP protocol */
116#define PROT_ARP 0x0806 /* IP ARP protocol */
117#define PROT_RARP 0x8035 /* IP ARP protocol */
118
119#define IPPROTO_ICMP 1 /* Internet Control Message Protocol */
120#define IPPROTO_UDP 17 /* User Datagram Protocol */
121
122/*
123 * Internet Protocol (IP) header.
124 */
125typedef struct {
126 uchar ip_hl_v; /* header length and version */
127 uchar ip_tos; /* type of service */
128 ushort ip_len; /* total length */
129 ushort ip_id; /* identification */
130 ushort ip_off; /* fragment offset field */
131 uchar ip_ttl; /* time to live */
132 uchar ip_p; /* protocol */
133 ushort ip_sum; /* checksum */
134 IPaddr_t ip_src; /* Source IP address */
135 IPaddr_t ip_dst; /* Destination IP address */
136 ushort udp_src; /* UDP source port */
137 ushort udp_dst; /* UDP destination port */
138 ushort udp_len; /* Length of UDP packet */
139 ushort udp_xsum; /* Checksum */
140} IP_t;
141
142#define IP_HDR_SIZE_NO_UDP (sizeof (IP_t) - 8)
143#define IP_HDR_SIZE (sizeof (IP_t))
144
145
146/*
147 * Address Resolution Protocol (ARP) header.
148 */
149typedef struct
150{
151 ushort ar_hrd; /* Format of hardware address */
152# define ARP_ETHER 1 /* Ethernet hardware address */
153 ushort ar_pro; /* Format of protocol address */
154 uchar ar_hln; /* Length of hardware address */
155 uchar ar_pln; /* Length of protocol address */
156 ushort ar_op; /* Operation */
157# define ARPOP_REQUEST 1 /* Request to resolve address */
158# define ARPOP_REPLY 2 /* Response to previous request */
159
160# define RARPOP_REQUEST 3 /* Request to resolve address */
161# define RARPOP_REPLY 4 /* Response to previous request */
162
163 /*
164 * The remaining fields are variable in size, according to
165 * the sizes above, and are defined as appropriate for
166 * specific hardware/protocol combinations.
167 */
168 uchar ar_data[0];
169#if 0
170 uchar ar_sha[]; /* Sender hardware address */
171 uchar ar_spa[]; /* Sender protocol address */
172 uchar ar_tha[]; /* Target hardware address */
173 uchar ar_tpa[]; /* Target protocol address */
174#endif /* 0 */
175} ARP_t;
176
177#define ARP_HDR_SIZE (8+20) /* Size assuming ethernet */
178
179/*
180 * ICMP stuff (just enough to handle (host) redirect messages)
181 */
182#define ICMP_REDIRECT 5 /* Redirect (change route) */
183
184/* Codes for REDIRECT. */
185#define ICMP_REDIR_NET 0 /* Redirect Net */
186#define ICMP_REDIR_HOST 1 /* Redirect Host */
187
188typedef struct icmphdr {
189 uchar type;
190 uchar code;
191 ushort checksum;
192 union {
193 struct {
194 ushort id;
195 ushort sequence;
196 } echo;
197 ulong gateway;
198 struct {
199 ushort __unused;
200 ushort mtu;
201 } frag;
202 } un;
203} ICMP_t;
204
205
206
207/*
208 * Maximum packet size; used to allocate packet storage.
209 * TFTP packets can be 524 bytes + IP header + ethernet header.
210 * Lets be conservative, and go for 38 * 16. (Must also be
211 * a multiple of 32 bytes).
212 */
213/*
214 * AS.HARNOIS : Better to set PKTSIZE to maximum size because
215 * traffic type is not always controlled
216 * maximum packet size = 1518
217 * maximum packet size and multiple of 32 bytes = 1536
218 */
219#define PKTSIZE 1518
220#define PKTSIZE_ALIGN 1536
221/*#define PKTSIZE 608*/
222
223/*
224 * Maximum receive ring size; that is, the number of packets
225 * we can buffer before overflow happens. Basically, this just
226 * needs to be enough to prevent a packet being discarded while
227 * we are processing the previous one.
228 */
229#define RINGSZ 4
230#define RINGSZ_LOG2 2
231
232/**********************************************************************/
233/*
234 * Globals.
235 *
236 * Note:
237 *
238 * All variables of type IPaddr_t are stored in NETWORK byte order
239 * (big endian).
240 */
241
242/* net.c */
243/** BOOTP EXTENTIONS **/
244extern IPaddr_t NetOurGatewayIP; /* Our gateway IP addresse */
245extern IPaddr_t NetOurSubnetMask; /* Our subnet mask (0 = unknown)*/
246extern IPaddr_t NetOurDNSIP; /* Our Domain Name Server (0 = unknown)*/
247extern char NetOurNISDomain[32]; /* Our NIS domain */
248extern char NetOurHostName[32]; /* Our hostname */
249extern char NetOurRootPath[64]; /* Our root path */
250extern ushort NetBootFileSize; /* Our boot file size in blocks */
251/** END OF BOOTP EXTENTIONS **/
252extern ulong NetBootFileXferSize; /* size of bootfile in bytes */
253extern uchar NetOurEther[6]; /* Our ethernet address */
254extern uchar NetServerEther[6]; /* Boot server enet address */
255extern IPaddr_t NetOurIP; /* Our IP addr (0 = unknown) */
256extern IPaddr_t NetServerIP; /* Server IP addr (0 = unknown) */
257extern volatile uchar * NetTxPacket; /* THE transmit packet */
258extern volatile uchar * NetRxPackets[PKTBUFSRX];/* Receive packets */
259extern volatile uchar * NetRxPkt; /* Current receive packet */
260extern int NetRxPktLen; /* Current rx packet length */
261extern unsigned NetIPID; /* IP ID (counting) */
262extern uchar NetBcastAddr[6]; /* Ethernet boardcast address */
263
264extern int NetState; /* Network loop state */
265#define NETLOOP_CONTINUE 1
266#define NETLOOP_RESTART 2
267#define NETLOOP_SUCCESS 3
268#define NETLOOP_FAIL 4
269
270#ifdef CONFIG_NET_MULTI
271extern int NetRestartWrap; /* Tried all network devices */
272#endif
273
274typedef enum { BOOTP, RARP, ARP, TFTP, DHCP } proto_t;
275
276/* from net/net.c */
277extern char BootFile[128]; /* Boot File name */
278
279/* Initialize the network adapter */
280extern int NetLoop(proto_t);
281
282/* Shutdown adapters and cleanup */
283extern void NetStop(void);
284
285/* Load failed. Start again. */
286extern void NetStartAgain(void);
287
288/* Set ethernet header */
289extern void NetSetEther(volatile uchar *, uchar *, uint);
290
291/* Set IP header */
292extern void NetSetIP(volatile uchar *, IPaddr_t, int, int, int);
293
294/* Checksum */
295extern int NetCksumOk(uchar *, int); /* Return true if cksum OK */
296extern uint NetCksum(uchar *, int); /* Calculate the checksum */
297
298/* Set callbacks */
299extern void NetSetHandler(rxhand_f *); /* Set RX packet handler */
300extern void NetSetTimeout(int, thand_f *); /* Set timeout handler */
301
302/* Transmit "NetTxPacket" */
303extern void NetSendPacket(volatile uchar *, int);
304
305/* Processes a received packet */
306extern void NetReceive(volatile uchar *, int);
307
308/* Print an IP address on the console */
309extern void print_IPaddr (IPaddr_t);
310
311/*
312 * The following functions are a bit ugly, but necessary to deal with
313 * alignment restrictions on ARM.
314 *
315 * We're using inline functions, which had the smallest memory
316 * footprint in our tests.
317 */
318/* return IP *in network byteorder* */
319static inline IPaddr_t NetReadIP(void *from)
320{
321 IPaddr_t ip;
322 memcpy((void*)&ip, from, sizeof(ip));
323 return ip;
324}
325
326/* return ulong *in network byteorder* */
327static inline ulong NetReadLong(ulong *from)
328{
329 ulong l;
330 memcpy((void*)&l, (void*)from, sizeof(l));
331 return l;
332}
333
334/* write IP *in network byteorder* */
335static inline void NetWriteIP(void *to, IPaddr_t ip)
336{
337 memcpy(to, (void*)&ip, sizeof(ip));
338}
339
340/* copy IP */
341static inline void NetCopyIP(void *to, void *from)
342{
343 memcpy(to, from, sizeof(IPaddr_t));
344}
345
346/* copy ulong */
347static inline void NetCopyLong(ulong *to, ulong *from)
348{
349 memcpy((void*)to, (void*)from, sizeof(ulong));
350}
351
352/* Convert an IP address to a string */
353extern void ip_to_string (IPaddr_t x, char *s);
354
355/* read an IP address from a environment variable */
356extern IPaddr_t getenv_IPaddr (char *);
357
358/* copy a filename (allow for "..." notation, limit length) */
359extern void copy_filename (uchar *dst, uchar *src, int size);
360
361/**********************************************************************/
362
363#endif /* __NET_H__ */