1 /* $OpenBSD: net.c,v 1.7 2021/01/30 14:37:01 deraadt Exp $ */
2 /* $NetBSD: net.c,v 1.1 1997/04/16 20:29:18 thorpej Exp $ */
3
4 /*
5 * Copyright (C) 1995 Wolfgang Solfrank.
6 * Copyright (C) 1995 TooLs GmbH.
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. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed by TooLs GmbH.
20 * 4. The name of TooLs GmbH may not be used to endorse or promote products
21 * derived from this software without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``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 TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
29 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
30 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
31 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
32 * 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 * BOOTP - bootp()
46 * RPC/mountd - nfs_mount()
47 *
48 * The root file handle from mountd is saved in a global
49 * for use by the NFS open code (NFS/lookup).
50 *
51 * Note: this is based in part on sys/arch/sparc/stand/net.c
52 */
53
54 #include <sys/param.h>
55 #include <sys/socket.h>
56 #include <net/if.h>
57 #include <netinet/in.h>
58 #include <netinet/if_ether.h>
59
60 #include <lib/libsa/stand.h>
61 #include <lib/libsa/net.h>
62 #include <lib/libsa/netif.h>
63 #include <lib/libsa/bootp.h>
64 #include <lib/libsa/nfs.h>
65
66 #include "ofdev.h"
67
68 int net_mountroot(void);
69
70 extern char rootpath[FNAME_SIZE];
71
72 static int netdev_sock = -1;
73 static int open_count;
74
75 /*
76 * Called by devopen after it sets f->f_dev to our devsw entry.
77 * This opens the low-level device and sets f->f_devdata.
78 */
79 int
net_open(struct of_dev * op)80 net_open(struct of_dev *op)
81 {
82 int error = 0;
83
84 /*
85 * On first open, do netif open, mount, etc.
86 */
87 if (open_count == 0) {
88 /* Find network interface. */
89 if ((netdev_sock = netif_open(op)) < 0) {
90 error = errno;
91 goto bad;
92 }
93 if ((error = net_mountroot()) != 0)
94 goto bad;
95 }
96 open_count++;
97 bad:
98 if (netdev_sock >= 0 && open_count == 0) {
99 netif_close(netdev_sock);
100 netdev_sock = -1;
101 }
102 return error;
103 }
104
105 void
net_close(struct of_dev * op)106 net_close(struct of_dev *op)
107 {
108 /*
109 * On last close, do netif close, etc.
110 */
111 if (open_count > 0)
112 if (--open_count == 0) {
113 netif_close(netdev_sock);
114 netdev_sock = -1;
115 }
116 }
117
118 int
net_mountroot()119 net_mountroot()
120 {
121
122 #ifdef DEBUG
123 printf("net_mountroot\n");
124 #endif
125
126 /*
127 * Get info for NFS boot: our IP address, out hostname,
128 * server IP address, and our root path on the server.
129 * We use BOOTP (RFC951, RFC1532) exclusively as mandated
130 * by PowerPC Reference Platform Specification I.4.2
131 */
132
133 bootp(netdev_sock);
134
135 if (myip.s_addr == 0)
136 return ETIMEDOUT;
137
138 printf("Using IP address: %s\n", inet_ntoa(myip));
139
140 #ifdef DEBUG
141 printf("myip: %s (%s)", hostname, inet_ntoa(myip));
142 if (gateip.s_addr)
143 printf(", gateip: %s", inet_ntoa(gateip));
144 if (netmask)
145 printf(", netmask: %s", intoa(netmask));
146 printf("\n");
147 #endif
148 printf("root addr=%s path=%s\n", inet_ntoa(rootip), rootpath);
149
150 /*
151 * Get the NFS file handle (mount).
152 */
153 if (nfs_mount(netdev_sock, rootip, rootpath) < 0)
154 return errno;
155 return 0;
156 }
157