net: Add option to prefer bootp/dhcp serverip
authorAlexander Graf <agraf@suse.de>
Fri, 15 Jun 2018 08:29:28 +0000 (10:29 +0200)
committerJoe Hershberger <joe.hershberger@ni.com>
Mon, 2 Jul 2018 19:14:21 +0000 (14:14 -0500)
Currently we can choose between 2 different types of behavior for the
serverip variable:

  1) Always overwrite it with the DHCP server IP address (default)
  2) Ignore what the DHCP server says (CONFIG_BOOTP_SERVERIP)

This patch adds a 3rd option:

  3) Use serverip from DHCP if no serverip is given
     (CONFIG_BOOTP_PREFER_SERVERIP)

With this new option, we can have the default case that a boot file gets
loaded from the DHCP provided TFTP server work while allowing users to
specify their own serverip variable to explicitly use a different tftp
server.

Signed-off-by: Alexander Graf <agraf@suse.de>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
cmd/Kconfig
net/bootp.c

index bbf9fc9113053bc74bc59fffef09292035a8df76..aec209006dbfb57c204d0caeb1ca87f0bcaf8316 100644 (file)
@@ -1121,6 +1121,16 @@ config BOOTP_HOSTNAME
        help
          The name may or may not be qualified with the local domain name.
 
+config BOOTP_PREFER_SERVERIP
+       bool "serverip variable takes precedent over DHCP server IP."
+       depends on CMD_BOOTP
+       help
+         By default a BOOTP/DHCP reply will overwrite the 'serverip' variable.
+
+         With this option enabled, the 'serverip' variable in the environment
+         takes precedence over DHCP server IP and will only be set by the DHCP
+         server if not already set in the environment.
+
 config BOOTP_SUBNETMASK
        bool "Request & store 'netmask' from BOOTP/DHCP server"
        default y
index fdcb4374a04d484c0f6c18597d3767f262b721ac..9a2b512e4a72b6aab102a8f71c9067c510d045a3 100644 (file)
@@ -147,9 +147,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);