blob: 6ce55c1017296b43dfeb26b508e91a60f37bde03 [file] [log] [blame]
#ifndef ETHERBOOT_H
#define ETHERBOOT_H
/*
* Standard includes that we always want
*
*/
#include "compiler.h"
#include "stddef.h"
#include "stdint.h"
/*
* IMPORTANT!!!!!!!!!!!!!!
*
* Everything below this point is cruft left over from older versions
* of Etherboot. Do not add *anything* below this point. Things are
* gradually being moved to individual header files.
*
*/
#include <stdarg.h>
#include "osdep.h"
#ifndef BOOT_FIRST
#define BOOT_FIRST BOOT_NIC
#endif
#ifndef BOOT_SECOND
#define BOOT_SECOND BOOT_NOTHING
#endif
#ifndef BOOT_THIRD
#define BOOT_THIRD BOOT_NOTHING
#endif
#define DEFAULT_BOOT_ORDER ( \
(BOOT_FIRST << (0*BOOT_BITS)) | \
(BOOT_SECOND << (1*BOOT_BITS)) | \
(BOOT_THIRD << (2*BOOT_BITS)) | \
(BOOT_NOTHING << (3*BOOT_BITS)) | \
0)
#ifdef BOOT_INDEX
#define DEFAULT_BOOT_INDEX BOOT_INDEX
#else
#define DEFAULT_BOOT_INDEX 0
#endif
#if !defined(TAGGED_IMAGE) && !defined(AOUT_IMAGE) && !defined(ELF_IMAGE) && !defined(ELF64_IMAGE) && !defined(COFF_IMAGE) && !defined(RAW_IMAGE)
#define TAGGED_IMAGE /* choose at least one */
#endif
#define K_ESC '\033'
#define K_EOF '\04' /* Ctrl-D */
#define K_INTR '\03' /* Ctrl-C */
/* Edit this to change the path to hostspecific kernel image
kernel.<client_ip_address> in RARP boot */
#ifndef DEFAULT_KERNELPATH
#define DEFAULT_KERNELPATH "/tftpboot/kernel.%@"
#endif
#ifdef FREEBSD_PXEEMU
#undef DEFAULT_BOOTFILE
#ifndef PXENFSROOTPATH
#define PXENFSROOTPATH ""
#endif
#define DEFAULT_BOOTFILE PXENFSROOTPATH "/boot/pxeboot"
#endif
#ifndef MAX_TFTP_RETRIES
#define MAX_TFTP_RETRIES 20
#endif
#ifndef MAX_BOOTP_RETRIES
#define MAX_BOOTP_RETRIES 20
#endif
#define MAX_BOOTP_EXTLEN (ETH_MAX_MTU-sizeof(struct bootpip_t))
#ifndef MAX_ARP_RETRIES
#define MAX_ARP_RETRIES 20
#endif
#ifndef MAX_RPC_RETRIES
#define MAX_RPC_RETRIES 20
#endif
/* Link configuration time in tenths of a second */
#ifndef VALID_LINK_TIMEOUT
#define VALID_LINK_TIMEOUT 100 /* 10.0 seconds */
#endif
/* Inter-packet retry in ticks */
#ifndef TIMEOUT
#define TIMEOUT (10*TICKS_PER_SEC)
#endif
#ifndef BOOTP_TIMEOUT
#define BOOTP_TIMEOUT (2*TICKS_PER_SEC)
#endif
/* Max interval between IGMP packets */
#define IGMP_INTERVAL (10*TICKS_PER_SEC)
#define IGMPv1_ROUTER_PRESENT_TIMEOUT (400*TICKS_PER_SEC)
/* These settings have sense only if compiled with -DCONGESTED */
/* total retransmission timeout in ticks */
#define TFTP_TIMEOUT (30*TICKS_PER_SEC)
/* packet retransmission timeout in ticks */
#ifdef CONGESTED
#define TFTP_REXMT (3*TICKS_PER_SEC)
#else
#define TFTP_REXMT TIMEOUT
#endif
#ifndef NULL
#define NULL ((void *)0)
#endif
#include "if_ether.h"
enum {
ARP_CLIENT, ARP_SERVER, ARP_GATEWAY,
ARP_NAMESERVER,
#ifdef PXE_EXPORT
ARP_PROXYDHCP,
#endif
MAX_ARP
};
#define RARP_REQUEST 3
#define RARP_REPLY 4
#include <gpxe/in.h>
/* Helper macros used to identify when DHCP options are valid/invalid in/outside of encapsulation */
#define NON_ENCAP_OPT in_encapsulated_options == 0 &&
#ifdef ALLOW_ONLY_ENCAPSULATED
#define ENCAP_OPT in_encapsulated_options == 1 &&
#else
#define ENCAP_OPT
#endif
#include "if_arp.h"
#include "ip.h"
#include "udp.h"
#include "old_tcp.h"
#include "bootp.h"
#include "igmp.h"
#include "nfs.h"
#include "console.h"
#include "stdlib.h"
struct arptable_t {
struct in_addr ipaddr;
uint8_t node[6];
} PACKED;
#define KERNEL_BUF (bootp_data.bootp_reply.bp_file)
#define FLOPPY_BOOT_LOCATION 0x7c00
struct rom_info {
unsigned short rom_segment;
unsigned short rom_length;
};
extern inline int rom_address_ok(struct rom_info *rom, int assigned_rom_segment)
{
return (assigned_rom_segment < 0xC000
|| assigned_rom_segment == rom->rom_segment);
}
/* Define a type for passing info to a loaded program */
struct ebinfo {
uint8_t major, minor; /* Version */
uint16_t flags; /* Bit flags */
};
/***************************************************************************
External prototypes
***************************************************************************/
/* main.c */
struct Elf_Bhdr;
extern int main();
extern char as_main_program;
/* nic.c */
extern void rx_qdrain P((void));
extern int ip_transmit P((int len, const void *buf));
extern void build_ip_hdr P((unsigned long destip, int ttl, int protocol,
int option_len, int len, const void *buf));
extern void build_udp_hdr P((unsigned long destip,
unsigned int srcsock, unsigned int destsock, int ttl,
int len, const void *buf));
extern int udp_transmit P((unsigned long destip, unsigned int srcsock,
unsigned int destsock, int len, const void *buf));
extern int tcp_transmit(unsigned long destip, unsigned int srcsock,
unsigned int destsock, long send_seq, long recv_seq,
int window, int flags, int len, const void *buf);
int tcp_reset(struct iphdr *ip);
typedef int (*reply_t)(int ival, void *ptr, unsigned short ptype, struct iphdr *ip, struct udphdr *udp, struct tcphdr *tcp);
extern int await_reply P((reply_t reply, int ival, void *ptr, long timeout));
extern int decode_rfc1533 P((unsigned char *, unsigned int, unsigned int, int));
#define RAND_MAX 2147483647L
extern uint16_t ipchksum P((const void *ip, unsigned long len));
extern uint16_t add_ipchksums P((unsigned long offset, uint16_t sum, uint16_t new));
extern int32_t random P((void));
extern long rfc2131_sleep_interval P((long base, int exp));
extern void cleanup P((void));
/* osloader.c */
/* Be careful with sector_t it is an unsigned long long on x86 */
typedef uint64_t sector_t;
typedef sector_t (*os_download_t)(unsigned char *data, unsigned int len, int eof);
extern os_download_t probe_image(unsigned char *data, unsigned int len);
extern int load_block P((unsigned char *, unsigned int, unsigned int, int ));
/* misc.c */
extern void twiddle P((void));
extern void sleep P((int secs));
extern void interruptible_sleep P((int secs));
extern void poll_interruptions P((void));
extern int strcasecmp P((const char *a, const char *b));
extern char *substr P((const char *a, const char *b));
extern unsigned long get_boot_order(unsigned long order, unsigned *index);
extern void disk_init P((void));
extern unsigned int pcbios_disk_read P((int drv,int c,int h,int s,char *buf));
/* start32.S */
struct os_entry_regs {
/* Be careful changing this structure
* as it is used by assembly language code.
*/
uint32_t edi; /* 0 */
uint32_t esi; /* 4 */
uint32_t ebp; /* 8 */
uint32_t esp; /* 12 */
uint32_t ebx; /* 16 */
uint32_t edx; /* 20 */
uint32_t ecx; /* 24 */
uint32_t eax; /* 28 */
uint32_t saved_ebp; /* 32 */
uint32_t saved_esi; /* 36 */
uint32_t saved_edi; /* 40 */
uint32_t saved_ebx; /* 44 */
uint32_t saved_eip; /* 48 */
uint32_t saved_esp; /* 52 */
};
struct regs {
/* Be careful changing this structure
* as it is used by assembly language code.
*/
uint32_t edi; /* 0 */
uint32_t esi; /* 4 */
uint32_t ebp; /* 8 */
uint32_t esp; /* 12 */
uint32_t ebx; /* 16 */
uint32_t edx; /* 20 */
uint32_t ecx; /* 24 */
uint32_t eax; /* 28 */
};
extern struct os_entry_regs os_regs;
extern struct regs initial_regs;
extern int xstart32(unsigned long entry_point, ...);
extern int xstart_lm(unsigned long entry_point, unsigned long params);
extern void xend32 P((void));
struct Elf_Bhdr *prepare_boot_params(void *header);
extern int elf_start(unsigned long machine, unsigned long entry, unsigned long params);
extern unsigned long currticks P((void));
extern void exit P((int status));
/***************************************************************************
External variables
***************************************************************************/
/* main.c */
extern struct rom_info rom;
extern char *hostname;
extern int hostnamelen;
extern unsigned char *addparam;
extern int addparamlen;
extern jmp_buf restart_etherboot;
extern int url_port;
extern struct arptable_t arptable[MAX_ARP];
#ifdef IMAGE_MENU
extern int menutmo,menudefault;
extern unsigned char *defparams;
extern int defparams_max;
#endif
#ifdef MOTD
extern unsigned char *motd[RFC1533_VENDOR_NUMOFMOTD];
#endif
extern struct bootpd_t bootp_data;
#define BOOTP_DATA_ADDR (&bootp_data)
extern unsigned char *end_of_rfc1533;
#ifdef IMAGE_FREEBSD
extern int freebsd_howto;
#define FREEBSD_KERNEL_ENV_SIZE 256
extern char freebsd_kernel_env[FREEBSD_KERNEL_ENV_SIZE];
#endif
/*
* Local variables:
* c-basic-offset: 8
* End:
*/
#endif /* ETHERBOOT_H */