1 /* 2 * GRUB -- GRand Unified Bootloader 3 * Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 18 */ 19 20 /* RULE: You must define the macro ``GRUB'' when including this header 21 file in GRUB code. */ 22 23 /* Based on "src/etherboot.h" in etherboot-5.0.5. */ 24 25 /************************************************************************** 26 ETHERBOOT - BOOTP/TFTP Bootstrap Program 27 28 Author: Martin Renters 29 Date: Dec/93 30 31 **************************************************************************/ 32 33 /* Include GRUB-specific macros and prototypes here. */ 34 #include <shared.h> 35 36 /* FIXME: For now, enable the DHCP support. Perhaps I should segregate 37 the DHCP support from the BOOTP support, and permit both to 38 co-exist. */ 39 #undef NO_DHCP_SUPPORT 40 41 /* In GRUB, the relocated address in Etherboot doesn't have any sense. 42 Just define it as a bogus value. */ 43 #define RELOC 0 44 45 /* FIXME: Should be an option. */ 46 #define BACKOFF_LIMIT 7 47 48 #include <osdep.h> 49 50 #define CTRL_C 3 51 52 #ifndef MAX_TFTP_RETRIES 53 # define MAX_TFTP_RETRIES 20 54 #endif 55 56 #ifndef MAX_BOOTP_RETRIES 57 # define MAX_BOOTP_RETRIES 20 58 #endif 59 60 #define MAX_BOOTP_EXTLEN (ETH_FRAME_LEN - ETH_HLEN - \ 61 sizeof (struct bootp_t)) 62 63 #ifndef MAX_ARP_RETRIES 64 # define MAX_ARP_RETRIES 20 65 #endif 66 67 #ifndef MAX_RPC_RETRIES 68 # define MAX_RPC_RETRIES 20 69 #endif 70 71 #define TICKS_PER_SEC 18 72 73 /* Inter-packet retry in ticks */ 74 #define TIMEOUT (10 * TICKS_PER_SEC) 75 76 /* These settings have sense only if compiled with -DCONGESTED */ 77 /* total retransmission timeout in ticks */ 78 #define TFTP_TIMEOUT (30 * TICKS_PER_SEC) 79 /* packet retransmission timeout in ticks */ 80 #define TFTP_REXMT (3 * TICKS_PER_SEC) 81 82 #ifndef NULL 83 # define NULL ((void *) 0) 84 #endif 85 86 /* 87 I'm moving towards the defined names in linux/if_ether.h for clarity. 88 The confusion between 60/64 and 1514/1518 arose because the NS8390 89 counts the 4 byte frame checksum in the incoming packet, but not 90 in the outgoing packet. 60/1514 are the correct numbers for most 91 if not all of the other NIC controllers. I will be retiring the 92 64/1518 defines in the lead-up to 5.0. 93 */ 94 95 #define ETH_ALEN 6 /* Size of Ethernet address */ 96 #define ETH_HLEN 14 /* Size of ethernet header */ 97 #define ETH_ZLEN 60 /* Minimum packet */ 98 /*#define ETH_MIN_PACKET 64*/ 99 #define ETH_FRAME_LEN 1514 /* Maximum packet */ 100 /*#define ETH_MAX_PACKET 1518*/ 101 /* Because some DHCP/BOOTP servers don't treat the maximum length the same 102 as Etherboot, subtract the size of an IP header and that of an UDP 103 header. */ 104 #define ETH_MAX_MTU (ETH_FRAME_LEN - ETH_HLEN \ 105 - sizeof (struct iphdr) \ 106 - sizeof (struct udphdr)) 107 108 #define ARP_CLIENT 0 109 #define ARP_SERVER 1 110 #define ARP_GATEWAY 2 111 #define ARP_ROOTSERVER 3 112 #define ARP_SWAPSERVER 4 113 #define MAX_ARP ARP_SWAPSERVER+1 114 115 #define RARP_REQUEST 3 116 #define RARP_REPLY 4 117 118 #define IP 0x0800 119 #define ARP 0x0806 120 #define RARP 0x8035 121 122 #define BOOTP_SERVER 67 123 #define BOOTP_CLIENT 68 124 #define TFTP_PORT 69 125 #define SUNRPC_PORT 111 126 127 #define IP_UDP 17 128 /* Same after going through htonl */ 129 #define IP_BROADCAST 0xFFFFFFFF 130 131 #define ARP_REQUEST 1 132 #define ARP_REPLY 2 133 134 #define BOOTP_REQUEST 1 135 #define BOOTP_REPLY 2 136 137 #define TAG_LEN(p) (*((p) + 1)) 138 #define RFC1533_COOKIE 99, 130, 83, 99 139 #define RFC1533_PAD 0 140 #define RFC1533_NETMASK 1 141 #define RFC1533_TIMEOFFSET 2 142 #define RFC1533_GATEWAY 3 143 #define RFC1533_TIMESERVER 4 144 #define RFC1533_IEN116NS 5 145 #define RFC1533_DNS 6 146 #define RFC1533_LOGSERVER 7 147 #define RFC1533_COOKIESERVER 8 148 #define RFC1533_LPRSERVER 9 149 #define RFC1533_IMPRESSSERVER 10 150 #define RFC1533_RESOURCESERVER 11 151 #define RFC1533_HOSTNAME 12 152 #define RFC1533_BOOTFILESIZE 13 153 #define RFC1533_MERITDUMPFILE 14 154 #define RFC1533_DOMAINNAME 15 155 #define RFC1533_SWAPSERVER 16 156 #define RFC1533_ROOTPATH 17 157 #define RFC1533_EXTENSIONPATH 18 158 #define RFC1533_IPFORWARDING 19 159 #define RFC1533_IPSOURCEROUTING 20 160 #define RFC1533_IPPOLICYFILTER 21 161 #define RFC1533_IPMAXREASSEMBLY 22 162 #define RFC1533_IPTTL 23 163 #define RFC1533_IPMTU 24 164 #define RFC1533_IPMTUPLATEAU 25 165 #define RFC1533_INTMTU 26 166 #define RFC1533_INTLOCALSUBNETS 27 167 #define RFC1533_INTBROADCAST 28 168 #define RFC1533_INTICMPDISCOVER 29 169 #define RFC1533_INTICMPRESPOND 30 170 #define RFC1533_INTROUTEDISCOVER 31 171 #define RFC1533_INTROUTESOLICIT 32 172 #define RFC1533_INTSTATICROUTES 33 173 #define RFC1533_LLTRAILERENCAP 34 174 #define RFC1533_LLARPCACHETMO 35 175 #define RFC1533_LLETHERNETENCAP 36 176 #define RFC1533_TCPTTL 37 177 #define RFC1533_TCPKEEPALIVETMO 38 178 #define RFC1533_TCPKEEPALIVEGB 39 179 #define RFC1533_NISDOMAIN 40 180 #define RFC1533_NISSERVER 41 181 #define RFC1533_NTPSERVER 42 182 #define RFC1533_VENDOR 43 183 #define RFC1533_NBNS 44 184 #define RFC1533_NBDD 45 185 #define RFC1533_NBNT 46 186 #define RFC1533_NBSCOPE 47 187 #define RFC1533_XFS 48 188 #define RFC1533_XDM 49 189 #ifndef NO_DHCP_SUPPORT 190 #define RFC2132_REQ_ADDR 50 191 #define RFC2132_MSG_TYPE 53 192 #define RFC2132_SRV_ID 54 193 #define RFC2132_PARAM_LIST 55 194 #define RFC2132_MAX_SIZE 57 195 #define RFC2132_VENDOR_CLASS_ID 60 196 197 #define DHCPDISCOVER 1 198 #define DHCPOFFER 2 199 #define DHCPREQUEST 3 200 #define DHCPACK 5 201 #endif /* NO_DHCP_SUPPORT */ 202 203 #define RFC1533_VENDOR_MAJOR 0 204 #define RFC1533_VENDOR_MINOR 0 205 206 #define RFC1533_VENDOR_MAGIC 128 207 #define RFC1533_VENDOR_ADDPARM 129 208 #define RFC1533_VENDOR_MNUOPTS 160 209 #define RFC1533_VENDOR_SELECTION 176 210 #define RFC1533_VENDOR_MOTD 184 211 #define RFC1533_VENDOR_NUMOFMOTD 8 212 #define RFC1533_VENDOR_IMG 192 213 #define RFC1533_VENDOR_NUMOFIMG 16 214 215 #define RFC1533_VENDOR_CONFIGFILE 150 216 217 #define RFC1533_END 255 218 219 #define BOOTP_VENDOR_LEN 64 220 #ifndef NO_DHCP_SUPPORT 221 #define DHCP_OPT_LEN 312 222 #endif /* NO_DHCP_SUPPORT */ 223 224 #define TFTP_DEFAULTSIZE_PACKET 512 225 #define TFTP_MAX_PACKET 1432 /* 512 */ 226 227 #define TFTP_RRQ 1 228 #define TFTP_WRQ 2 229 #define TFTP_DATA 3 230 #define TFTP_ACK 4 231 #define TFTP_ERROR 5 232 #define TFTP_OACK 6 233 234 #define TFTP_CODE_EOF 1 235 #define TFTP_CODE_MORE 2 236 #define TFTP_CODE_ERROR 3 237 #define TFTP_CODE_BOOT 4 238 #define TFTP_CODE_CFG 5 239 240 #define AWAIT_ARP 0 241 #define AWAIT_BOOTP 1 242 #define AWAIT_TFTP 2 243 #define AWAIT_RARP 3 244 #define AWAIT_RPC 4 245 #define AWAIT_QDRAIN 5 /* drain queue, process ARP requests */ 246 247 typedef struct 248 { 249 unsigned long s_addr; 250 } 251 in_addr; 252 253 struct arptable_t 254 { 255 in_addr ipaddr; 256 unsigned char node[6]; 257 }; 258 259 /* 260 * A pity sipaddr and tipaddr are not longword aligned or we could use 261 * in_addr. No, I don't want to use #pragma packed. 262 */ 263 struct arprequest 264 { 265 unsigned short hwtype; 266 unsigned short protocol; 267 char hwlen; 268 char protolen; 269 unsigned short opcode; 270 char shwaddr[6]; 271 char sipaddr[4]; 272 char thwaddr[6]; 273 char tipaddr[4]; 274 }; 275 276 struct iphdr 277 { 278 char verhdrlen; 279 char service; 280 unsigned short len; 281 unsigned short ident; 282 unsigned short frags; 283 char ttl; 284 char protocol; 285 unsigned short chksum; 286 in_addr src; 287 in_addr dest; 288 }; 289 290 struct udphdr 291 { 292 unsigned short src; 293 unsigned short dest; 294 unsigned short len; 295 unsigned short chksum; 296 }; 297 298 /* Format of a bootp packet. */ 299 struct bootp_t 300 { 301 char bp_op; 302 char bp_htype; 303 char bp_hlen; 304 char bp_hops; 305 unsigned long bp_xid; 306 unsigned short bp_secs; 307 unsigned short unused; 308 in_addr bp_ciaddr; 309 in_addr bp_yiaddr; 310 in_addr bp_siaddr; 311 in_addr bp_giaddr; 312 char bp_hwaddr[16]; 313 char bp_sname[64]; 314 char bp_file[128]; 315 #ifdef NO_DHCP_SUPPORT 316 char bp_vend[BOOTP_VENDOR_LEN]; 317 #else 318 char bp_vend[DHCP_OPT_LEN]; 319 #endif /* NO_DHCP_SUPPORT */ 320 }; 321 322 /* Format of a bootp IP packet. */ 323 struct bootpip_t 324 { 325 struct iphdr ip; 326 struct udphdr udp; 327 struct bootp_t bp; 328 }; 329 330 /* Format of bootp packet with extensions. */ 331 struct bootpd_t 332 { 333 struct bootp_t bootp_reply; 334 unsigned char bootp_extension[MAX_BOOTP_EXTLEN]; 335 }; 336 337 struct tftp_t 338 { 339 struct iphdr ip; 340 struct udphdr udp; 341 unsigned short opcode; 342 union 343 { 344 char rrq[TFTP_DEFAULTSIZE_PACKET]; 345 346 struct 347 { 348 unsigned short block; 349 char download[TFTP_MAX_PACKET]; 350 } 351 data; 352 353 struct 354 { 355 unsigned short block; 356 } 357 ack; 358 359 struct 360 { 361 unsigned short errcode; 362 char errmsg[TFTP_DEFAULTSIZE_PACKET]; 363 } 364 err; 365 366 struct 367 { 368 char data[TFTP_DEFAULTSIZE_PACKET+2]; 369 } 370 oack; 371 } 372 u; 373 }; 374 375 /* Define a smaller tftp packet solely for making requests to conserve stack 376 512 bytes should be enough. */ 377 struct tftpreq_t 378 { 379 struct iphdr ip; 380 struct udphdr udp; 381 unsigned short opcode; 382 union 383 { 384 char rrq[512]; 385 386 struct 387 { 388 unsigned short block; 389 } 390 ack; 391 392 struct 393 { 394 unsigned short errcode; 395 char errmsg[512-2]; 396 } 397 err; 398 } 399 u; 400 }; 401 402 #define TFTP_MIN_PACKET (sizeof(struct iphdr) + sizeof(struct udphdr) + 4) 403 404 struct rpc_t 405 { 406 struct iphdr ip; 407 struct udphdr udp; 408 union 409 { 410 char data[300]; /* longest RPC call must fit!!!! */ 411 412 struct 413 { 414 long id; 415 long type; 416 long rpcvers; 417 long prog; 418 long vers; 419 long proc; 420 long data[1]; 421 } 422 call; 423 424 struct 425 { 426 long id; 427 long type; 428 long rstatus; 429 long verifier; 430 long v2; 431 long astatus; 432 long data[1]; 433 } 434 reply; 435 } 436 u; 437 }; 438 439 #define PROG_PORTMAP 100000 440 #define PROG_NFS 100003 441 #define PROG_MOUNT 100005 442 443 #define MSG_CALL 0 444 #define MSG_REPLY 1 445 446 #define PORTMAP_GETPORT 3 447 448 #define MOUNT_ADDENTRY 1 449 #define MOUNT_UMOUNTALL 4 450 451 #define NFS_LOOKUP 4 452 #define NFS_READ 6 453 454 #define NFS_FHSIZE 32 455 456 #define NFSERR_PERM 1 457 #define NFSERR_NOENT 2 458 #define NFSERR_ACCES 13 459 460 /* Block size used for NFS read accesses. A RPC reply packet (including all 461 * headers) must fit within a single Ethernet frame to avoid fragmentation. 462 * Chosen to be a power of two, as most NFS servers are optimized for this. */ 463 #define NFS_READ_SIZE 1024 464 465 #define FLOPPY_BOOT_LOCATION 0x7c00 466 /* Must match offsets in loader.S */ 467 #define ROM_SEGMENT 0x1fa 468 #define ROM_LENGTH 0x1fc 469 470 #define ROM_INFO_LOCATION (FLOPPY_BOOT_LOCATION + ROM_SEGMENT) 471 /* at end of floppy boot block */ 472 473 struct rom_info 474 { 475 unsigned short rom_segment; 476 unsigned short rom_length; 477 }; 478 479 static inline int 480 rom_address_ok (struct rom_info *rom, int assigned_rom_segment) 481 { 482 return (assigned_rom_segment < 0xC000 483 || assigned_rom_segment == rom->rom_segment); 484 } 485 486 /* Define a type for passing info to a loaded program. */ 487 struct ebinfo 488 { 489 unsigned char major, minor; /* Version */ 490 unsigned short flags; /* Bit flags */ 491 }; 492 493 /*************************************************************************** 494 External prototypes 495 ***************************************************************************/ 496 /* main.c */ 497 extern void print_network_configuration (void); 498 extern int ifconfig (char *ip, char *sm, char *gw, char *svr); 499 extern int udp_transmit (unsigned long destip, unsigned int srcsock, 500 unsigned int destsock, int len, const void *buf); 501 extern int await_reply (int type, int ival, void *ptr, int timeout); 502 extern int decode_rfc1533 (unsigned char *, int, int, int); 503 extern long rfc2131_sleep_interval (int base, int exp); 504 extern void cleanup (void); 505 extern int rarp (void); 506 extern int bootp (void); 507 extern void cleanup_net (void); 508 509 /* config.c */ 510 extern void print_config (void); 511 extern void eth_reset (void); 512 extern int eth_probe (void); 513 extern int eth_poll (void); 514 extern void eth_transmit (const char *d, unsigned int t, 515 unsigned int s, const void *p); 516 extern void eth_disable (void); 517 518 /* misc.c */ 519 extern void twiddle (void); 520 extern void sleep (int secs); 521 extern int getdec (char **s); 522 extern void etherboot_printf (const char *, ...); 523 extern int etherboot_sprintf (char *, const char *, ...); 524 extern int inet_aton (char *p, in_addr *i); 525 526 /*************************************************************************** 527 External variables 528 ***************************************************************************/ 529 /* main.c */ 530 extern int ip_abort; 531 extern int network_ready; 532 extern struct rom_info rom; 533 extern struct arptable_t arptable[MAX_ARP]; 534 extern struct bootpd_t bootp_data; 535 #define BOOTP_DATA_ADDR (&bootp_data) 536 extern unsigned char *end_of_rfc1533; 537 538 /* config.c */ 539 extern struct nic nic; 540 541 /* Local hack - define some macros to use etherboot source files "as is". */ 542 #ifndef GRUB 543 # undef printf 544 # define printf etherboot_printf 545 # undef sprintf 546 # define sprintf etherboot_sprintf 547 #endif /* GRUB */ 548