mirror of
https://github.com/freebsd/freebsd-src
synced 2024-09-06 17:18:32 +00:00
Refactor net_getparams() to make it easier to get params from sources other
than bootp and rarp. The code which splits a serverip:/rootpath string into rootip and a plain pathname is now a separate net_parse_rootpath() function that can be called by others. The code that sets the kernel env vars needed for nfs_diskless is moved into net_open() so that the variables get set no matter where the params came from. There was already code in net_open() that allowed for the possibility that some other entity has set up the network-related global variables. It uses the rootip variable as the key, assuming that if it is set all the other required variables are set too. These changes don't alter the existing behavior, they just make it easier to actually write some new code to get the params from another source (such as the U-Boot environment).
This commit is contained in:
parent
b7f69c506d
commit
b32852bef6
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=283062
|
@ -111,6 +111,8 @@ net_init(void)
|
|||
static int
|
||||
net_open(struct open_file *f, ...)
|
||||
{
|
||||
char temp[FNAME_SIZE];
|
||||
struct iodesc *d;
|
||||
va_list args;
|
||||
char *devname; /* Device part of file name (or NULL). */
|
||||
int error = 0;
|
||||
|
@ -140,6 +142,10 @@ net_open(struct open_file *f, ...)
|
|||
printf("net_open: netif_open() succeeded\n");
|
||||
#endif
|
||||
}
|
||||
/*
|
||||
* If network params were not set by netif_open(), try to get
|
||||
* them via bootp, rarp, etc.
|
||||
*/
|
||||
if (rootip.s_addr == 0) {
|
||||
/* Get root IP address, and path, etc. */
|
||||
error = net_getparams(netdev_sock);
|
||||
|
@ -151,6 +157,20 @@ net_open(struct open_file *f, ...)
|
|||
return (error);
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Set the variables required by the kernel's nfs_diskless
|
||||
* mechanism. This is the minimum set of variables required to
|
||||
* mount a root filesystem without needing to obtain additional
|
||||
* info from bootp or other sources.
|
||||
*/
|
||||
d = socktodesc(netdev_sock);
|
||||
sprintf(temp, "%6D", d->myea, ":");
|
||||
setenv("boot.netif.hwaddr", temp, 1);
|
||||
setenv("boot.netif.ip", inet_ntoa(myip), 1);
|
||||
setenv("boot.netif.netmask", intoa(netmask), 1);
|
||||
setenv("boot.netif.gateway", inet_ntoa(gateip), 1);
|
||||
setenv("boot.nfsroot.server", inet_ntoa(rootip), 1);
|
||||
setenv("boot.nfsroot.path", rootpath, 1);
|
||||
}
|
||||
netdev_opens++;
|
||||
f->f_devdata = &netdev_sock;
|
||||
|
@ -232,10 +252,7 @@ static int
|
|||
net_getparams(int sock)
|
||||
{
|
||||
char buf[MAXHOSTNAMELEN];
|
||||
char temp[FNAME_SIZE];
|
||||
struct iodesc *d;
|
||||
int i;
|
||||
n_long smask;
|
||||
n_long rootaddr, smask;
|
||||
|
||||
#ifdef SUPPORT_BOOTP
|
||||
/*
|
||||
|
@ -302,21 +319,9 @@ net_getparams(int sock)
|
|||
return (EIO);
|
||||
}
|
||||
exit:
|
||||
/*
|
||||
* If present, strip the server's address off of the rootpath
|
||||
* before passing it along. This allows us to be compatible with
|
||||
* the kernel's diskless (BOOTP_NFSROOT) booting conventions
|
||||
*/
|
||||
for (i = 0; rootpath[i] != '\0' && i < FNAME_SIZE; i++)
|
||||
if (rootpath[i] == ':')
|
||||
break;
|
||||
if (i && i != FNAME_SIZE && rootpath[i] == ':') {
|
||||
rootpath[i++] = '\0';
|
||||
if (inet_addr(&rootpath[0]) != INADDR_NONE)
|
||||
rootip.s_addr = inet_addr(&rootpath[0]);
|
||||
bcopy(&rootpath[i], &temp[0], strlen(&rootpath[i])+1);
|
||||
bcopy(&temp[0], &rootpath[0], strlen(&rootpath[i])+1);
|
||||
}
|
||||
if ((rootaddr = net_parse_rootpath()) != INADDR_NONE)
|
||||
rootip.s_addr = rootaddr;
|
||||
|
||||
#ifdef NETIF_DEBUG
|
||||
if (debug) {
|
||||
printf("net_open: server addr: %s\n", inet_ntoa(rootip));
|
||||
|
@ -324,15 +329,6 @@ net_getparams(int sock)
|
|||
}
|
||||
#endif
|
||||
|
||||
d = socktodesc(sock);
|
||||
sprintf(temp, "%6D", d->myea, ":");
|
||||
setenv("boot.netif.ip", inet_ntoa(myip), 1);
|
||||
setenv("boot.netif.netmask", intoa(netmask), 1);
|
||||
setenv("boot.netif.gateway", inet_ntoa(gateip), 1);
|
||||
setenv("boot.netif.hwaddr", temp, 1);
|
||||
setenv("boot.nfsroot.server", inet_ntoa(rootip), 1);
|
||||
setenv("boot.nfsroot.path", rootpath, 1);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
@ -354,3 +350,24 @@ net_print(int verbose)
|
|||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Strip the server's address off of the rootpath if present and return it in
|
||||
* network byte order, leaving just the pathname part in the global rootpath.
|
||||
*/
|
||||
uint32_t
|
||||
net_parse_rootpath()
|
||||
{
|
||||
int i;
|
||||
n_long addr = INADDR_NONE;
|
||||
|
||||
for (i = 0; rootpath[i] != '\0' && i < FNAME_SIZE; i++)
|
||||
if (rootpath[i] == ':')
|
||||
break;
|
||||
if (i && i != FNAME_SIZE && rootpath[i] == ':') {
|
||||
rootpath[i++] = '\0';
|
||||
addr = inet_addr(&rootpath[0]);
|
||||
bcopy(&rootpath[i], rootpath, strlen(&rootpath[i])+1);
|
||||
}
|
||||
return (addr);
|
||||
}
|
||||
|
|
|
@ -26,5 +26,11 @@
|
|||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _BOOT_DEV_NET_H_
|
||||
#define _BOOT_DEV_NET_H_
|
||||
|
||||
extern struct devsw netdev;
|
||||
|
||||
uint32_t net_parse_rootpath(void);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue