Page MenuHomeFreeBSD

D20811.id59238.diff
No OneTemporary

D20811.id59238.diff

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

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)

Event Timeline