Updates to -DPXE_DHCP_STRICT from Roland Kuhn
[etherboot.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 #undef CODE16
35 #if defined(PCBIOS)
36 #define CODE16
37 #endif
38
39 #define K_ESC           '\033'
40 #define K_EOF           '\04'  /* Ctrl-D */
41 #define K_INTR          '\03'  /* Ctrl-C */
42
43 /*  Edit this to change the path to hostspecific kernel image
44     kernel.<client_ip_address> in RARP boot */
45 #ifndef DEFAULT_KERNELPATH
46 #define DEFAULT_KERNELPATH      "/tftpboot/kernel.%@"
47 #endif
48
49 #ifdef FREEBSD_PXEEMU
50 #undef DEFAULT_BOOTFILE
51 #ifndef PXENFSROOTPATH
52 #define PXENFSROOTPATH ""
53 #endif
54 #define DEFAULT_BOOTFILE        PXENFSROOTPATH "/boot/pxeboot"
55 #endif
56
57 /* Clean up console settings... mainly CONSOLE_FIRMWARE and CONSOLE_SERIAL are used
58  * in the sources (except start.S and serial.S which cannot include
59  * etherboot.h).  At least one of the CONSOLE_xxx has to be set, and
60  * CONSOLE_DUAL sets both CONSOLE_CRT and CONSOLE_SERIAL.  If none is set,
61  * CONSOLE_CRT is assumed.  */
62 #ifdef CONSOLE_CRT
63 #define CONSOLE_FIRMWARE
64 #endif
65 #ifdef  CONSOLE_DUAL
66 #undef CONSOLE_FIRMWARE
67 #define CONSOLE_FIRMWARE
68 #undef CONSOLE_SERIAL
69 #define CONSOLE_SERIAL
70 #endif
71 #if     defined(CONSOLE_FIRMWARE) && defined(CONSOLE_SERIAL)
72 #undef CONSOLE_DUAL
73 #define CONSOLE_DUAL
74 #endif
75 #if     !defined(CONSOLE_FIRMWARE) && !defined(CONSOLE_SERIAL)
76 #define CONSOLE_FIRMWARE
77 #endif
78
79 #if     !defined(DOWNLOAD_PROTO_TFTP) && !defined(DOWNLOAD_PROTO_NFS) && !defined(DOWNLOAD_PROTO_SLAM) && !defined(DOWNLOAD_PROTO_TFTM) && !defined(DOWNLOAD_PROTO_DISK) && !defined(DOWNLOAD_PROTO_HTTP) && !defined(DOWNLOAD_PROTO_FSP)
80 #error No download protocol defined!
81 #endif
82
83 #ifndef MAX_TFTP_RETRIES
84 #define MAX_TFTP_RETRIES        20
85 #endif
86
87 #ifndef MAX_BOOTP_RETRIES
88 #define MAX_BOOTP_RETRIES       20
89 #endif
90
91 #define MAX_BOOTP_EXTLEN        (ETH_MAX_MTU-sizeof(struct bootpip_t))
92
93 #ifndef MAX_ARP_RETRIES
94 #define MAX_ARP_RETRIES         20
95 #endif
96
97 #ifndef MAX_RPC_RETRIES
98 #define MAX_RPC_RETRIES         20
99 #endif
100
101 /* Link configuration time in tenths of a second */
102 #ifndef VALID_LINK_TIMEOUT
103 #define VALID_LINK_TIMEOUT      100 /* 10.0 seconds */
104 #endif
105
106 /* Inter-packet retry in ticks */
107 #ifndef TIMEOUT
108 #define TIMEOUT                 (10*TICKS_PER_SEC)
109 #endif
110
111 #ifndef BOOTP_TIMEOUT
112 #define BOOTP_TIMEOUT           (2*TICKS_PER_SEC)
113 #endif
114
115 /* Max interval between IGMP packets */
116 #define IGMP_INTERVAL                   (10*TICKS_PER_SEC)
117 #define IGMPv1_ROUTER_PRESENT_TIMEOUT   (400*TICKS_PER_SEC)
118
119 /* These settings have sense only if compiled with -DCONGESTED */
120 /* total retransmission timeout in ticks */
121 #define TFTP_TIMEOUT            (30*TICKS_PER_SEC)
122 /* packet retransmission timeout in ticks */
123 #ifdef CONGESTED
124 #define TFTP_REXMT              (3*TICKS_PER_SEC)
125 #else
126 #define TFTP_REXMT              TIMEOUT
127 #endif
128
129 #ifndef NULL
130 #define NULL    ((void *)0)
131 #endif
132
133 #include        "if_ether.h"
134
135 enum {
136         ARP_CLIENT, ARP_SERVER, ARP_GATEWAY,
137 #ifdef DNS_RESOLVER
138         ARP_NAMESERVER,
139 #endif
140 #ifdef PXE_EXPORT
141         ARP_PROXYDHCP,
142 #endif
143         MAX_ARP
144 };
145
146 #define IGMP_SERVER     0
147 #define MAX_IGMP        IGMP_SERVER+1
148
149 #define RARP_REQUEST    3
150 #define RARP_REPLY      4
151
152 #include        "in.h"
153
154 #define MULTICAST_MASK    0xF0000000
155 #define MULTICAST_NETWORK 0xE0000000
156
157 /* Helper macros used to identify when DHCP options are valid/invalid in/outside of encapsulation */
158 /* helpers for decoding RFC1533_VENDOR encapsulated options */
159 #ifdef PXE_DHCP_STRICT
160 #define PXE_ENCAP_OPT in_pxe_encapsulated_options == 1 &&
161 #define PXE_NONENCAP_OPT in_pxe_encapsulated_options == 0 &&
162 #else
163 #define PXE_ENCAP_OPT
164 #define PXE_NONENCAP_OPT
165 #endif /* PXE_DHCP_STRICT */
166
167 #define NON_ENCAP_OPT in_encapsulated_options == 0 && PXE_NONENCAP_OPT
168 #ifdef ALLOW_ONLY_ENCAPSULATED
169 #define ENCAP_OPT in_encapsulated_options == 1 &&
170 #else
171 #define ENCAP_OPT PXE_NONENCAP_OPT
172 #endif
173
174 #include        "if_arp.h"
175 #include        "ip.h"
176 #include        "udp.h"
177 #include        "tcp.h"
178 #include        "bootp.h"
179 #include        "tftp.h"
180 #include        "igmp.h"
181 #include        "nfs.h"
182
183 struct arptable_t {
184         in_addr ipaddr;
185         uint8_t node[6];
186 } PACKED;
187
188 struct igmptable_t {
189         in_addr group;
190         unsigned long time;
191 } PACKED;
192
193 #define KERNEL_BUF      (bootp_data.bootp_reply.bp_file)
194
195 #define FLOPPY_BOOT_LOCATION    0x7c00
196
197 struct rom_info {
198         unsigned short  rom_segment;
199         unsigned short  rom_length;
200 };
201
202 extern inline int rom_address_ok(struct rom_info *rom, int assigned_rom_segment)
203 {
204         return (assigned_rom_segment < 0xC000
205                 || assigned_rom_segment == rom->rom_segment);
206 }
207
208 /* Define a type for passing info to a loaded program */
209 struct ebinfo {
210         uint8_t  major, minor;  /* Version */
211         uint16_t flags;         /* Bit flags */
212 };
213
214 /***************************************************************************
215 External prototypes
216 ***************************************************************************/
217 /* main.c */
218 struct Elf_Bhdr;
219 extern int in_call(in_call_data_t *data, uint32_t opcode, va_list params);
220 extern void console_init(void); 
221 extern int main(in_call_data_t *data, va_list params);
222 extern int loadkernel P((const char *fname));
223 extern char as_main_program;
224 /* nic.c */
225 extern void rx_qdrain P((void));
226 extern int tftp P((const char *name, int (*)(unsigned char *, unsigned int, unsigned int, int)));
227 extern int tftp_block P((struct tftpreq_info_t *, struct tftpblk_info_t *));
228 extern int ip_transmit P((int len, const void *buf));
229 extern void build_ip_hdr P((unsigned long destip, int ttl, int protocol, 
230         int option_len, int len, const void *buf));
231 extern void build_udp_hdr P((unsigned long destip, 
232         unsigned int srcsock, unsigned int destsock, int ttl,
233         int len, const void *buf));
234 extern int udp_transmit P((unsigned long destip, unsigned int srcsock,
235         unsigned int destsock, int len, const void *buf));
236 extern int tcp_transmit(unsigned long destip, unsigned int srcsock,
237                        unsigned int destsock, long send_seq, long recv_seq,
238                        int window, int flags, int len, const void *buf);
239 int tcp_reset(struct iphdr *ip);
240 typedef int (*reply_t)(int ival, void *ptr, unsigned short ptype, struct iphdr *ip, struct udphdr *udp, struct tcphdr *tcp);
241 extern int await_reply P((reply_t reply,        int ival, void *ptr, long timeout));
242 extern int decode_rfc1533 P((unsigned char *, unsigned int, unsigned int, int));
243 extern void join_group(int slot, unsigned long group);
244 extern void leave_group(int slot);
245 #define RAND_MAX 2147483647L
246 extern uint16_t ipchksum P((const void *ip, unsigned long len));
247 extern uint16_t add_ipchksums P((unsigned long offset, uint16_t sum, uint16_t new));
248 extern int32_t random P((void));
249 extern long rfc2131_sleep_interval P((long base, int exp));
250 extern long rfc1112_sleep_interval P((long base, int exp));
251 #ifndef DOWNLOAD_PROTO_TFTP
252 #define tftp(fname, load_block) 0
253 #endif
254 extern void cleanup P((void));
255
256 /* nfs.c */
257 extern void rpc_init(void);
258 extern int nfs P((const char *name, int (*)(unsigned char *, unsigned int, unsigned int, int)));
259 extern void nfs_umountall P((int));
260
261 /* proto_slam.c */
262 extern int url_slam P((const char *name, int (*fnc)(unsigned char *, unsigned int, unsigned int, int)));
263
264 /* proto_tftm.c */
265 extern int url_tftm P((const char *name, int (*fnc)(unsigned char *, unsigned int, unsigned int, int)));
266
267 /* proto_fsp.c */
268 extern int url_fsp P((const char *name, int (*fnc)(unsigned char *, unsigned int, unsigned int, int)));
269
270 /* config.c */
271 extern void print_config(void);
272
273 /* isa_probe.c and pci_probe.c */
274 struct dev;
275 extern void isa_enumerate(void);
276 extern int isa_probe(struct dev *, const char *);
277 extern void pci_enumerate(void);
278 extern int pci_probe(struct dev *, const char *);
279
280 /* heap.c */
281 extern void init_heap(void);
282 extern void *allot(size_t size);
283 void forget(void *ptr);
284 extern void *allot2(size_t size, uint32_t mask);
285 void forget2(void *ptr);
286 /* Physical address of the heap */
287 extern size_t heap_ptr, heap_top, heap_bot;
288
289 /* osloader.c */
290 /* Be careful with sector_t it is an unsigned long long on x86 */
291 typedef uint64_t sector_t;
292 typedef sector_t (*os_download_t)(unsigned char *data, unsigned int len, int eof);
293 extern os_download_t probe_image(unsigned char *data, unsigned int len);
294 extern int load_block P((unsigned char *, unsigned int, unsigned int, int ));
295
296 /* misc.c */
297 extern void twiddle P((void));
298 extern void sleep P((int secs));
299 extern void interruptible_sleep P((int secs));
300 extern void poll_interruptions P((void));
301 extern int strcasecmp P((const char *a, const char *b));
302 extern char *substr P((const char *a, const char *b));
303 extern unsigned long strtoul P((const char *p, const char **, int base));
304 extern int printf P((const char *, ...));
305 extern int sprintf P((char *, const char *, ...));
306 extern int inet_aton P((const char *p, in_addr *i));
307 #ifdef PCBIOS
308 extern void gateA20_set P((void));
309 #define gateA20_unset()
310 #else
311 #define gateA20_set()
312 #define gateA20_unset()
313 #endif
314 extern void putchar P((int));
315 extern int getchar P((void));
316 extern int iskey P((void));
317
318 /* pcbios.S */
319 extern int console_getc P((void));
320 extern void console_putc P((int));
321 extern int console_ischar P((void));
322 extern int getshift P((void));
323 extern int int15 P((int));
324 #ifdef  POWERSAVE
325 extern void cpu_nap P((void));
326 #endif  /* POWERSAVE */
327
328 /* basemem.c */
329 extern uint32_t get_free_base_memory ( void );
330 extern void allot_real_mode_stack ( void );
331 extern void forget_real_mode_stack ( void );
332 extern void * allot_base_memory ( size_t );
333 extern void forget_base_memory ( void*, size_t );
334 extern void forget_prefix_base_memory ( void );
335 extern void forget_runtime_base_memory ( uint32_t old_addr );
336
337 struct e820entry {
338         uint64_t addr;
339         uint64_t size;
340         uint32_t type;
341 #define E820_RAM        1
342 #define E820_RESERVED   2
343 #define E820_ACPI       3 /* usable as RAM once ACPI tables have been read */
344 #define E820_NVS        4
345 } PACKED;
346 #define E820ENTRY_SIZE 20
347 #define E820MAX 32
348 struct meminfo {
349         uint16_t basememsize;
350         uint16_t pad;
351         uint32_t memsize;
352         uint32_t map_count;
353         struct e820entry map[E820MAX];
354 } PACKED;
355 extern struct meminfo meminfo;
356 extern void get_memsizes(void);
357 extern unsigned long get_boot_order(unsigned long order, unsigned *index);
358 #ifndef NORELOCATE
359 extern void relocate(void);
360 extern void relocate_to(unsigned long phys_dest);
361 #else
362 #define relocate() do {} while(0)
363 #endif
364 extern void disk_init P((void));
365 extern unsigned int pcbios_disk_read P((int drv,int c,int h,int s,char *buf));
366
367 /* start32.S */
368 struct os_entry_regs {
369         /* Be careful changing this structure
370          * as it is used by assembly language code.
371          */
372         uint32_t  edi; /*  0 */
373         uint32_t  esi; /*  4 */
374         uint32_t  ebp; /*  8 */
375         uint32_t  esp; /* 12 */
376         uint32_t  ebx; /* 16 */
377         uint32_t  edx; /* 20 */
378         uint32_t  ecx; /* 24 */
379         uint32_t  eax; /* 28 */
380         
381         uint32_t saved_ebp; /* 32 */
382         uint32_t saved_esi; /* 36 */
383         uint32_t saved_edi; /* 40 */
384         uint32_t saved_ebx; /* 44 */
385         uint32_t saved_eip; /* 48 */
386         uint32_t saved_esp; /* 52 */
387 };
388 struct regs {
389         /* Be careful changing this structure
390          * as it is used by assembly language code.
391          */
392         uint32_t  edi; /*  0 */
393         uint32_t  esi; /*  4 */
394         uint32_t  ebp; /*  8 */
395         uint32_t  esp; /* 12 */
396         uint32_t  ebx; /* 16 */
397         uint32_t  edx; /* 20 */
398         uint32_t  ecx; /* 24 */
399         uint32_t  eax; /* 28 */
400 };
401 extern struct os_entry_regs os_regs;
402 extern struct regs initial_regs;
403 extern int xstart32(unsigned long entry_point, ...);
404 extern int xstart_lm(unsigned long entry_point, unsigned long params);
405 extern void xend32 P((void));
406 struct Elf_Bhdr *prepare_boot_params(void *header);
407 extern int elf_start(unsigned long machine, unsigned long entry, unsigned long params);
408 extern unsigned long currticks P((void));
409 extern void exit P((int status));
410 extern void _stack;
411 extern char _prefix_copy[512];
412 extern uint32_t image_basemem;
413
414 /* serial.c */
415 extern int serial_getc P((void));
416 extern void serial_putc P((int));
417 extern int serial_ischar P((void));
418 extern int serial_init P((void));
419 extern void serial_fini P((void));
420
421 /* floppy.c */
422 extern int bootdisk P((int dev,int part));
423
424 /* pxe_callbacks.c */
425 extern int pxe_in_call ( in_call_data_t *in_call_data, va_list params );
426
427 /***************************************************************************
428 External variables
429 ***************************************************************************/
430 /* main.c */
431 extern jmp_buf restart_etherboot;
432 extern int url_port;
433 /* nic.c */
434 extern struct rom_info rom;
435 extern struct arptable_t arptable[MAX_ARP];
436 extern struct igmptable_t igmptable[MAX_IGMP];
437 extern char *hostname;
438 extern int hostnamelen;
439 extern unsigned char *addparam;
440 extern int addparamlen;
441 extern struct bootpd_t bootp_data;
442 extern unsigned char *end_of_rfc1533;
443 #ifdef  IMAGE_FREEBSD
444 extern int freebsd_howto;
445 #define FREEBSD_KERNEL_ENV_SIZE 256
446 extern char freebsd_kernel_env[FREEBSD_KERNEL_ENV_SIZE];
447 #endif
448
449 /* osloader.c */
450
451 /* created by linker */
452 extern char _virt_start[], _text[], _etext[], _text16[], _etext16[];
453 extern char _data[], _edata[], _bss[], _ebss[], _end[];
454
455
456 /*
457  * Local variables:
458  *  c-basic-offset: 8
459  * End:
460  */
461
462 #endif /* ETHERBOOT_H */