15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  GRUB  --  GRand Unified Bootloader
35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  This program is free software; you can redistribute it and/or modify
65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  it under the terms of the GNU General Public License as published by
75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  the Free Software Foundation; either version 2 of the License, or
85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  (at your option) any later version.
95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  This program is distributed in the hope that it will be useful,
115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  but WITHOUT ANY WARRANTY; without even the implied warranty of
125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  GNU General Public License for more details.
145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  You should have received a copy of the GNU General Public License
165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  along with this program; if not, write to the Free Software
175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* RULE: You must define the macro ``GRUB'' when including this header
215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   file in GRUB code.  */
225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Based on "src/etherboot.h" in etherboot-5.0.5.  */
245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/**************************************************************************
265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectETHERBOOT -  BOOTP/TFTP Bootstrap Program
275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectAuthor: Martin Renters
295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  Date: Dec/93
305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project**************************************************************************/
325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Include GRUB-specific macros and prototypes here.  */
345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <shared.h>
355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* FIXME: For now, enable the DHCP support. Perhaps I should segregate
375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   the DHCP support from the BOOTP support, and permit both to
385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   co-exist.  */
395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#undef NO_DHCP_SUPPORT
405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* In GRUB, the relocated address in Etherboot doesn't have any sense.
425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   Just define it as a bogus value.  */
435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RELOC	0
445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* FIXME: Should be an option.  */
465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BACKOFF_LIMIT	7
475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <osdep.h>
495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CTRL_C		3
515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef	MAX_TFTP_RETRIES
535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# define MAX_TFTP_RETRIES	20
545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef	MAX_BOOTP_RETRIES
575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# define MAX_BOOTP_RETRIES	20
585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MAX_BOOTP_EXTLEN	(ETH_FRAME_LEN - ETH_HLEN - \
615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				 sizeof (struct bootp_t))
625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef	MAX_ARP_RETRIES
645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# define MAX_ARP_RETRIES	20
655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef	MAX_RPC_RETRIES
685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# define MAX_RPC_RETRIES	20
695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define	TICKS_PER_SEC		18
725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Inter-packet retry in ticks */
745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TIMEOUT			(10 * TICKS_PER_SEC)
755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* These settings have sense only if compiled with -DCONGESTED */
775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* total retransmission timeout in ticks */
785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TFTP_TIMEOUT		(30 * TICKS_PER_SEC)
795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* packet retransmission timeout in ticks */
805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TFTP_REXMT		(3 * TICKS_PER_SEC)
815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef	NULL
835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# define NULL			((void *) 0)
845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   I'm moving towards the defined names in linux/if_ether.h for clarity.
885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   The confusion between 60/64 and 1514/1518 arose because the NS8390
895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   counts the 4 byte frame checksum in the incoming packet, but not
905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   in the outgoing packet. 60/1514 are the correct numbers for most
915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   if not all of the other NIC controllers. I will be retiring the
925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   64/1518 defines in the lead-up to 5.0.
935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ETH_ALEN		6	/* Size of Ethernet address */
965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ETH_HLEN		14	/* Size of ethernet header */
975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define	ETH_ZLEN		60	/* Minimum packet */
985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*#define ETH_MIN_PACKET		64*/
995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define	ETH_FRAME_LEN		1514	/* Maximum packet */
1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*#define ETH_MAX_PACKET		1518*/
1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Because some DHCP/BOOTP servers don't treat the maximum length the same
1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   as Etherboot, subtract the size of an IP header and that of an UDP
1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   header.  */
1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define	ETH_MAX_MTU		(ETH_FRAME_LEN - ETH_HLEN \
1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				- sizeof (struct iphdr) \
1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				- sizeof (struct udphdr))
1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ARP_CLIENT	0
1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ARP_SERVER	1
1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ARP_GATEWAY	2
1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ARP_ROOTSERVER	3
1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ARP_SWAPSERVER	4
1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MAX_ARP		ARP_SWAPSERVER+1
1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define	RARP_REQUEST	3
1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define	RARP_REPLY	4
1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IP		0x0800
1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ARP		0x0806
1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define	RARP		0x8035
1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BOOTP_SERVER	67
1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BOOTP_CLIENT	68
1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TFTP_PORT	69
1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SUNRPC_PORT	111
1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IP_UDP		17
1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Same after going through htonl */
1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IP_BROADCAST	0xFFFFFFFF
1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ARP_REQUEST	1
1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ARP_REPLY	2
1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BOOTP_REQUEST	1
1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BOOTP_REPLY	2
1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TAG_LEN(p)		(*((p) + 1))
1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_COOKIE		99, 130, 83, 99
1395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_PAD		0
1405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_NETMASK		1
1415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_TIMEOFFSET	2
1425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_GATEWAY		3
1435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_TIMESERVER	4
1445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_IEN116NS	5
1455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_DNS		6
1465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_LOGSERVER	7
1475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_COOKIESERVER	8
1485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_LPRSERVER	9
1495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_IMPRESSSERVER	10
1505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_RESOURCESERVER	11
1515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_HOSTNAME	12
1525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_BOOTFILESIZE	13
1535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_MERITDUMPFILE	14
1545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_DOMAINNAME	15
1555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_SWAPSERVER	16
1565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_ROOTPATH	17
1575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_EXTENSIONPATH	18
1585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_IPFORWARDING	19
1595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_IPSOURCEROUTING	20
1605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_IPPOLICYFILTER	21
1615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_IPMAXREASSEMBLY	22
1625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_IPTTL		23
1635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_IPMTU		24
1645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_IPMTUPLATEAU	25
1655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_INTMTU		26
1665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_INTLOCALSUBNETS	27
1675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_INTBROADCAST	28
1685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_INTICMPDISCOVER	29
1695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_INTICMPRESPOND	30
1705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_INTROUTEDISCOVER 31
1715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_INTROUTESOLICIT	32
1725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_INTSTATICROUTES	33
1735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_LLTRAILERENCAP	34
1745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_LLARPCACHETMO	35
1755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_LLETHERNETENCAP	36
1765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_TCPTTL		37
1775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_TCPKEEPALIVETMO	38
1785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_TCPKEEPALIVEGB	39
1795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_NISDOMAIN	40
1805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_NISSERVER	41
1815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_NTPSERVER	42
1825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_VENDOR		43
1835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_NBNS		44
1845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_NBDD		45
1855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_NBNT		46
1865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_NBSCOPE		47
1875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_XFS		48
1885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_XDM		49
1895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef	NO_DHCP_SUPPORT
1905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC2132_REQ_ADDR	50
1915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC2132_MSG_TYPE	53
1925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC2132_SRV_ID		54
1935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC2132_PARAM_LIST	55
1945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC2132_MAX_SIZE	57
1955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC2132_VENDOR_CLASS_ID	60
1965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DHCPDISCOVER		1
1985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DHCPOFFER		2
1995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DHCPREQUEST		3
2005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DHCPACK			5
2015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif	/* NO_DHCP_SUPPORT */
2025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_VENDOR_MAJOR	0
2045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_VENDOR_MINOR	0
2055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_VENDOR_MAGIC	128
2075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_VENDOR_ADDPARM	129
2085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_VENDOR_MNUOPTS	160
2095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_VENDOR_SELECTION 176
2105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_VENDOR_MOTD	184
2115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_VENDOR_NUMOFMOTD 8
2125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_VENDOR_IMG	192
2135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_VENDOR_NUMOFIMG	16
2145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_VENDOR_CONFIGFILE	150
2165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RFC1533_END		255
2185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BOOTP_VENDOR_LEN	64
2205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef	NO_DHCP_SUPPORT
2215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DHCP_OPT_LEN		312
2225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif	/* NO_DHCP_SUPPORT */
2235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define	TFTP_DEFAULTSIZE_PACKET	512
2255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define	TFTP_MAX_PACKET		1432 /* 512 */
2265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TFTP_RRQ	1
2285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TFTP_WRQ	2
2295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TFTP_DATA	3
2305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TFTP_ACK	4
2315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TFTP_ERROR	5
2325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TFTP_OACK	6
2335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TFTP_CODE_EOF	1
2355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TFTP_CODE_MORE	2
2365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TFTP_CODE_ERROR	3
2375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TFTP_CODE_BOOT	4
2385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TFTP_CODE_CFG	5
2395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define AWAIT_ARP	0
2415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define AWAIT_BOOTP	1
2425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define AWAIT_TFTP	2
2435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define AWAIT_RARP	3
2445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define AWAIT_RPC	4
2455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define AWAIT_QDRAIN	5	/* drain queue, process ARP requests */
2465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttypedef struct
2485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
2495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned long	s_addr;
2505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
2515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectin_addr;
2525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct arptable_t
2545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
2555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  in_addr ipaddr;
2565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned char node[6];
2575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
2585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * A pity sipaddr and tipaddr are not longword aligned or we could use
2615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * in_addr. No, I don't want to use #pragma packed.
2625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct arprequest
2645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
2655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short hwtype;
2665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short protocol;
2675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char hwlen;
2685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char protolen;
2695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short opcode;
2705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char shwaddr[6];
2715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char sipaddr[4];
2725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char thwaddr[6];
2735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char tipaddr[4];
2745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
2755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct iphdr
2775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
2785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char verhdrlen;
2795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char service;
2805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short len;
2815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short ident;
2825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short frags;
2835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char ttl;
2845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char protocol;
2855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short chksum;
2865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  in_addr src;
2875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  in_addr dest;
2885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
2895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct udphdr
2915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
2925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short src;
2935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short dest;
2945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short len;
2955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short chksum;
2965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
2975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Format of a bootp packet.  */
2995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct bootp_t
3005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
3015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char bp_op;
3025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char bp_htype;
3035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char bp_hlen;
3045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char bp_hops;
3055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned long bp_xid;
3065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short bp_secs;
3075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short unused;
3085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  in_addr bp_ciaddr;
3095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  in_addr bp_yiaddr;
3105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  in_addr bp_siaddr;
3115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  in_addr bp_giaddr;
3125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char bp_hwaddr[16];
3135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char bp_sname[64];
3145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char bp_file[128];
3155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef	NO_DHCP_SUPPORT
3165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char bp_vend[BOOTP_VENDOR_LEN];
3175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else
3185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char bp_vend[DHCP_OPT_LEN];
3195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif	/* NO_DHCP_SUPPORT */
3205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
3215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Format of a bootp IP packet.  */
3235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct bootpip_t
3245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
3255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  struct iphdr ip;
3265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  struct udphdr udp;
3275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  struct bootp_t bp;
3285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
3295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Format of bootp packet with extensions.  */
3315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct bootpd_t
3325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
3335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  struct bootp_t bootp_reply;
3345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned char  bootp_extension[MAX_BOOTP_EXTLEN];
3355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
3365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct tftp_t
3385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
3395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  struct iphdr ip;
3405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  struct udphdr udp;
3415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short opcode;
3425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  union
3435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {
3445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    char rrq[TFTP_DEFAULTSIZE_PACKET];
3455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct
3475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
3485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      unsigned short block;
3495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      char download[TFTP_MAX_PACKET];
3505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
3515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    data;
3525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct
3545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
3555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      unsigned short block;
3565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
3575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    ack;
3585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct
3605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
3615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      unsigned short errcode;
3625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      char errmsg[TFTP_DEFAULTSIZE_PACKET];
3635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
3645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    err;
3655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct
3675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
3685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      char data[TFTP_DEFAULTSIZE_PACKET+2];
3695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
3705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    oack;
3715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  }
3725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  u;
3735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
3745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Define a smaller tftp packet solely for making requests to conserve stack
3765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   512 bytes should be enough.  */
3775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct tftpreq_t
3785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
3795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  struct iphdr ip;
3805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  struct udphdr udp;
3815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short opcode;
3825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  union
3835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {
3845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    char rrq[512];
3855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct
3875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
3885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      unsigned short block;
3895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
3905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    ack;
3915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct
3935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
3945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      unsigned short errcode;
3955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      char errmsg[512-2];
3965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
3975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    err;
3985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  }
3995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  u;
4005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
4015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TFTP_MIN_PACKET	(sizeof(struct iphdr) + sizeof(struct udphdr) + 4)
4035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct rpc_t
4055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
4065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  struct iphdr ip;
4075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  struct udphdr udp;
4085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  union
4095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {
4105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    char data[300];		/* longest RPC call must fit!!!! */
4115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct
4135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
4145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      long id;
4155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      long type;
4165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      long rpcvers;
4175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      long prog;
4185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      long vers;
4195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      long proc;
4205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      long data[1];
4215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
4225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    call;
4235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct
4255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
4265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      long id;
4275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      long type;
4285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      long rstatus;
4295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      long verifier;
4305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      long v2;
4315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      long astatus;
4325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      long data[1];
4335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
4345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    reply;
4355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  }
4365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  u;
4375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
4385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PROG_PORTMAP	100000
4405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PROG_NFS	100003
4415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PROG_MOUNT	100005
4425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MSG_CALL	0
4445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MSG_REPLY	1
4455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PORTMAP_GETPORT	3
4475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MOUNT_ADDENTRY	1
4495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MOUNT_UMOUNTALL	4
4505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define NFS_LOOKUP	4
4525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define NFS_READ	6
4535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define NFS_FHSIZE	32
4555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define NFSERR_PERM	1
4575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define NFSERR_NOENT	2
4585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define NFSERR_ACCES	13
4595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Block size used for NFS read accesses.  A RPC reply packet (including  all
4615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * headers) must fit within a single Ethernet frame to avoid fragmentation.
4625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Chosen to be a power of two, as most NFS servers are optimized for this.  */
4635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define NFS_READ_SIZE	1024
4645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define	FLOPPY_BOOT_LOCATION	0x7c00
4665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Must match offsets in loader.S */
4675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ROM_SEGMENT		0x1fa
4685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ROM_LENGTH		0x1fc
4695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define	ROM_INFO_LOCATION	(FLOPPY_BOOT_LOCATION + ROM_SEGMENT)
4715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* at end of floppy boot block */
4725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct rom_info
4745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
4755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short	rom_segment;
4765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short	rom_length;
4775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
4785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic inline int
4805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectrom_address_ok (struct rom_info *rom, int assigned_rom_segment)
4815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
4825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  return (assigned_rom_segment < 0xC000
4835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  || assigned_rom_segment == rom->rom_segment);
4845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
4855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Define a type for passing info to a loaded program.  */
4875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct ebinfo
4885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
4895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned char	major, minor;	/* Version */
4905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  unsigned short	flags;		/* Bit flags */
4915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
4925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/***************************************************************************
4945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectExternal prototypes
4955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/
4965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* main.c */
4975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern void print_network_configuration (void);
4985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern int ifconfig (char *ip, char *sm, char *gw, char *svr);
4995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern int udp_transmit (unsigned long destip, unsigned int srcsock,
5005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			 unsigned int destsock, int len, const void *buf);
5015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern int await_reply (int type, int ival, void *ptr, int timeout);
5025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern int decode_rfc1533 (unsigned char *, int, int, int);
5035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern long rfc2131_sleep_interval (int base, int exp);
5045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern void cleanup (void);
5055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern int rarp (void);
5065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern int bootp (void);
5075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern void cleanup_net (void);
5085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* config.c */
5105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern void print_config (void);
5115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern void eth_reset (void);
5125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern int eth_probe (void);
5135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern int eth_poll (void);
5145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern void eth_transmit (const char *d, unsigned int t,
5155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  unsigned int s, const void *p);
5165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern void eth_disable (void);
5175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* misc.c */
5195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern void twiddle (void);
5205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern void sleep (int secs);
5215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern int getdec (char **s);
5225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern void etherboot_printf (const char *, ...);
5235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern int etherboot_sprintf (char *, const char *, ...);
5245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern int inet_aton (char *p, in_addr *i);
5255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/***************************************************************************
5275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectExternal variables
5285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/
5295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* main.c */
5305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern int ip_abort;
5315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern int network_ready;
5325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern struct rom_info rom;
5335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern struct arptable_t arptable[MAX_ARP];
5345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern struct bootpd_t bootp_data;
5355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define	BOOTP_DATA_ADDR	(&bootp_data)
5365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern unsigned char *end_of_rfc1533;
5375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* config.c */
5395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern struct nic nic;
5405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Local hack - define some macros to use etherboot source files "as is".  */
5425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef GRUB
5435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# undef printf
5445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# define printf	etherboot_printf
5455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# undef sprintf
5465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# define sprintf etherboot_sprintf
5475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* GRUB */
548