etherboot.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:14k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /**************************************************************************
  2. ETHERBOOT -  BOOTP/TFTP Bootstrap Program
  3. Author: Martin Renters
  4.   Date: Dec/93
  5. **************************************************************************/
  6. #include "osdep.h"
  7. /* These could be customised for different languages perhaps */
  8. #define ASK_PROMPT "Boot from (N)etwork or from (L)ocal? "
  9. #define ANS_NETWORK 'N'
  10. #define ANS_LOCAL 'L'
  11. #ifndef ANS_DEFAULT /* in case left out in Makefile */
  12. #define ANS_DEFAULT ANS_NETWORK
  13. #endif
  14. #define TAGGED_IMAGE /* eventually optional */
  15. #if !defined(TAGGED_IMAGE) && !defined(AOUT_IMAGE) && !defined(ELF_IMAGE)
  16. #define TAGGED_IMAGE /* choose at least one */
  17. #endif
  18. #define ESC 0x1B
  19. #ifndef DEFAULT_BOOTFILE
  20. #define DEFAULT_BOOTFILE "/tftpboot/kernel"
  21. #endif
  22. /* Clean up console settings... mainly CONSOLE_CRT and CONSOLE_SERIAL are used
  23.  * in the sources (except start.S and serial.S which cannot include
  24.  * etherboot.h).  At least one of the CONSOLE_xxx has to be set, and
  25.  * CONSOLE_DUAL sets both CONSOLE_CRT and CONSOLE_SERIAL.  If none is set,
  26.  * CONSOLE_CRT is assumed.  */
  27. #ifdef CONSOLE_DUAL
  28. #undef CONSOLE_CRT
  29. #define CONSOLE_CRT
  30. #undef CONSOLE_SERIAL
  31. #define CONSOLE_SERIAL
  32. #endif
  33. #if defined(CONSOLE_CRT) && defined(CONSOLE_SERIAL)
  34. #undef CONSOLE_DUAL
  35. #define CONSOLE_DUAL
  36. #endif
  37. #if !defined(CONSOLE_CRT) && !defined(CONSOLE_SERIAL)
  38. #define CONSOLE_CRT
  39. #endif
  40. #ifndef DOWNLOAD_PROTO_NFS
  41. #undef DOWNLOAD_PROTO_TFTP
  42. #define DOWNLOAD_PROTO_TFTP /* default booting protocol */
  43. #endif
  44. #ifdef DOWNLOAD_PROTO_TFTP
  45. #define download(fname,loader) tftp((fname),(loader))
  46. #endif
  47. #ifdef DOWNLOAD_PROTO_NFS
  48. #define download(fname,loader) nfs((fname),(loader))
  49. #endif
  50. #ifndef MAX_TFTP_RETRIES
  51. #define MAX_TFTP_RETRIES 20
  52. #endif
  53. #ifndef MAX_BOOTP_RETRIES
  54. #define MAX_BOOTP_RETRIES 20
  55. #endif
  56. #ifndef MAX_BOOTP_EXTLEN
  57. #if (RELOC < 0x94000)
  58. /* Force internal buffer (if external buffer would overlap with our code...) */
  59. #undef INTERNAL_BOOTP_DATA
  60. #define INTERNAL_BOOTP_DATA
  61. #endif
  62. /* sizeof(struct bootp_t) == 0x240 */
  63. #if defined(INTERNAL_BOOTP_DATA) || (RELOC >= 0x94240)
  64. #define MAX_BOOTP_EXTLEN 1024
  65. #else
  66. #define MAX_BOOTP_EXTLEN (1024-sizeof(struct bootp_t))
  67. #endif
  68. #endif
  69. #ifndef MAX_ARP_RETRIES
  70. #define MAX_ARP_RETRIES 20
  71. #endif
  72. #ifndef MAX_RPC_RETRIES
  73. #define MAX_RPC_RETRIES 20
  74. #endif
  75. #define TICKS_PER_SEC 18
  76. /* Inter-packet retry in ticks */
  77. #define TIMEOUT (10*TICKS_PER_SEC)
  78. /* These settings have sense only if compiled with -DCONGESTED */
  79. /* total retransmission timeout in ticks */
  80. #define TFTP_TIMEOUT (30*TICKS_PER_SEC)
  81. /* packet retransmission timeout in ticks */
  82. #define TFTP_REXMT (3*TICKS_PER_SEC)
  83. #ifndef NULL
  84. #define NULL ((void *)0)
  85. #endif
  86. #define TRUE 1
  87. #define FALSE 0
  88. #define ETHER_ADDR_SIZE 6 /* Size of Ethernet address */
  89. #define ETHER_HDR_SIZE 14 /* Size of ethernet header */
  90. #define ETH_MIN_PACKET 64
  91. #define ETH_MAX_PACKET 1518
  92. #define VENDOR_NONE 0
  93. #define VENDOR_WD 1
  94. #define VENDOR_NOVELL 2
  95. #define VENDOR_3COM 3
  96. #define VENDOR_3C509 4
  97. #define VENDOR_CS89x0 5
  98. #define FLAG_PIO 0x01
  99. #define FLAG_16BIT 0x02
  100. #define FLAG_790 0x04
  101. #define ARP_CLIENT 0
  102. #define ARP_SERVER 1
  103. #define ARP_GATEWAY 2
  104. #define ARP_ROOTSERVER 3
  105. #define ARP_SWAPSERVER 4
  106. #define MAX_ARP ARP_SWAPSERVER+1
  107. #define RARP_REQUEST 3
  108. #define RARP_REPLY 4
  109. #define IP 0x0800
  110. #define ARP 0x0806
  111. #define RARP 0x8035
  112. #define BOOTP_SERVER 67
  113. #define BOOTP_CLIENT 68
  114. #define TFTP_PORT 69
  115. #define SUNRPC_PORT 111
  116. #define IP_UDP 17
  117. /* Same after going through htonl */
  118. #define IP_BROADCAST 0xFFFFFFFF
  119. #define ARP_REQUEST 1
  120. #define ARP_REPLY 2
  121. #define BOOTP_REQUEST 1
  122. #define BOOTP_REPLY 2
  123. #define TAG_LEN(p) (*((p)+1))
  124. #define RFC1533_COOKIE 99, 130, 83, 99
  125. #define RFC1533_PAD 0
  126. #define RFC1533_NETMASK 1
  127. #define RFC1533_TIMEOFFSET 2
  128. #define RFC1533_GATEWAY 3
  129. #define RFC1533_TIMESERVER 4
  130. #define RFC1533_IEN116NS 5
  131. #define RFC1533_DNS 6
  132. #define RFC1533_LOGSERVER 7
  133. #define RFC1533_COOKIESERVER 8
  134. #define RFC1533_LPRSERVER 9
  135. #define RFC1533_IMPRESSSERVER 10
  136. #define RFC1533_RESOURCESERVER 11
  137. #define RFC1533_HOSTNAME 12
  138. #define RFC1533_BOOTFILESIZE 13
  139. #define RFC1533_MERITDUMPFILE 14
  140. #define RFC1533_DOMAINNAME 15
  141. #define RFC1533_SWAPSERVER 16
  142. #define RFC1533_ROOTPATH 17
  143. #define RFC1533_EXTENSIONPATH 18
  144. #define RFC1533_IPFORWARDING 19
  145. #define RFC1533_IPSOURCEROUTING 20
  146. #define RFC1533_IPPOLICYFILTER 21
  147. #define RFC1533_IPMAXREASSEMBLY 22
  148. #define RFC1533_IPTTL 23
  149. #define RFC1533_IPMTU 24
  150. #define RFC1533_IPMTUPLATEAU 25
  151. #define RFC1533_INTMTU 26
  152. #define RFC1533_INTLOCALSUBNETS 27
  153. #define RFC1533_INTBROADCAST 28
  154. #define RFC1533_INTICMPDISCOVER 29
  155. #define RFC1533_INTICMPRESPOND 30
  156. #define RFC1533_INTROUTEDISCOVER 31
  157. #define RFC1533_INTROUTESOLICIT 32
  158. #define RFC1533_INTSTATICROUTES 33
  159. #define RFC1533_LLTRAILERENCAP 34
  160. #define RFC1533_LLARPCACHETMO 35
  161. #define RFC1533_LLETHERNETENCAP 36
  162. #define RFC1533_TCPTTL 37
  163. #define RFC1533_TCPKEEPALIVETMO 38
  164. #define RFC1533_TCPKEEPALIVEGB 39
  165. #define RFC1533_NISDOMAIN 40
  166. #define RFC1533_NISSERVER 41
  167. #define RFC1533_NTPSERVER 42
  168. #define RFC1533_VENDOR 43
  169. #define RFC1533_NBNS 44
  170. #define RFC1533_NBDD 45
  171. #define RFC1533_NBNT 46
  172. #define RFC1533_NBSCOPE 47
  173. #define RFC1533_XFS 48
  174. #define RFC1533_XDM 49
  175. #ifndef NO_DHCP_SUPPORT
  176. #define RFC2132_REQ_ADDR 50
  177. #define RFC2132_MSG_TYPE 53
  178. #define RFC2132_SRV_ID 54
  179. #define RFC2132_PARAM_LIST 55
  180. #define RFC2132_MAX_SIZE 57
  181. #define DHCPDISCOVER 1
  182. #define DHCPOFFER 2
  183. #define DHCPREQUEST 3
  184. #define DHCPACK 5
  185. #endif /* NO_DHCP_SUPPORT */
  186. #define RFC1533_VENDOR_MAJOR 0
  187. #define RFC1533_VENDOR_MINOR 0
  188. #define RFC1533_VENDOR_MAGIC 128
  189. #define RFC1533_VENDOR_ADDPARM 129
  190. #ifdef IMAGE_FREEBSD
  191. #define RFC1533_VENDOR_HOWTO    132
  192. #endif
  193. #define RFC1533_VENDOR_MNUOPTS 160
  194. #define RFC1533_VENDOR_SELECTION 176
  195. #define RFC1533_VENDOR_MOTD 184
  196. #define RFC1533_VENDOR_NUMOFMOTD 8
  197. #define RFC1533_VENDOR_IMG 192
  198. #define RFC1533_VENDOR_NUMOFIMG 16
  199. #define RFC1533_END 255
  200. #define BOOTP_VENDOR_LEN 64
  201. #ifndef NO_DHCP_SUPPORT
  202. #define DHCP_OPT_LEN 312
  203. #endif /* NO_DHCP_SUPPORT */
  204. #define TFTP_DEFAULTSIZE_PACKET 512
  205. #define TFTP_MAX_PACKET 1432 /* 512 */
  206. #define TFTP_RRQ 1
  207. #define TFTP_WRQ 2
  208. #define TFTP_DATA 3
  209. #define TFTP_ACK 4
  210. #define TFTP_ERROR 5
  211. #define TFTP_OACK 6
  212. #define TFTP_CODE_EOF 1
  213. #define TFTP_CODE_MORE 2
  214. #define TFTP_CODE_ERROR 3
  215. #define TFTP_CODE_BOOT 4
  216. #define TFTP_CODE_CFG 5
  217. #define AWAIT_ARP 0
  218. #define AWAIT_BOOTP 1
  219. #define AWAIT_TFTP 2
  220. #define AWAIT_RARP 3
  221. #define AWAIT_RPC 4
  222. #define AWAIT_QDRAIN 5 /* drain queue, process ARP requests */
  223. typedef struct {
  224. unsigned long s_addr;
  225. } in_addr;
  226. struct arptable_t {
  227. in_addr ipaddr;
  228. unsigned char node[6];
  229. };
  230. /*
  231.  * A pity sipaddr and tipaddr are not longword aligned or we could use
  232.  * in_addr. No, I don't want to use #pragma packed.
  233.  */
  234. struct arprequest {
  235. unsigned short hwtype;
  236. unsigned short protocol;
  237. char hwlen;
  238. char protolen;
  239. unsigned short opcode;
  240. char shwaddr[6];
  241. char sipaddr[4];
  242. char thwaddr[6];
  243. char tipaddr[4];
  244. };
  245. struct iphdr {
  246. char verhdrlen;
  247. char service;
  248. unsigned short len;
  249. unsigned short ident;
  250. unsigned short frags;
  251. char ttl;
  252. char protocol;
  253. unsigned short chksum;
  254. in_addr src;
  255. in_addr dest;
  256. };
  257. struct udphdr {
  258. unsigned short src;
  259. unsigned short dest;
  260. unsigned short len;
  261. unsigned short chksum;
  262. };
  263. struct bootp_t {
  264. struct iphdr ip;
  265. struct udphdr udp;
  266. char bp_op;
  267. char bp_htype;
  268. char bp_hlen;
  269. char bp_hops;
  270. unsigned long bp_xid;
  271. unsigned short bp_secs;
  272. unsigned short unused;
  273. in_addr bp_ciaddr;
  274. in_addr bp_yiaddr;
  275. in_addr bp_siaddr;
  276. in_addr bp_giaddr;
  277. char bp_hwaddr[16];
  278. char bp_sname[64];
  279. char bp_file[128];
  280. #ifdef NO_DHCP_SUPPORT
  281. char bp_vend[BOOTP_VENDOR_LEN];
  282. #else
  283. char bp_vend[DHCP_OPT_LEN];
  284. #endif /* NO_DHCP_SUPPORT */
  285. };
  286. struct bootpd_t {
  287. struct bootp_t bootp_reply;
  288. unsigned char bootp_extension[MAX_BOOTP_EXTLEN];
  289. };
  290. struct tftp_t {
  291. struct iphdr ip;
  292. struct udphdr udp;
  293. unsigned short opcode;
  294. union {
  295. char rrq[TFTP_DEFAULTSIZE_PACKET];
  296. struct {
  297. unsigned short block;
  298. char download[TFTP_MAX_PACKET];
  299. } data;
  300. struct {
  301. unsigned short block;
  302. } ack;
  303. struct {
  304. unsigned short errcode;
  305. char errmsg[TFTP_DEFAULTSIZE_PACKET];
  306. } err;
  307. struct {
  308. char data[TFTP_DEFAULTSIZE_PACKET + 2];
  309. } oack;
  310. } u;
  311. };
  312. #define TFTP_MIN_PACKET (sizeof(struct iphdr) + sizeof(struct udphdr) + 4)
  313. struct rpc_t {
  314. struct iphdr ip;
  315. struct udphdr udp;
  316. union {
  317. char data[300]; /* longest RPC call must fit!!!! */
  318. struct {
  319. long id;
  320. long type;
  321. long rpcvers;
  322. long prog;
  323. long vers;
  324. long proc;
  325. long data[1];
  326. } call;
  327. struct {
  328. long id;
  329. long type;
  330. long rstatus;
  331. long verifier;
  332. long v2;
  333. long astatus;
  334. long data[1];
  335. } reply;
  336. } u;
  337. };
  338. #define PROG_PORTMAP 100000
  339. #define PROG_NFS 100003
  340. #define PROG_MOUNT 100005
  341. #define MSG_CALL 0
  342. #define MSG_REPLY 1
  343. #define PORTMAP_GETPORT 3
  344. #define MOUNT_ADDENTRY 1
  345. #define MOUNT_UMOUNTALL 4
  346. #define NFS_LOOKUP 4
  347. #define NFS_READ 6
  348. #define NFS_FHSIZE 32
  349. #define NFSERR_PERM 1
  350. #define NFSERR_NOENT 2
  351. #define NFSERR_ACCES 13
  352. /* Block size used for NFS read accesses.  A RPC reply packet (including  all
  353.  * headers) must fit within a single Ethernet frame to avoid fragmentation.
  354.  * Chosen to be a power of two, as most NFS servers are optimized for this.  */
  355. #define NFS_READ_SIZE 1024
  356. #define FLOPPY_BOOT_LOCATION 0x7c00
  357. #define ROM_INFO_LOCATION 0x7dfa
  358. /* at end of floppy boot block */
  359. struct rom_info {
  360. unsigned short rom_segment;
  361. unsigned short rom_length;
  362. };
  363. /***************************************************************************
  364. External prototypes
  365. ***************************************************************************/
  366. /* main.c */
  367. extern void print_bytes P((unsigned char *bytes, int len));
  368. extern void load P((void));
  369. extern int load_linux P((int root_mount_port, int swap_mount_port,
  370.  int root_nfs_port, char *kernel_handle));
  371. extern int downloadkernel P((unsigned char *, int, int, int));
  372. extern int tftp
  373. P((const char *name, int (*)(unsigned char *, int, int, int)));
  374. extern void rpc_init(void);
  375. extern int nfs
  376. P((const char *name, int (*)(unsigned char *, int, int, int)));
  377. extern void nfs_umountall P((int));
  378. extern int bootp P((void));
  379. extern int rarp P((void));
  380. extern int udp_transmit P((unsigned long destip, unsigned int srcsock,
  381.    unsigned int destsock, int len,
  382.    const void *buf));
  383. extern int await_reply P((int type, int ival, void *ptr, int timeout));
  384. extern int decode_rfc1533 P((unsigned char *, int, int, int));
  385. extern unsigned short ipchksum P((unsigned short *, int len));
  386. extern void rfc951_sleep P((int));
  387. extern void cleanup_net P((void));
  388. extern void cleanup P((void));
  389. /* config.c */
  390. extern void print_config(void);
  391. extern void eth_reset(void);
  392. extern int eth_probe(void);
  393. extern int eth_poll(void);
  394. extern void eth_transmit(const char *d, unsigned int t, unsigned int s,
  395.  const void *p);
  396. extern void eth_disable(void);
  397. /* bootmenu.c */
  398. extern int execute P((char *string));
  399. extern void bootmenu P((int));
  400. extern void show_motd P((void));
  401. extern void parse_menuopts P((char *, int));
  402. extern int getoptvalue P((char **, int *, int *));
  403. extern void selectImage P((char **));
  404. /* osloader.c */
  405. #if defined(AOUT_IMAGE) || defined(ELF_IMAGE)
  406. extern int howto;
  407. #endif
  408. extern int os_download P((unsigned int, unsigned char *, unsigned int));
  409. /* misc.c */
  410. extern void twiddle P((void));
  411. extern void sleep P((int secs));
  412. extern int strcasecmp P((char *a, char *b));
  413. extern char *substr P((char *a, char *b));
  414. extern int getdec P((char **));
  415. extern void printf P((const char *, ...));
  416. extern char *sprintf P((char *, const char *, ...));
  417. extern int inet_aton P((char *p, in_addr * i));
  418. extern void gateA20_set P((void));
  419. extern void gateA20_unset P((void));
  420. extern void putchar P((int));
  421. extern int getchar P((void));
  422. extern int iskey P((void));
  423. /* start*.S */
  424. extern int getc P((void));
  425. extern void putc P((int));
  426. extern int ischar P((void));
  427. extern int getshift P((void));
  428. extern unsigned int memsize P((void));
  429. extern unsigned short basememsize P((void));
  430. extern void disk_init P((void));
  431. extern unsigned int disk_read P((int drv, int c, int h, int s, char *buf));
  432. extern void xstart P((unsigned long, unsigned long, char *));
  433. extern unsigned long currticks P((void));
  434. extern int setjmp P((void *jmpbuf));
  435. extern void longjmp P((void *jmpbuf, int where));
  436. extern void exit P((int status));
  437. extern void slowdownio P((void));
  438. /* serial.S */
  439. extern int serial_getc P((void));
  440. extern void serial_putc P((int));
  441. extern int serial_ischar P((void));
  442. extern int serial_init P((void));
  443. /* ansiesc.c */
  444. extern void ansi_reset P((void));
  445. extern void enable_cursor P((int));
  446. extern void handleansi P((unsigned char));
  447. /* md5.c */
  448. extern void md5_put P((unsigned int ch));
  449. extern void md5_done P((unsigned char *buf));
  450. /* floppy.c */
  451. extern int bootdisk P((int dev, int part));
  452. /***************************************************************************
  453. External variables
  454. ***************************************************************************/
  455. /* main.c */
  456. extern const char *kernel;
  457. extern char kernel_buf[128];
  458. extern struct rom_info rom;
  459. extern int hostnamelen;
  460. extern unsigned long netmask;
  461. extern int jmp_bootmenu[10];
  462. extern struct arptable_t arptable[MAX_ARP];
  463. #ifdef IMAGE_MENU
  464. extern char *motd[RFC1533_VENDOR_NUMOFMOTD];
  465. extern int menutmo, menudefault;
  466. extern unsigned char *defparams;
  467. extern int defparams_max;
  468. #endif
  469. #if defined(ETHERBOOT32) && !defined(INTERNAL_BOOTP_DATA)
  470. #define BOOTP_DATA_ADDR ((struct bootpd_t *)0x93C00)
  471. #else
  472. extern struct bootpd_t bootp_data;
  473. #define BOOTP_DATA_ADDR (&bootp_data)
  474. #endif
  475. extern unsigned char *end_of_rfc1533;
  476. #ifdef IMAGE_FREEBSD
  477. extern int freebsd_howto;
  478. #endif
  479. /* config.c */
  480. extern struct nic nic;
  481. /* bootmenu.c */
  482. /* osloader.c */
  483. /* created by linker */
  484. extern char _start[], _edata[], _end[];
  485. /*
  486.  * Local variables:
  487.  *  c-basic-offset: 8
  488.  * End:
  489.  */