From owner-freebsd-bugs Mon May 5 03:00:04 1997 Return-Path: Received: (from root@localhost) by hub.freebsd.org (8.8.5/8.8.5) id DAA15935 for bugs-outgoing; Mon, 5 May 1997 03:00:04 -0700 (PDT) Received: (from gnats@localhost) by hub.freebsd.org (8.8.5/8.8.5) id DAA15910; Mon, 5 May 1997 03:00:02 -0700 (PDT) Resent-Date: Mon, 5 May 1997 03:00:02 -0700 (PDT) Resent-Message-Id: <199705051000.DAA15910@hub.freebsd.org> Resent-From: gnats (GNATS Management) Resent-To: freebsd-bugs Resent-Reply-To: FreeBSD-gnats@FreeBSD.ORG, luigi@iet.unipi.it Received: from prova.iet.unipi.it (prova.iet.unipi.it [131.114.9.236]) by hub.freebsd.org (8.8.5/8.8.5) with ESMTP id CAA15145 for ; Mon, 5 May 1997 02:42:33 -0700 (PDT) Received: (from luigi@localhost) by prova.iet.unipi.it (8.8.5/8.8.5) id LAA01266; Mon, 5 May 1997 11:46:22 +0200 (CEST) Message-Id: <199705050946.LAA01266@prova.iet.unipi.it> Date: Mon, 5 May 1997 11:46:22 +0200 (CEST) From: Luigi Rizzo Reply-To: luigi@iet.unipi.it To: FreeBSD-gnats-submit@FreeBSD.ORG X-Send-Pr-Version: 3.2 Subject: i386/3504: New features (and manpage) for netboot Sender: owner-bugs@FreeBSD.ORG X-Loop: FreeBSD.org Precedence: bulk >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= '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>"); 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: