xref: /netbsd-src/sys/arch/evbarm/stand/boot2440/dev_net.c (revision bd47c13c7be6bf526cf6c8ccc427c4adcc305963)
1 /*-
2  * Copyright (c) 2012 The NetBSD Foundation, Inc.
3  * All rights reserved.
4  *
5  * This code is derived from software contributed to The NetBSD Foundation
6  * by Paul Fleischer <paul@xpg.dk>
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
18  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
21  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  */
29 #include <sys/param.h>
30 
31 #include <netinet/in.h>
32 #include <netinet/in_systm.h>
33 
34 #include <lib/libsa/stand.h>
35 #include <lib/libsa/net.h>
36 #include <lib/libsa/bootp.h>
37 #include <lib/libsa/nfs.h>
38 
39 #include <lib/libkern/libkern.h>
40 
41 
42 extern int netif_open(void*);
43 extern int netif_init(unsigned int tag);
44 
45 extern struct in_addr servip;
46 
47 static int netdev_sock = -1;
48 
49 int
net_open(struct open_file * f,...)50 net_open(struct open_file *f, ...)
51 {
52 	va_list ap;
53 	char *path, *proto;
54 	int error = 0;
55 
56 	if( netif_init(0) == 0 ) {
57 		error = ENODEV;
58 		goto out;
59 	}
60 
61 	va_start(ap, f);
62 	path = va_arg(ap, char *);
63 	proto = va_arg(ap, char *);
64 	va_end(ap);
65 	if ((netdev_sock = netif_open(path)) < 0) {
66 		error = errno;
67 		goto out;
68 	}
69 
70 	/* send DHCP request */
71 	bootp(netdev_sock);
72 
73 	/* IP address was not found */
74 	if (myip.s_addr == 0) {
75 		error = ENOENT;
76 		goto out;
77 	}
78 
79 	if (path[0] != '\0') {
80 		char *c;
81 		char ip_addr[200];
82 		/* Parse path specification as IP-ADDR:PATH and overwrite
83 		   rootip and rootpath with those
84 		 */
85 
86 		for(c=path; *c != '\0' && *c != ':'; c++);
87 
88 		if (*c == ':') {
89 			char *filename;
90 			strncpy(ip_addr, path, (c-path));
91 			ip_addr[(c-path)] = '\0';
92 			printf("IP addr: %s\n", ip_addr);
93 			rootip.s_addr = inet_addr(ip_addr);
94 
95 			c++;
96 			/* Finally, strip away file-component and copy it to
97 			   bootfile */
98 			for(filename = c+strlen(c); *filename != '/' && filename > c; filename--);
99 			strncpy(rootpath, c, (filename-c));
100 			rootpath[(filename-c)] = '\0';
101 			printf("Root path: %s\n", rootpath);
102 			strcpy(bootfile, ++filename);
103 			printf("Bootfile: %s\n", bootfile);
104 		} else {
105 			/* No ':' found, assume it's just a filename */
106 			strcpy(bootfile, path);
107 		}
108 	}
109 
110 	/* boot filename was not found */
111 	if (bootfile[0] == '\0')
112 		strcpy(bootfile, "netbsd");
113 
114 	if (strcmp(proto, "nfs") == 0
115 	    && (nfs_mount(netdev_sock, rootip, rootpath) != 0)) {
116 		error = errno;
117 		goto out;
118 	}
119 
120 	f->f_devdata = &netdev_sock;
121 out:
122 	return (error);
123 }
124 
125 int
net_close(struct open_file * f)126 net_close(struct open_file *f)
127 
128 {
129 	return (0);
130 }
131 
132 int
net_strategy(void * d,int f,daddr_t b,size_t s,void * buf,size_t * r)133 net_strategy(void *d, int f, daddr_t b, size_t s, void *buf, size_t *r)
134 {
135 
136 	return (EIO);
137 }
138