Date: Mon, 5 May 1997 11:46:22 +0200 (CEST) From: Luigi Rizzo <luigi@iet.unipi.it> To: FreeBSD-gnats-submit@FreeBSD.ORG Subject: i386/3504: New features (and manpage) for netboot Message-ID: <199705050946.LAA01266@prova.iet.unipi.it> Resent-Message-ID: <199705051000.DAA15910@hub.freebsd.org>
index | next in thread | raw e-mail
>Number: 3504
>Category: i386
>Synopsis: New features (and manpage) for netboot
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Mon May 5 03:00:01 PDT 1997
>Last-Modified:
>Originator: Luigi Rizzo
>Organization:
DEIT
>Release: FreeBSD 2.2.1-RELEASE i386
>Environment:
FreeBSD 2.2.1-RELEASE i386
>Description:
Enclosed are a set of changes to netboot so that booting
parameters can be acquired using bootp instead of TFTP
(which becomes totally useless at this point). This saves
a lot of troubles to administrators since all info on
booting are in one place instead of two.
The patch are relatively short, and I have tried to write a
manpage for netboot as well (although that must be revised --
I am not fluent at all with nroff macros).
This patch has been tested with 2.2.1-R (and we have been
using it for months with 2.1.7)
>How-To-Repeat:
--
>Fix:
Encloses is a patch for /sys/i386/boot/netboot against
2.2.1-R files.
diff --new-file -ubwr netboot.22R/Makefile netboot/Makefile
--- netboot.22R/Makefile Wed Apr 3 21:01:29 1996
+++ netboot/Makefile Sat May 3 23:19:29 1997
@@ -36,7 +36,6 @@
CFLAGS += -DPCI -DPCI_VENDOR=${PCI_VENDOR} -DPCI_DEVICE=${PCI_DEVICE}
CFLAGS += -DPCI_CLASS=${PCI_CLASS} -DASK_BOOT
#NS8390= -DINCLUDE_WD -DWD_DEFAULT_MEM=0xD0000
-#NS8390= -DINCLUDE_WD -DWD_DEFAULT_MEM=0xD0000
NS8390= -DINCLUDE_NE
#NS8390+= -DINCLUDE_3COM -D_3COM_BASE=0x300
CLEANFILES+= netboot.com
diff --new-file -ubwr netboot.22R/main.c netboot/main.c
--- netboot.22R/main.c Sat Nov 2 21:32:14 1996
+++ netboot/main.c Sat May 3 23:53:28 1997
@@ -31,18 +31,11 @@
extern int packetlen, rpc_id;
char broadcast[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
-/**************************************************************************
-MAIN - Kick off routine
-**************************************************************************/
-main()
+ask(char *s)
{
int c;
- char *p;
- extern char edata[], end[];
- for (p=edata; p<end; p++) *p = 0; /* Zero BSS */
-#ifdef ASK_BOOT
while (1) {
- printf("\n\rBoot from Network (Y/N) ? ");
+ printf("%s ? ",s);
c = getchar();
if ((c >= 'a') && (c <= 'z')) c &= 0x5F;
if (c == '\r') break;
@@ -53,6 +46,25 @@
break;
printf(" - bad response\n\r");
}
+}
+
+/**************************************************************************
+MAIN - Kick off routine
+**************************************************************************/
+main()
+{
+ int c;
+ char *p;
+ extern char edata[], end[];
+ for (p=edata; p<end; p++) *p = 0; /* Zero BSS */
+#if 0
+ {
+ static char *argv[]= {"scanpci", NULL};
+ scanpci(1, argv);
+ }
+#endif
+#ifdef ASK_BOOT
+ ask("\n\rBoot from Network (Y/N) ? ");
#endif
/* get the bios's idea about the disks geometry */
@@ -60,10 +72,10 @@
bootinfo.bi_bios_geom[c] = get_diskinfo(c + 0x80);
gateA20();
- printf("\r\nBOOTP/TFTP/NFS bootstrap loader ESC for menu\n\r");
- printf("\r\nSearching for adapter...");
+ printf("\nBOOTP/TFTP/NFS bootstrap loader ESC for menu\n"
+ "\nSearching for adapter...");
if (!eth_probe()) {
- printf("No adapter found.\r\n");
+ printf("No adapter found.\n");
exit(0);
}
kernel = DEFAULT_BOOTFILE;
@@ -113,6 +125,7 @@
long addr, broadcast;
unsigned long pad;
+ config_buffer[0]='\0'; /* clear; bootp might fill this up */
/* Initialize this early on */
nfsdiskless.root_args.rsize = 8192;
@@ -142,6 +155,10 @@
printf("\n=>>"); getchar();
#endif
+ /*** check if have got info from bootp ***/
+ if (config_buffer[0])
+ goto cfg_done;
+#ifdef USE_TFTP
/* Now use TFTP to load configuration file */
sprintf(cfg,"/tftpboot/freebsd.%I",arptable[ARP_CLIENT].ipaddr);
if (tftp(cfg) || tftp(cfg+10))
@@ -152,6 +169,8 @@
sprintf(cfg,"/tftpboot/cfg.%I",arptable[ARP_CLIENT].ipaddr);
if (tftp(cfg) || tftp(cfg+10))
goto cfg_done;
+#endif
+ /* not found; using default values... */
sprintf(config_buffer,"rootfs %I:/usr/diskless_root",
arptable[ARP_SERVER].ipaddr);
printf("Unable to load config file, guessing:\r\n\t%s\r\n",
@@ -587,6 +606,17 @@
return(0);
}
+void
+bootp_string(char *name, char *bootp_ptr)
+{
+ char tmp_buf[512]; /* oversized, but who cares ! */
+ bzero(tmp_buf, sizeof(tmp_buf));
+ bcopy(bootp_ptr+2, tmp_buf, TAG_LEN(bootp_ptr));
+ sprintf(config_buffer+strlen(config_buffer),
+ "%s %s\n", name, tmp_buf);
+}
+
+
/**************************************************************************
DECODE_RFC1048 - Decodes RFC1048 header
**************************************************************************/
@@ -598,6 +628,7 @@
if (bcompare(p, rfc1048_cookie, 4)) { /* RFC 1048 header */
p += 4;
while(p < end) {
+ int len;
switch (*p) {
case RFC1048_PAD:
p++;
@@ -613,8 +644,23 @@
bcopy(p+2,&netmask,4);
break;
case RFC1048_HOSTNAME:
- bcopy(p+2, &nfsdiskless.my_hostnam, TAG_LEN(p));
- hostnamelen = (TAG_LEN(p) + 3) & ~3;
+ bootp_string("hostname", p);
+ break;
+ case RFC1048_ROOT_PATH: /* XXX check len */
+ bootp_string("rootfs", p);
+ break;
+ case RFC1048_SWAP_PATH:
+ bootp_string("swapfs", p);
+ break;
+ case RFC1048_SWAP_LEN: /* T129 */
+ sprintf(config_buffer+strlen(config_buffer),
+ "swapsize %d\n", ntohl(*(long *)(p+2)) );
+ break;
+ case 130: /* root mount options */
+ bootp_string("rootopts", p);
+ break;
+ case 131: /* swap mount options */
+ bootp_string("swapopts", p);
break;
default:
printf("Unknown RFC1048-tag ");
diff --new-file -ubwr netboot.22R/netboot.8 netboot/netboot.8
--- netboot.22R/netboot.8 Thu Jan 1 01:00:00 1970
+++ netboot/netboot.8 Mon May 5 11:33:38 1997
@@ -0,0 +1,92 @@
+.\" $Id: netboot.8,v 1.3.2.1 1996/12/10 16:43:01 joerg Exp $
+.Dd May 5, 1997
+.Dt NETBOOT 8
+.\".Os BSD 4
+.Sh NAME
+.Nm netboot
+.Nd Allows remote booting of the operating system
+.Sh SYNOPSIS
+.Nm
+.It Fl b
+is used for booting the operating system over a network card. The
+program is either loaded into a ROM, or run from DOS.
+.Pp
+.Sh DESCRIPTION
+.Nm
+loads parameters such as IP addresses, kernel name and filesystem
+names from a bootp server, tries to mount the specified root and swap
+filesystems,
+loads the specified kernel from the root filesystem using NFSv2, and
+then gives control to the kernel.
+.Pp
+The bootp server must be configured appropriately. An example
+configuration for /etc/bootptab is the following:
+.Bd -literal
+ .default:\\
+ :sm=255.255.255.0:\\
+ :gw=your.gateway.ip:\\
+ :ds=your.nameserver.ip:\\
+ :hn:ht=1:vm=rfc1048:\\
+ :sw=server.ip:\\
+ :rp="rootfs.ip:/rootfs/path":\\
+ :T128="swapfs.ip:/swapfs/path":\\
+ :T129=swapsize:\\
+ :T130="root,mount,options":\\
+ :T131="swap,mount,options":
+ .client01:bf="kernel.300":ha=00400530d6d9:tc=.default:
+ .client02:bf="kernel.280":ha=00400530d6d3:tc=.default:
+.Ed
+.Pp
+For a precise description of the bootptab parameters, see
+bootptab (5) .
+.Pp
+The
+.Nm
+code uses options as follows.
+.Pp
+sm indicates the subnet mask.
+.Pp
+gw is the ip address of the gateway.
+.Pp
+ds is the ip address of the name server.
+.Pp
+hn instructs the bootp server to send the hostname in the reply.
+.Pp
+ht=1 indicates that the hardware is ethernet.
+.Pp
+vm=rfc1048 indicates the use of rfc1048 extensions.
+.Pp
+sw indicates the ip address of the NFS server, and is used for both
+the root filesystem and the swap filesystem server. It is optional in
+that it can be overridden from what is specified in the "rp" and "T128"
+options.
+.Pp
+rp specifies the path to the root partition. Optionally, the IP
+address of the server can be specified, followed by a :
+.Pp
+T128 specifies the path to the swap partition. Optionally, the IP
+address of the server can be specified, followed by a : . The
+actual swapfile is a file named swap.X.Y.Z.T where X.Y.Z.T is the
+IP address of the client. In both "rp" and "T128" options
+the sequence %I can be used which is replaced with the IP address of
+the client. The swap partition is optional. If specified, the swap
+file must exist and have at least the size specified with T129.
+.Pp
+T129 specifies the size of the swap file, in KB. Must be specified as
+an octal number. Th
+.Pp
+T130 specified root mount options (e.g. noatime,tcp, ...).
+.Pp
+T131 specified swap mount options.
+.Pp
+bf is the name of the kernel. If not specified, it defaults to
+"kernel".
+
+.Sh SEE ALSO
+.Xr bootd 8 ,
+.Xr bootptab 5
+.Sh BUGS
+The T129 option should not be necessary, since the size of the
+swapfile could be inferred using NFS calls.
+The T130 and T131 options are still unsupported.
+
diff --new-file -ubwr netboot.22R/netboot.h netboot/netboot.h
--- netboot.22R/netboot.h Sat Dec 14 15:32:05 1996
+++ netboot/netboot.h Sat May 3 23:42:39 1997
@@ -96,10 +96,20 @@
#define RFC1048_COOKIE { 99, 130, 83, 99 }
#define RFC1048_PAD 0
#define RFC1048_NETMASK 1
+#define RFC1048_TIME_OFFSET 2
#define RFC1048_GATEWAY 3
+#define RFC1048_TIME_SERVER 4
+#define RFC1048_NAME_SERVER 5
+#define RFC1048_DOMAIN_SERVER 6
#define RFC1048_HOSTNAME 12
+#define RFC1048_BOOT_SIZE 12 /* XXX */
+#define RFC1048_SWAP_SERVER 16
+#define RFC1048_ROOT_PATH 17
+#define RFC1048_SWAP_PATH 128 /* T128 */
+#define RFC1048_SWAP_LEN 129 /* T129 */
+
#define RFC1048_END 255
-#define BOOTP_VENDOR_LEN 64
+#define BOOTP_VENDOR_LEN 256
#define TFTP_RRQ 1
#define TFTP_WRQ 2
@@ -188,7 +198,7 @@
char bp_hwaddr[16];
char bp_sname[64];
char bp_file[128];
- char bp_vend[64];
+ char bp_vend[BOOTP_VENDOR_LEN];
};
struct tftp_t {
diff --new-file -ubwr netboot.22R/ns8390.c netboot/ns8390.c
--- netboot.22R/ns8390.c Sat Dec 14 15:32:06 1996
+++ netboot/ns8390.c Sat May 3 23:49:17 1997
@@ -19,6 +19,12 @@
**************************************************************************/
+/* #define GWETHER */
+DELAY(int x)
+{ volatile long a, b, l;
+ for (x; x>0; x--) b=a;
+}
+
#include "netboot.h"
#include "ns8390.h"
@@ -284,13 +290,19 @@
ne_again:
eth_asic_base = *tent_base + NE_ASIC_OFFSET;
eth_nic_base = *tent_base;
+ printf("Looking for NE1000/NE2000 at 0x%x\n", eth_nic_base);
eth_vendor = VENDOR_NOVELL;
eth_flags = FLAG_PIO;
eth_memsize = MEM_16384;
eth_tx_start = 32;
+#ifdef GWETHER
+ outb(eth_asic_base + NE_RESET, 0);
+ DELAY(200);
+#endif
c = inb(eth_asic_base + NE_RESET);
outb(eth_asic_base + NE_RESET, c);
+ DELAY(5000);
inb(0x84);
outb(eth_nic_base + D8390_P0_COMMAND, D8390_COMMAND_STP |
D8390_COMMAND_RD2);
@@ -317,7 +329,8 @@
return (0);
}
eth_pio_read(0, romdata, 16);
- printf("\r\nNE1000/NE2000 base 0x%x, addr ", eth_nic_base);
+ printf("\nNE1000/NE2000 (%d bit) base 0x%x, addr ",
+ eth_flags & FLAG_16BIT ? 16:8, eth_nic_base);
for (i=0; i<6; i++) {
printf("%b",(int)(arptable[ARP_CLIENT].node[i] = romdata[i
+ ((eth_flags & FLAG_16BIT) ? i : 0)]));
diff --new-file -ubwr netboot.22R/start2.S netboot/start2.S
--- netboot.22R/start2.S Tue Nov 12 09:02:24 1996
+++ netboot/start2.S Sat May 3 23:54:24 1997
@@ -26,6 +26,9 @@
.word PCI_DEVICE /* device ID */
.word 0 /* vital product data */
.word 0x0018 /* PCI data structure */
+#if 0
+ .word 0 /* XXX check the spec. I don't understand this */
+#endif
.byte 0 /* PCI data struct. rev -- 0 */
.byte PCI_CLASS /* Class code */
.word (ROMSIZE>>9) /* no. of 512B blocks */
>Audit-Trail:
>Unformatted:
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199705050946.LAA01266>
