📄 etherboot.h
字号:
/**************************************************************************ETHERBOOT - BOOTP/TFTP Bootstrap ProgramAuthor: Martin Renters Date: Dec/93**************************************************************************/#include "osdep.h"/* These could be customised for different languages perhaps */#define ASK_PROMPT "Boot from (N)etwork or from (L)ocal? "#define ANS_NETWORK 'N'#define ANS_LOCAL 'L'#ifndef ANS_DEFAULT /* in case left out in Makefile */#define ANS_DEFAULT ANS_NETWORK#endif#define TAGGED_IMAGE /* eventually optional */#if !defined(TAGGED_IMAGE) && !defined(AOUT_IMAGE) && !defined(ELF_IMAGE)#define TAGGED_IMAGE /* choose at least one */#endif#define ESC 0x1B#ifndef DEFAULT_BOOTFILE#define DEFAULT_BOOTFILE "/tftpboot/kernel"#endif/* Clean up console settings... mainly CONSOLE_CRT and CONSOLE_SERIAL are used * in the sources (except start.S and serial.S which cannot include * etherboot.h). At least one of the CONSOLE_xxx has to be set, and * CONSOLE_DUAL sets both CONSOLE_CRT and CONSOLE_SERIAL. If none is set, * CONSOLE_CRT is assumed. */#ifdef CONSOLE_DUAL#undef CONSOLE_CRT#define CONSOLE_CRT#undef CONSOLE_SERIAL#define CONSOLE_SERIAL#endif#if defined(CONSOLE_CRT) && defined(CONSOLE_SERIAL)#undef CONSOLE_DUAL#define CONSOLE_DUAL#endif#if !defined(CONSOLE_CRT) && !defined(CONSOLE_SERIAL)#define CONSOLE_CRT#endif#ifndef DOWNLOAD_PROTO_NFS#undef DOWNLOAD_PROTO_TFTP#define DOWNLOAD_PROTO_TFTP /* default booting protocol */#endif#ifdef DOWNLOAD_PROTO_TFTP#define download(fname,loader) tftp((fname),(loader))#endif#ifdef DOWNLOAD_PROTO_NFS#define download(fname,loader) nfs((fname),(loader))#endif#ifndef MAX_TFTP_RETRIES#define MAX_TFTP_RETRIES 20#endif#ifndef MAX_BOOTP_RETRIES#define MAX_BOOTP_RETRIES 20#endif#ifndef MAX_BOOTP_EXTLEN#if (RELOC < 0x94000)/* Force internal buffer (if external buffer would overlap with our code...) */#undef INTERNAL_BOOTP_DATA#define INTERNAL_BOOTP_DATA#endif/* sizeof(struct bootp_t) == 0x240 */#if defined(INTERNAL_BOOTP_DATA) || (RELOC >= 0x94240)#define MAX_BOOTP_EXTLEN 1024#else#define MAX_BOOTP_EXTLEN (1024-sizeof(struct bootp_t))#endif#endif#ifndef MAX_ARP_RETRIES#define MAX_ARP_RETRIES 20#endif#ifndef MAX_RPC_RETRIES#define MAX_RPC_RETRIES 20#endif#define TICKS_PER_SEC 18/* Inter-packet retry in ticks */#define TIMEOUT (10*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 */#define TFTP_REXMT (3*TICKS_PER_SEC)#ifndef NULL#define NULL ((void *)0)#endif#define TRUE 1#define FALSE 0#define ETHER_ADDR_SIZE 6 /* Size of Ethernet address */#define ETHER_HDR_SIZE 14 /* Size of ethernet header */#define ETH_MIN_PACKET 64#define ETH_MAX_PACKET 1518#define VENDOR_NONE 0#define VENDOR_WD 1#define VENDOR_NOVELL 2#define VENDOR_3COM 3#define VENDOR_3C509 4#define VENDOR_CS89x0 5#define FLAG_PIO 0x01#define FLAG_16BIT 0x02#define FLAG_790 0x04#define ARP_CLIENT 0#define ARP_SERVER 1#define ARP_GATEWAY 2#define ARP_ROOTSERVER 3#define ARP_SWAPSERVER 4#define MAX_ARP ARP_SWAPSERVER+1#define RARP_REQUEST 3#define RARP_REPLY 4#define IP 0x0800#define ARP 0x0806#define RARP 0x8035#define BOOTP_SERVER 67#define BOOTP_CLIENT 68#define TFTP_PORT 69#define SUNRPC_PORT 111#define IP_UDP 17/* Same after going through htonl */#define IP_BROADCAST 0xFFFFFFFF#define ARP_REQUEST 1#define ARP_REPLY 2#define BOOTP_REQUEST 1#define BOOTP_REPLY 2#define TAG_LEN(p) (*((p)+1))#define RFC1533_COOKIE 99, 130, 83, 99#define RFC1533_PAD 0#define RFC1533_NETMASK 1#define RFC1533_TIMEOFFSET 2#define RFC1533_GATEWAY 3#define RFC1533_TIMESERVER 4#define RFC1533_IEN116NS 5#define RFC1533_DNS 6#define RFC1533_LOGSERVER 7#define RFC1533_COOKIESERVER 8#define RFC1533_LPRSERVER 9#define RFC1533_IMPRESSSERVER 10#define RFC1533_RESOURCESERVER 11#define RFC1533_HOSTNAME 12#define RFC1533_BOOTFILESIZE 13#define RFC1533_MERITDUMPFILE 14#define RFC1533_DOMAINNAME 15#define RFC1533_SWAPSERVER 16#define RFC1533_ROOTPATH 17#define RFC1533_EXTENSIONPATH 18#define RFC1533_IPFORWARDING 19#define RFC1533_IPSOURCEROUTING 20#define RFC1533_IPPOLICYFILTER 21#define RFC1533_IPMAXREASSEMBLY 22#define RFC1533_IPTTL 23#define RFC1533_IPMTU 24#define RFC1533_IPMTUPLATEAU 25#define RFC1533_INTMTU 26#define RFC1533_INTLOCALSUBNETS 27#define RFC1533_INTBROADCAST 28#define RFC1533_INTICMPDISCOVER 29#define RFC1533_INTICMPRESPOND 30#define RFC1533_INTROUTEDISCOVER 31#define RFC1533_INTROUTESOLICIT 32#define RFC1533_INTSTATICROUTES 33#define RFC1533_LLTRAILERENCAP 34#define RFC1533_LLARPCACHETMO 35#define RFC1533_LLETHERNETENCAP 36#define RFC1533_TCPTTL 37#define RFC1533_TCPKEEPALIVETMO 38#define RFC1533_TCPKEEPALIVEGB 39#define RFC1533_NISDOMAIN 40#define RFC1533_NISSERVER 41#define RFC1533_NTPSERVER 42#define RFC1533_VENDOR 43#define RFC1533_NBNS 44#define RFC1533_NBDD 45#define RFC1533_NBNT 46#define RFC1533_NBSCOPE 47#define RFC1533_XFS 48#define RFC1533_XDM 49#ifndef NO_DHCP_SUPPORT#define RFC2132_REQ_ADDR 50#define RFC2132_MSG_TYPE 53#define RFC2132_SRV_ID 54#define RFC2132_PARAM_LIST 55#define RFC2132_MAX_SIZE 57#define DHCPDISCOVER 1#define DHCPOFFER 2#define DHCPREQUEST 3#define DHCPACK 5#endif /* NO_DHCP_SUPPORT */#define RFC1533_VENDOR_MAJOR 0#define RFC1533_VENDOR_MINOR 0#define RFC1533_VENDOR_MAGIC 128#define RFC1533_VENDOR_ADDPARM 129#ifdef IMAGE_FREEBSD#define RFC1533_VENDOR_HOWTO 132#endif#define RFC1533_VENDOR_MNUOPTS 160#define RFC1533_VENDOR_SELECTION 176#define RFC1533_VENDOR_MOTD 184#define RFC1533_VENDOR_NUMOFMOTD 8#define RFC1533_VENDOR_IMG 192#define RFC1533_VENDOR_NUMOFIMG 16#define RFC1533_END 255#define BOOTP_VENDOR_LEN 64#ifndef NO_DHCP_SUPPORT#define DHCP_OPT_LEN 312#endif /* NO_DHCP_SUPPORT */#define TFTP_DEFAULTSIZE_PACKET 512#define TFTP_MAX_PACKET 1432 /* 512 */#define TFTP_RRQ 1#define TFTP_WRQ 2#define TFTP_DATA 3#define TFTP_ACK 4#define TFTP_ERROR 5#define TFTP_OACK 6#define TFTP_CODE_EOF 1#define TFTP_CODE_MORE 2#define TFTP_CODE_ERROR 3#define TFTP_CODE_BOOT 4#define TFTP_CODE_CFG 5#define AWAIT_ARP 0#define AWAIT_BOOTP 1#define AWAIT_TFTP 2#define AWAIT_RARP 3#define AWAIT_RPC 4#define AWAIT_QDRAIN 5 /* drain queue, process ARP requests */typedef struct { unsigned long s_addr;} in_addr;struct arptable_t { in_addr ipaddr; unsigned char node[6];};/* * A pity sipaddr and tipaddr are not longword aligned or we could use * in_addr. No, I don't want to use #pragma packed. */struct arprequest { unsigned short hwtype; unsigned short protocol; char hwlen; char protolen; unsigned short opcode; char shwaddr[6]; char sipaddr[4]; char thwaddr[6]; char tipaddr[4];};struct iphdr { char verhdrlen; char service; unsigned short len; unsigned short ident; unsigned short frags; char ttl; char protocol; unsigned short chksum; in_addr src; in_addr dest;};struct udphdr { unsigned short src; unsigned short dest; unsigned short len; unsigned short chksum;};struct bootp_t { struct iphdr ip; struct udphdr udp; char bp_op; char bp_htype; char bp_hlen; char bp_hops; unsigned long bp_xid; unsigned short bp_secs; unsigned short unused; in_addr bp_ciaddr; in_addr bp_yiaddr; in_addr bp_siaddr; in_addr bp_giaddr; char bp_hwaddr[16]; char bp_sname[64]; char bp_file[128];#ifdef NO_DHCP_SUPPORT char bp_vend[BOOTP_VENDOR_LEN];#else char bp_vend[DHCP_OPT_LEN];#endif /* NO_DHCP_SUPPORT */};struct bootpd_t { struct bootp_t bootp_reply; unsigned char bootp_extension[MAX_BOOTP_EXTLEN];};struct tftp_t { struct iphdr ip; struct udphdr udp; unsigned short opcode; union { char rrq[TFTP_DEFAULTSIZE_PACKET]; struct { unsigned short block; char download[TFTP_MAX_PACKET]; } data; struct { unsigned short block; } ack; struct { unsigned short errcode; char errmsg[TFTP_DEFAULTSIZE_PACKET]; } err; struct { char data[TFTP_DEFAULTSIZE_PACKET + 2]; } oack; } u;};#define TFTP_MIN_PACKET (sizeof(struct iphdr) + sizeof(struct udphdr) + 4)struct rpc_t { struct iphdr ip; struct udphdr udp; union { char data[300]; /* longest RPC call must fit!!!! */ struct { long id; long type; long rpcvers; long prog; long vers; long proc; long data[1]; } call; struct { long id; long type; long rstatus; long verifier; long v2; long astatus; long data[1]; } reply; } u;};#define PROG_PORTMAP 100000#define PROG_NFS 100003#define PROG_MOUNT 100005#define MSG_CALL 0#define MSG_REPLY 1#define PORTMAP_GETPORT 3#define MOUNT_ADDENTRY 1#define MOUNT_UMOUNTALL 4#define NFS_LOOKUP 4#define NFS_READ 6#define NFS_FHSIZE 32#define NFSERR_PERM 1#define NFSERR_NOENT 2#define NFSERR_ACCES 13/* Block size used for NFS read accesses. A RPC reply packet (including all * headers) must fit within a single Ethernet frame to avoid fragmentation. * Chosen to be a power of two, as most NFS servers are optimized for this. */#define NFS_READ_SIZE 1024#define FLOPPY_BOOT_LOCATION 0x7c00#define ROM_INFO_LOCATION 0x7dfa/* at end of floppy boot block */struct rom_info { unsigned short rom_segment; unsigned short rom_length;};/***************************************************************************External prototypes***************************************************************************//* main.c */extern void print_bytes P((unsigned char *bytes, int len));extern void load P((void));extern int load_linux P((int root_mount_port, int swap_mount_port, int root_nfs_port, char *kernel_handle));extern int downloadkernel P((unsigned char *, int, int, int));extern int tftpP((const char *name, int (*)(unsigned char *, int, int, int)));extern void rpc_init(void);extern int nfsP((const char *name, int (*)(unsigned char *, int, int, int)));extern void nfs_umountall P((int));extern int bootp P((void));extern int rarp P((void));extern int udp_transmit P((unsigned long destip, unsigned int srcsock, unsigned int destsock, int len, const void *buf));extern int await_reply P((int type, int ival, void *ptr, int timeout));extern int decode_rfc1533 P((unsigned char *, int, int, int));extern unsigned short ipchksum P((unsigned short *, int len));extern void rfc951_sleep P((int));extern void cleanup_net P((void));extern void cleanup P((void));/* config.c */extern void print_config(void);extern void eth_reset(void);extern int eth_probe(void);extern int eth_poll(void);extern void eth_transmit(const char *d, unsigned int t, unsigned int s, const void *p);extern void eth_disable(void);/* bootmenu.c */extern int execute P((char *string));extern void bootmenu P((int));extern void show_motd P((void));extern void parse_menuopts P((char *, int));extern int getoptvalue P((char **, int *, int *));extern void selectImage P((char **));/* osloader.c */#if defined(AOUT_IMAGE) || defined(ELF_IMAGE)extern int howto;#endifextern int os_download P((unsigned int, unsigned char *, unsigned int));/* misc.c */extern void twiddle P((void));extern void sleep P((int secs));extern int strcasecmp P((char *a, char *b));extern char *substr P((char *a, char *b));extern int getdec P((char **));extern void printf P((const char *, ...));extern char *sprintf P((char *, const char *, ...));extern int inet_aton P((char *p, in_addr * i));extern void gateA20_set P((void));extern void gateA20_unset P((void));extern void putchar P((int));extern int getchar P((void));extern int iskey P((void));/* start*.S */extern int getc P((void));extern void putc P((int));extern int ischar P((void));extern int getshift P((void));extern unsigned int memsize P((void));extern unsigned short basememsize P((void));extern void disk_init P((void));extern unsigned int disk_read P((int drv, int c, int h, int s, char *buf));extern void xstart P((unsigned long, unsigned long, char *));extern unsigned long currticks P((void));extern int setjmp P((void *jmpbuf));extern void longjmp P((void *jmpbuf, int where));extern void exit P((int status));extern void slowdownio P((void));/* serial.S */extern int serial_getc P((void));extern void serial_putc P((int));extern int serial_ischar P((void));extern int serial_init P((void));/* ansiesc.c */extern void ansi_reset P((void));extern void enable_cursor P((int));extern void handleansi P((unsigned char));/* md5.c */extern void md5_put P((unsigned int ch));extern void md5_done P((unsigned char *buf));/* floppy.c */extern int bootdisk P((int dev, int part));/***************************************************************************External variables***************************************************************************//* main.c */extern const char *kernel;extern char kernel_buf[128];extern struct rom_info rom;extern int hostnamelen;extern unsigned long netmask;extern int jmp_bootmenu[10];extern struct arptable_t arptable[MAX_ARP];#ifdef IMAGE_MENUextern char *motd[RFC1533_VENDOR_NUMOFMOTD];extern int menutmo, menudefault;extern unsigned char *defparams;extern int defparams_max;#endif#if defined(ETHERBOOT32) && !defined(INTERNAL_BOOTP_DATA)#define BOOTP_DATA_ADDR ((struct bootpd_t *)0x93C00)#elseextern struct bootpd_t bootp_data;#define BOOTP_DATA_ADDR (&bootp_data)#endifextern unsigned char *end_of_rfc1533;#ifdef IMAGE_FREEBSDextern int freebsd_howto;#endif/* config.c */extern struct nic nic;/* bootmenu.c *//* osloader.c *//* created by linker */extern char _start[], _edata[], _end[];/* * Local variables: * c-basic-offset: 8 * End: */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -