Merge tag 'efi-2020-07-rc6' of https://gitlab.denx.de/u-boot/custodians/u-boot-efi
[oweals/u-boot.git] / net / bootp.c
index efa959971c279fe4e74d04ec0007d0cb1ef52e34..de3dab4114d92b25bd0a58f2ea422add414fe9b9 100644 (file)
@@ -9,9 +9,15 @@
  */
 
 #include <common.h>
+#include <bootstage.h>
 #include <command.h>
+#include <env.h>
 #include <efi_loader.h>
+#include <log.h>
 #include <net.h>
+#include <rand.h>
+#include <uuid.h>
+#include <linux/delay.h>
 #include <net/tftp.h>
 #include "bootp.h"
 #ifdef CONFIG_LED_STATUS
@@ -147,9 +153,14 @@ static void store_net_params(struct bootp_hdr *bp)
 {
 #if !defined(CONFIG_BOOTP_SERVERIP)
        struct in_addr tmp_ip;
+       bool overwrite_serverip = true;
+
+#if defined(CONFIG_BOOTP_PREFER_SERVERIP)
+       overwrite_serverip = false;
+#endif
 
        net_copy_ip(&tmp_ip, &bp->bp_siaddr);
-       if (tmp_ip.s_addr != 0)
+       if (tmp_ip.s_addr != 0 && (overwrite_serverip || !net_server_ip.s_addr))
                net_copy_ip(&net_server_ip, &bp->bp_siaddr);
        memcpy(net_server_ethaddr,
               ((struct ethernet_hdr *)net_rx_packet)->et_src, 6);
@@ -157,7 +168,8 @@ static void store_net_params(struct bootp_hdr *bp)
 #if defined(CONFIG_CMD_DHCP)
            !(dhcp_option_overload & OVERLOAD_FILE) &&
 #endif
-           (strlen(bp->bp_file) > 0)) {
+           (strlen(bp->bp_file) > 0) &&
+           !net_boot_file_name_explicit) {
                copy_filename(net_boot_file_name, bp->bp_file,
                              sizeof(net_boot_file_name));
        }
@@ -333,7 +345,7 @@ static void bootp_process_vendor(u8 *ext, int size)
                debug("net_nis_domain : %s\n", net_nis_domain);
 
 #if defined(CONFIG_CMD_SNTP) && defined(CONFIG_BOOTP_NTPSERVER)
-       if (net_ntp_server)
+       if (net_ntp_server.s_addr)
                debug("net_ntp_server : %pI4\n", &net_ntp_server);
 #endif
 }
@@ -889,10 +901,13 @@ static void dhcp_process_options(uchar *popt, uchar *end)
                case 66:        /* Ignore TFTP server name */
                        break;
                case 67:        /* Bootfile option */
-                       size = truncate_sz("Bootfile",
-                                          sizeof(net_boot_file_name), oplen);
-                       memcpy(&net_boot_file_name, popt + 2, size);
-                       net_boot_file_name[size] = 0;
+                       if (!net_boot_file_name_explicit) {
+                               size = truncate_sz("Bootfile",
+                                                  sizeof(net_boot_file_name),
+                                                  oplen);
+                               memcpy(&net_boot_file_name, popt + 2, size);
+                               net_boot_file_name[size] = 0;
+                       }
                        break;
                default:
 #if defined(CONFIG_BOOTP_VENDOREX)