svn commit: r354011 - in stable/12/stand: efi/libefi libsa

Kyle Evans kevans at FreeBSD.org
Thu Oct 24 04:08:25 UTC 2019


Author: kevans
Date: Thu Oct 24 04:08:24 2019
New Revision: 354011
URL: https://svnweb.freebsd.org/changeset/base/354011

Log:
  MFC r349928: Allow efi loader to get network params from uboot
  
  Summary:
  efi loader does not work with static network parameters. It always uses
  BOOTP/DHCP and also uses RARP as a fallback.  Problems with DHCP servers can
  cause the loader to fail to populate network parameters.

Modified:
  stable/12/stand/efi/libefi/efinet.c
  stable/12/stand/libsa/net.h
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/stand/efi/libefi/efinet.c
==============================================================================
--- stable/12/stand/efi/libefi/efinet.c	Thu Oct 24 04:05:53 2019	(r354010)
+++ stable/12/stand/efi/libefi/efinet.c	Thu Oct 24 04:08:24 2019	(r354011)
@@ -40,6 +40,8 @@ __FBSDID("$FreeBSD$");
 #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 *);
@@ -198,7 +200,75 @@ efinet_get(struct iodesc *desc, void **pkt, time_t tim
 	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")) != NULL)
+		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 == 0 && mask == 0 && gwaddr == 0 && serveraddr == 0)
+		return;
+
+	/* Partial network params. */
+	if (ipaddr == 0 || mask == 0 || gwaddr == 0 || serveraddr == 0) {
+		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;
+}
+
+static void
 efinet_init(struct iodesc *desc, void *machdep_hint)
 {
 	struct netif *nif = desc->io_netif;
@@ -206,6 +276,9 @@ efinet_init(struct iodesc *desc, void *machdep_hint)
 	EFI_HANDLE h;
 	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);

Modified: stable/12/stand/libsa/net.h
==============================================================================
--- stable/12/stand/libsa/net.h	Thu Oct 24 04:05:53 2019	(r354010)
+++ stable/12/stand/libsa/net.h	Thu Oct 24 04:08:24 2019	(r354011)
@@ -91,6 +91,7 @@ extern	struct in_addr rootip;
 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;
 


More information about the svn-src-stable-12 mailing list