Annotation of sys/arch/hp300/stand/uboot/netio.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: netio.c,v 1.3 2006/08/17 06:31:10 miod Exp $ */
2: /* $NetBSD: netio.c,v 1.5 1997/01/30 10:32:56 thorpej Exp $ */
3:
4: /*
5: * Copyright (c) 1995, 1996 Jason R. Thorpe
6: * Copyright (c) 1995 Gordon W. Ross
7: * All rights reserved.
8: *
9: * Redistribution and use in source and binary forms, with or without
10: * modification, are permitted provided that the following conditions
11: * are met:
12: * 1. Redistributions of source code must retain the above copyright
13: * notice, this list of conditions and the following disclaimer.
14: * 2. Redistributions in binary form must reproduce the above copyright
15: * notice, this list of conditions and the following disclaimer in the
16: * documentation and/or other materials provided with the distribution.
17: * 3. The name of the author may not be used to endorse or promote products
18: * derived from this software without specific prior written permission.
19: * 4. All advertising materials mentioning features or use of this software
20: * must display the following acknowledgement:
21: * This product includes software developed by Gordon W. Ross
22: *
23: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33: */
34:
35: /*
36: * This module implements a "raw device" interface suitable for
37: * use by the stand-alone I/O library NFS code. This interface
38: * does not support any "block" access, and exists only for the
39: * purpose of initializing the network interface, getting boot
40: * parameters, and performing the NFS mount.
41: *
42: * At open time, this does:
43: *
44: * find interface - netif_open()
45: * RARP for IP address - rarp_getipaddress()
46: * RPC/bootparams - callrpc(d, RPC_BOOTPARAMS, ...)
47: * RPC/mountd - nfs_mount(sock, ip, path)
48: *
49: * the root file handle from mountd is saved in a global
50: * for use by the NFS open code (NFS/lookup).
51: */
52:
53: #include <sys/param.h>
54: #include <sys/socket.h>
55: #include <net/if.h>
56: #include <netinet/in.h>
57: #include <netinet/if_ether.h>
58: #include <netinet/in_systm.h>
59:
60: #include <lib/libsa/stand.h>
61:
62: #include "samachdep.h"
63:
64: #include <lib/libsa/net.h>
65: #include <lib/libsa/netif.h>
66: #include <lib/libsa/bootparam.h>
67: #include <lib/libsa/nfs.h>
68:
69: extern int nfs_root_node[]; /* XXX - get from nfs_mount() */
70:
71: struct in_addr myip, rootip, gateip;
72: n_long netmask;
73: char rootpath[FNAME_SIZE];
74:
75: int netdev_sock = -1;
76: static int open_count;
77:
78: int netio_ask = 0; /* default to bootparam, can override */
79:
80: static char input_line[100];
81:
82: /* Why be any different? */
83: #define SUN_BOOTPARAMS
84:
85: int netclose(struct open_file *);
86: int netmountroot(struct open_file *, char *);
87: int netopen(struct open_file *, char *);
88: int netstrategy(void *, int, daddr_t, size_t, void *, size_t *);
89:
90: /*
91: * Called by devopen after it sets f->f_dev to our devsw entry.
92: * This opens the low-level device and sets f->f_devdata.
93: */
94: int
95: netopen(struct open_file *f, char *devname)
96: {
97: int error = 0;
98:
99: /* On first open, do netif open, mount, etc. */
100: if (open_count == 0) {
101: /* Find network interface. */
102: if ((netdev_sock = netif_open(devname)) < 0)
103: return (error=ENXIO);
104: if ((error = netmountroot(f, devname)) != 0)
105: return (error);
106: }
107: open_count++;
108: f->f_devdata = nfs_root_node;
109: return (error);
110: }
111:
112: int
113: netclose(struct open_file *f)
114: {
115: /* On last close, do netif close, etc. */
116: if (open_count > 0)
117: if (--open_count == 0)
118: netif_close(netdev_sock);
119: f->f_devdata = NULL;
120: return (0);
121: }
122:
123: int
124: netstrategy(void *devdata, int func, daddr_t dblk, size_t size, void *v_buf,
125: size_t *rsize)
126: {
127:
128: *rsize = size;
129: return EIO;
130: }
131:
132: int
133: netmountroot(struct open_file *f, char *devname)
134: {
135: int error;
136: struct iodesc *d;
137:
138: #ifdef DEBUG
139: printf("netmountroot: %s\n", devname);
140: #endif
141:
142: if (netio_ask) {
143: get_my_ip:
144: printf("My IP address? ");
145: bzero(input_line, sizeof(input_line));
146: gets(input_line);
147: if ((myip.s_addr = inet_addr(input_line)) ==
148: htonl(INADDR_NONE)) {
149: printf("invalid IP address: %s\n", input_line);
150: goto get_my_ip;
151: }
152:
153: get_my_netmask:
154: printf("My netmask? ");
155: bzero(input_line, sizeof(input_line));
156: gets(input_line);
157: if ((netmask = inet_addr(input_line)) ==
158: htonl(INADDR_NONE)) {
159: printf("invalid netmask: %s\n", input_line);
160: goto get_my_netmask;
161: }
162:
163: get_my_gateway:
164: printf("My gateway? ");
165: bzero(input_line, sizeof(input_line));
166: gets(input_line);
167: if ((gateip.s_addr = inet_addr(input_line)) ==
168: htonl(INADDR_NONE)) {
169: printf("invalid IP address: %s\n", input_line);
170: goto get_my_gateway;
171: }
172:
173: get_server_ip:
174: printf("Server IP address? ");
175: bzero(input_line, sizeof(input_line));
176: gets(input_line);
177: if ((rootip.s_addr = inet_addr(input_line)) ==
178: htonl(INADDR_NONE)) {
179: printf("invalid IP address: %s\n", input_line);
180: goto get_server_ip;
181: }
182:
183: get_server_path:
184: printf("Server path? ");
185: bzero(rootpath, sizeof(rootpath));
186: gets(rootpath);
187: if (rootpath[0] == '\0' || rootpath[0] == '\n')
188: goto get_server_path;
189:
190: if ((d = socktodesc(netdev_sock)) == NULL)
191: return (EMFILE);
192:
193: d->myip = myip;
194:
195: goto do_nfs_mount;
196: }
197:
198: /*
199: * Get info for NFS boot: our IP address, our hostname,
200: * server IP address, and our root path on the server.
201: * There are two ways to do this: The old, Sun way,
202: * and the more modern, BOOTP way. (RFC951, RFC1048)
203: */
204:
205: #ifdef SUN_BOOTPARAMS
206: /* Get boot info using RARP and Sun bootparams. */
207:
208: /* Get our IP address. (rarp.c) */
209: if (rarp_getipaddress(netdev_sock) == -1)
210: return (errno);
211:
212: printf("boot: client IP address: %s\n", inet_ntoa(myip));
213:
214: /* Get our hostname, server IP address. */
215: if (bp_whoami(netdev_sock))
216: return (errno);
217:
218: printf("boot: client name: %s\n", hostname);
219:
220: /* Get the root pathname. */
221: if (bp_getfile(netdev_sock, "root", &rootip, rootpath))
222: return (errno);
223:
224: #else
225:
226: /* Get boot info using BOOTP way. (RFC951, RFC1048) */
227: bootp(netdev_sock);
228:
229: printf("Using IP address: %s\n", inet_ntoa(myip));
230:
231: printf("myip: %s (%s)", hostname, inet_ntoa(myip));
232: if (gateip)
233: printf(", gateip: %s", inet_ntoa(gateip));
234: if (mask)
235: printf(", mask: %s", intoa(netmask));
236: printf("\n");
237:
238: #endif /* SUN_BOOTPARAMS */
239:
240: printf("root addr=%s path=%s\n", inet_ntoa(rootip), rootpath);
241:
242: do_nfs_mount:
243: /* Get the NFS file handle (mount). */
244: error = nfs_mount(netdev_sock, rootip, rootpath);
245:
246: return (error);
247: }
CVSweb