Import from Etherboot 5.4
[people/oremanj/gpxe.git] / src / include / etherboot.h
1 #ifndef ETHERBOOT_H
2 #define ETHERBOOT_H
3
4 #include <stdarg.h>
5 #include "osdep.h"
6
7 #ifndef BOOT_FIRST
8 #define BOOT_FIRST      BOOT_NIC
9 #endif
10 #ifndef BOOT_SECOND
11 #define BOOT_SECOND     BOOT_NOTHING
12 #endif
13 #ifndef BOOT_THIRD
14 #define BOOT_THIRD      BOOT_NOTHING
15 #endif
16
17 #define DEFAULT_BOOT_ORDER ( \
18         (BOOT_FIRST   << (0*BOOT_BITS)) | \
19         (BOOT_SECOND  << (1*BOOT_BITS)) | \
20         (BOOT_THIRD   << (2*BOOT_BITS)) | \
21         (BOOT_NOTHING << (3*BOOT_BITS)) | \
22         0)
23
24 #ifdef BOOT_INDEX
25 #define DEFAULT_BOOT_INDEX BOOT_INDEX
26 #else
27 #define DEFAULT_BOOT_INDEX 0
28 #endif
29
30 #if     !defined(TAGGED_IMAGE) && !defined(AOUT_IMAGE) && !defined(ELF_IMAGE) && !defined(ELF64_IMAGE) && !defined(COFF_IMAGE) && !defined(RAW_IMAGE)
31 #define TAGGED_IMAGE            /* choose at least one */
32 #endif
33
34 #define K_ESC           '\033'
35 #define K_EOF           '\04'  /* Ctrl-D */
36 #define K_INTR          '\03'  /* Ctrl-C */
37
38 /*  Edit this to change the path to hostspecific kernel image
39     kernel.<client_ip_address> in RARP boot */
40 #ifndef DEFAULT_KERNELPATH
41 #define DEFAULT_KERNELPATH      "/tftpboot/kernel.%@"
42 #endif
43
44 #ifdef FREEBSD_PXEEMU
45 #undef DEFAULT_BOOTFILE
46 #ifndef PXENFSROOTPATH
47 #define PXENFSROOTPATH ""
48 #endif
49 #define DEFAULT_BOOTFILE        PXENFSROOTPATH "/boot/pxeboot"
50 #endif
51
52 #ifndef MAX_TFTP_RETRIES
53 #define MAX_TFTP_RETRIES        20
54 #endif
55
56 #ifndef MAX_BOOTP_RETRIES
57 #define MAX_BOOTP_RETRIES       20
58 #endif
59
60 #define MAX_BOOTP_EXTLEN        (ETH_MAX_MTU-sizeof(struct bootpip_t))
61
62 #ifndef MAX_ARP_RETRIES
63 #define MAX_ARP_RETRIES         20
64 #endif
65
66 #ifndef MAX_RPC_RETRIES
67 #define MAX_RPC_RETRIES         20
68 #endif
69
70 /* Link configuration time in tenths of a second */
71 #ifndef VALID_LINK_TIMEOUT
72 #define VALID_LINK_TIMEOUT      100 /* 10.0 seconds */
73 #endif
74
75 /* Inter-packet retry in ticks */
76 #ifndef TIMEOUT
77 #define TIMEOUT                 (10*TICKS_PER_SEC)
78 #endif
79
80 #ifndef BOOTP_TIMEOUT
81 #define BOOTP_TIMEOUT           (2*TICKS_PER_SEC)
82 #endif
83
84 /* Max interval between IGMP packets */
85 #define IGMP_INTERVAL                   (10*TICKS_PER_SEC)
86 #define IGMPv1_ROUTER_PRESENT_TIMEOUT   (400*TICKS_PER_SEC)
87
88 /* These settings have sense only if compiled with -DCONGESTED */
89 /* total retransmission timeout in ticks */
90 #define TFTP_TIMEOUT            (30*TICKS_PER_SEC)
91 /* packet retransmission timeout in ticks */
92 #ifdef CONGESTED
93 #define TFTP_REXMT              (3*TICKS_PER_SEC)
94 #else
95 #define TFTP_REXMT              TIMEOUT
96 #endif
97
98 #ifndef NULL
99 #define NULL    ((void *)0)
100 #endif
101
102 #include        "if_ether.h"
103
104 enum {
105         ARP_CLIENT, ARP_SERVER, ARP_GATEWAY,
106         ARP_NAMESERVER,
107 #ifdef PXE_EXPORT
108         ARP_PROXYDHCP,
109 #endif
110         MAX_ARP
111 };
112
113 #define IGMP_SERVER     0
114 #define MAX_IGMP        IGMP_SERVER+1
115
116 #define RARP_REQUEST    3
117 #define RARP_REPLY      4
118
119 #include        "in.h"
120
121 #define MULTICAST_MASK    0xF0000000
122 #define MULTICAST_NETWORK 0xE0000000
123
124 /* Helper macros used to identify when DHCP options are valid/invalid in/outside of encapsulation */
125 #define NON_ENCAP_OPT in_encapsulated_options == 0 &&
126 #ifdef ALLOW_ONLY_ENCAPSULATED
127 #define ENCAP_OPT in_encapsulated_options == 1 &&
128 #else
129 #define ENCAP_OPT
130 #endif
131
132 #include        "if_arp.h"
133 #include        "ip.h"
134 #include        "udp.h"
135 #include        "tcp.h"
136 #include        "bootp.h"
137 #include        "tftp.h"
138 #include        "igmp.h"
139 #include        "nfs.h"
140 #include        "console.h"
141 #include        "stdlib.h"
142
143 struct arptable_t {
144         struct in_addr ipaddr;
145         uint8_t node[6];
146 } PACKED;
147
148 struct igmptable_t {
149         in_addr group;
150         unsigned long time;
151 } PACKED;
152
153 #define KERNEL_BUF      (BOOTP_DATA_ADDR->bootp_reply.bp_file)
154
155 #define FLOPPY_BOOT_LOCATION    0x7c00
156
157 struct rom_info {
158         unsigned short  rom_segment;
159         unsigned short  rom_length;
160 };
161
162 extern inline int rom_address_ok(struct rom_info *rom, int assigned_rom_segment)
163 {
164         return (assigned_rom_segment < 0xC000
165                 || assigned_rom_segment == rom->rom_segment);
166 }
167
168 /* Define a type for passing info to a loaded program */
169 struct ebinfo {
170         uint8_t  major, minor;  /* Version */
171         uint16_t flags;         /* Bit flags */
172 };
173
174 /***************************************************************************
175 External prototypes
176 ***************************************************************************/
177 /* main.c */
178 struct Elf_Bhdr;
179 extern int main();
180 extern char as_main_program;
181 /* nic.c */
182 extern void rx_qdrain P((void));
183 extern int ip_transmit P((int len, const void *buf));
184 extern void build_ip_hdr P((unsigned long destip, int ttl, int protocol, 
185         int option_len, int len, const void *buf));
186 extern void build_udp_hdr P((unsigned long destip, 
187         unsigned int srcsock, unsigned int destsock, int ttl,
188         int len, const void *buf));
189 extern int udp_transmit P((unsigned long destip, unsigned int srcsock,
190         unsigned int destsock, int len, const void *buf));
191 extern int tcp_transmit(unsigned long destip, unsigned int srcsock,
192                        unsigned int destsock, long send_seq, long recv_seq,
193                        int window, int flags, int len, const void *buf);
194 int tcp_reset(struct iphdr *ip);
195 typedef int (*reply_t)(int ival, void *ptr, unsigned short ptype, struct iphdr *ip, struct udphdr *udp, struct tcphdr *tcp);
196 extern int await_reply P((reply_t reply,        int ival, void *ptr, long timeout));
197 extern int decode_rfc1533 P((unsigned char *, unsigned int, unsigned int, int));
198 extern void join_group(int slot, unsigned long group);
199 extern void leave_group(int slot);
200 #define RAND_MAX 2147483647L
201 extern uint16_t ipchksum P((const void *ip, unsigned long len));
202 extern uint16_t add_ipchksums P((unsigned long offset, uint16_t sum, uint16_t new));
203 extern int32_t random P((void));
204 extern long rfc2131_sleep_interval P((long base, int exp));
205 extern long rfc1112_sleep_interval P((long base, int exp));
206 extern void cleanup P((void));
207
208 /* config.c */
209 extern void print_config(void);
210
211 /* osloader.c */
212 /* Be careful with sector_t it is an unsigned long long on x86 */
213 typedef uint64_t sector_t;
214 typedef sector_t (*os_download_t)(unsigned char *data, unsigned int len, int eof);
215 extern os_download_t probe_image(unsigned char *data, unsigned int len);
216 extern int load_block P((unsigned char *, unsigned int, unsigned int, int ));
217
218 /* misc.c */
219 extern void twiddle P((void));
220 extern void sleep P((int secs));
221 extern void interruptible_sleep P((int secs));
222 extern void poll_interruptions P((void));
223 extern int strcasecmp P((const char *a, const char *b));
224 extern char *substr P((const char *a, const char *b));
225
226 extern unsigned long get_boot_order(unsigned long order, unsigned *index);
227 extern void disk_init P((void));
228 extern unsigned int pcbios_disk_read P((int drv,int c,int h,int s,char *buf));
229
230 /* start32.S */
231 struct os_entry_regs {
232         /* Be careful changing this structure
233          * as it is used by assembly language code.
234          */
235         uint32_t  edi; /*  0 */
236         uint32_t  esi; /*  4 */
237         uint32_t  ebp; /*  8 */
238         uint32_t  esp; /* 12 */
239         uint32_t  ebx; /* 16 */
240         uint32_t  edx; /* 20 */
241         uint32_t  ecx; /* 24 */
242         uint32_t  eax; /* 28 */
243         
244         uint32_t saved_ebp; /* 32 */
245         uint32_t saved_esi; /* 36 */
246         uint32_t saved_edi; /* 40 */
247         uint32_t saved_ebx; /* 44 */
248         uint32_t saved_eip; /* 48 */
249         uint32_t saved_esp; /* 52 */
250 };
251 struct regs {
252         /* Be careful changing this structure
253          * as it is used by assembly language code.
254          */
255         uint32_t  edi; /*  0 */
256         uint32_t  esi; /*  4 */
257         uint32_t  ebp; /*  8 */
258         uint32_t  esp; /* 12 */
259         uint32_t  ebx; /* 16 */
260         uint32_t  edx; /* 20 */
261         uint32_t  ecx; /* 24 */
262         uint32_t  eax; /* 28 */
263 };
264 extern struct os_entry_regs os_regs;
265 extern struct regs initial_regs;
266 extern int xstart32(unsigned long entry_point, ...);
267 extern int xstart_lm(unsigned long entry_point, unsigned long params);
268 extern void xend32 P((void));
269 struct Elf_Bhdr *prepare_boot_params(void *header);
270 extern int elf_start(unsigned long machine, unsigned long entry, unsigned long params);
271 extern unsigned long currticks P((void));
272 extern void exit P((int status));
273
274 /* serial.c */
275 extern int serial_getc P((void));
276 extern void serial_putc P((int));
277 extern int serial_ischar P((void));
278 extern int serial_init P((void));
279 extern void serial_fini P((void));
280
281 /* floppy.c */
282 extern int bootdisk P((int dev,int part));
283
284 /***************************************************************************
285 External variables
286 ***************************************************************************/
287 /* main.c */
288 extern struct rom_info rom;
289 extern char *hostname;
290 extern int hostnamelen;
291 extern jmp_buf restart_etherboot;
292 extern int url_port;
293 extern struct arptable_t arptable[MAX_ARP];
294 extern struct igmptable_t igmptable[MAX_IGMP];
295 #ifdef  IMAGE_MENU
296 extern int menutmo,menudefault;
297 extern unsigned char *defparams;
298 extern int defparams_max;
299 #endif
300 #ifdef  MOTD
301 extern unsigned char *motd[RFC1533_VENDOR_NUMOFMOTD];
302 #endif
303 extern struct bootpd_t bootp_data;
304 #define BOOTP_DATA_ADDR (&bootp_data)
305 extern unsigned char *end_of_rfc1533;
306 #ifdef  IMAGE_FREEBSD
307 extern int freebsd_howto;
308 #define FREEBSD_KERNEL_ENV_SIZE 256
309 extern char freebsd_kernel_env[FREEBSD_KERNEL_ENV_SIZE];
310 #endif
311
312 /* bootmenu.c */
313
314 /* osloader.c */
315
316 /* created by linker */
317 extern char _virt_start[], _text[], _etext[], _text16[], _etext16[];
318 extern char _data[], _edata[], _bss[], _ebss[], _end[];
319
320
321 /*
322  * Local variables:
323  *  c-basic-offset: 8
324  * End:
325  */
326
327 #endif /* ETHERBOOT_H */