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