Author: jhibbits
Date: Fri Jul 12 00:54:20 2019
New Revision: 349928
URL: https://svnweb.freebsd.org/changeset/base/349928

Log:
  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.
  
  Submitted by: Siddharth Tuli <siddharthtuli_gmail.com>
  Reviewed by:  imp
  Sponsored by: Juniper Networks, Inc.
  Differential Revision:        https://reviews.freebsd.org/D20811

Modified:
  head/stand/efi/libefi/efinet.c
  head/stand/libsa/net.h

Modified: head/stand/efi/libefi/efinet.c
==============================================================================
--- head/stand/efi/libefi/efinet.c      Fri Jul 12 00:50:33 2019        
(r349927)
+++ head/stand/efi/libefi/efinet.c      Fri Jul 12 00:54:20 2019        
(r349928)
@@ -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: head/stand/libsa/net.h
==============================================================================
--- head/stand/libsa/net.h      Fri Jul 12 00:50:33 2019        (r349927)
+++ head/stand/libsa/net.h      Fri Jul 12 00:54:20 2019        (r349928)
@@ -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;
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to