Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F157050637
D20811.id59238.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D20811.id59238.diff
View Options
Index: stand/efi/libefi/efinet.c
===================================================================
--- stand/efi/libefi/efinet.c
+++ stand/efi/libefi/efinet.c
@@ -40,6 +40,8 @@
#include <efi.h>
#include <efilib.h>
+#include "dev_net.h"
+
static EFI_GUID sn_guid = EFI_SIMPLE_NETWORK_PROTOCOL;
static void efinet_end(struct netif *);
@@ -180,6 +182,76 @@
return (ret);
}
+/*
+ * Loader uses BOOTP/DHCP and also uses RARP as a fallback to populate
+ * network parameters and problems with DHCP servers can cause the loader
+ * to fail to populate them. Allow the device to ask about the basic
+ * network parameters and if present use them.
+ */
+static void
+efi_env_net_params(struct iodesc *desc)
+{
+ char *envstr;
+ in_addr_t ipaddr, mask, gwaddr, serveraddr;
+ n_long rootaddr;
+
+ if (envstr = getenv("rootpath"))
+ strlcpy(rootpath, envstr, sizeof(rootpath));
+
+ /*
+ * Get network parameters.
+ */
+ envstr = getenv("ipaddr");
+ ipaddr = (envstr != NULL) ? inet_addr(envstr) : 0;
+
+ envstr = getenv("netmask");
+ mask = (envstr != NULL) ? inet_addr(envstr) : 0;
+
+ envstr = getenv("gatewayip");
+ gwaddr = (envstr != NULL) ? inet_addr(envstr) : 0;
+
+ envstr = getenv("serverip");
+ serveraddr = (envstr != NULL) ? inet_addr(envstr) : 0;
+
+ /* No network params. */
+ if (!(ipaddr || mask || gwaddr || serveraddr))
+ return;
+
+ /* Partial network params. */
+ if (!(ipaddr && mask && gwaddr && serveraddr)) {
+ printf("Incomplete network settings from U-Boot\n");
+ return;
+ }
+
+ /*
+ * Set network parameters.
+ */
+ myip.s_addr = ipaddr;
+ netmask = mask;
+ gateip.s_addr = gwaddr;
+ servip.s_addr = serveraddr;
+
+ /*
+ * There must be a rootpath. It may be ip:/path or it may be just the
+ * path in which case the ip needs to be serverip.
+ */
+ rootaddr = net_parse_rootpath();
+ if (rootaddr == INADDR_NONE)
+ rootaddr = serveraddr;
+ rootip.s_addr = rootaddr;
+
+#ifdef EFINET_DEBUG
+ printf("%s: ip=%s\n", __func__, inet_ntoa(myip));
+ printf("%s: mask=%s\n", __func__, intoa(netmask));
+ printf("%s: gateway=%s\n", __func__, inet_ntoa(gateip));
+ printf("%s: server=%s\n", __func__, inet_ntoa(servip));
+#endif
+
+ desc->myip = myip;
+
+ return;
+}
+
static void
efinet_init(struct iodesc *desc, void *machdep_hint)
{
@@ -189,6 +261,9 @@
EFI_STATUS status;
UINT32 mask;
+ /* Attempt to get netboot params from env */
+ efi_env_net_params(desc);
+
if (nif->nif_driver->netif_ifs[nif->nif_unit].dif_unit < 0) {
printf("Invalid network interface %d\n", nif->nif_unit);
return;
Index: stand/libsa/net.h
===================================================================
--- stand/libsa/net.h
+++ stand/libsa/net.h
@@ -91,6 +91,7 @@
extern struct in_addr swapip;
extern struct in_addr gateip;
extern struct in_addr nameip;
+extern struct in_addr servip;
extern n_long netmask;
extern u_int intf_mtu;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, May 19, 3:43 AM (15 h, 13 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33289995
Default Alt Text
D20811.id59238.diff (2 KB)
Attached To
Mode
D20811: Allow efi loader to get network params from uboot
Attached
Detach File
Event Timeline
Log In to Comment