In many environments the DHCP server (which provides IP addresses) is not
under control of the individual engineer. While it is required in order to
connect to the corporate network, it doesn't provide useful information for
booting. For example, it may be set up for PC imaging and provide a bootfile
and tftp server for pxelinux.

To deal with this, this commit provides for a separate tftpserverip environment
variable. If this is defined, then this IP address is used in preference
to serverip. A new CONFIG_BOOTP_IGNORE_BOOTFILE option is provided to indicate
that any bootfile name returned by the DHCP server is bogus and should be
ignored.

To use this feature, just setenv tftpserverip to the address of your TFTP
server and define CONFIG_BOOTP_IGNORE_BOOTFILE in your board file.

To use a unified DHCP and TFTP server, don't do either of these steps.

TEST=build U-Boot, try bootp with and without tftpserverip set and with and
without CONFIG_BOOTP_IGNORE_BOOTFILE.

Signed-off-by: Simon Glass <s...@chromium.org>
---
 include/net.h |    1 +
 net/bootp.c   |    3 ++-
 net/net.c     |   12 ++++++++++--
 net/tftp.c    |    2 +-
 4 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/include/net.h b/include/net.h
index 8bd7662..8abc719 100644
--- a/include/net.h
+++ b/include/net.h
@@ -354,6 +354,7 @@ extern uchar                NetOurEther[6];         /* Our 
ethernet address         */
 extern uchar           NetServerEther[6];      /* Boot server enet address     
*/
 extern IPaddr_t                NetOurIP;               /* Our    IP addr (0 = 
unknown) */
 extern IPaddr_t                NetServerIP;            /* Server IP addr (0 = 
unknown) */
+extern IPaddr_t                NetTftpServerIP;        /* Tftp Server IP addr 
(0 = unknown)*/
 extern volatile uchar * NetTxPacket;           /* THE transmit packet          
*/
 extern volatile uchar * NetRxPackets[PKTBUFSRX];/* Receive packets             
*/
 extern volatile uchar * NetRxPacket;           /* Current receive packet       
*/
diff --git a/net/bootp.c b/net/bootp.c
index 0ac1429..a3840eb 100644
--- a/net/bootp.c
+++ b/net/bootp.c
@@ -113,9 +113,10 @@ static void BootpCopyNetParams(Bootp_t *bp)
                NetCopyIP(&NetServerIP, &bp->bp_siaddr);
        memcpy (NetServerEther, ((Ethernet_t *)NetRxPacket)->et_src, 6);
 #endif
+#if !defined(CONFIG_BOOTP_IGNORE_BOOTFILE)
        if (strlen(bp->bp_file) > 0)
                copy_filename (BootFile, bp->bp_file, sizeof(BootFile));
-
+#endif
        debug("Bootfile: %s\n", BootFile);
 
        /* Propagate to environment:
diff --git a/net/net.c b/net/net.c
index a609632..8e5644e 100644
--- a/net/net.c
+++ b/net/net.c
@@ -138,6 +138,7 @@ uchar               NetServerEther[6] =     /* Boot server 
enet address             */
                        { 0, 0, 0, 0, 0, 0 };
 IPaddr_t       NetOurIP;               /* Our IP addr (0 = unknown)            
*/
 IPaddr_t       NetServerIP;            /* Server IP addr (0 = unknown)         
*/
+IPaddr_t       NetTftpServerIP;        /* Tftp Server IP addr (0 = unknown)    
*/
 volatile uchar *NetRxPacket;           /* Current receive packet               
*/
 int            NetRxPacketLen;         /* Current rx packet length             
*/
 unsigned       NetIPID;                /* IP packet ID                         
*/
@@ -289,6 +290,7 @@ NetInitLoop(proto_t protocol)
                NetOurGatewayIP = getenv_IPaddr ("gatewayip");
                NetOurSubnetMask= getenv_IPaddr ("netmask");
                NetServerIP = getenv_IPaddr ("serverip");
+               NetTftpServerIP = getenv_IPaddr ("tftpserverip");
                NetOurNativeVLAN = getenv_VLAN("nvlan");
                NetOurVLAN = getenv_VLAN("vlan");
 #if defined(CONFIG_CMD_DNS)
@@ -1720,8 +1722,14 @@ static int net_check_prereq (proto_t protocol)
 #endif
        case NETCONS:
        case TFTP:
-               if (NetServerIP == 0) {
-                       puts ("*** ERROR: `serverip' not set\n");
+               /*
+                * If there is no specific Tftp server defined, just use the
+                * generic one */
+               if (NetTftpServerIP == 0)
+                       NetTftpServerIP = NetServerIP;
+               if (NetTftpServerIP == 0) {
+                       puts ("*** ERROR: `serverip' and 'tcpserverip'"
+                               "not set\n");
                        return (1);
                }
 #if defined(CONFIG_CMD_PING) || defined(CONFIG_CMD_SNTP)
diff --git a/net/tftp.c b/net/tftp.c
index ed559b7..4f6b1a2 100644
--- a/net/tftp.c
+++ b/net/tftp.c
@@ -547,7 +547,7 @@ TftpStart (void)
        debug("TFTP blocksize = %i, timeout = %ld ms\n",
                TftpBlkSizeOption, TftpTimeoutMSecs);
 
-       TftpServerIP = NetServerIP;
+       TftpServerIP = NetTftpServerIP;
        if (BootFile[0] == '\0') {
                sprintf(default_filename, "%02lX%02lX%02lX%02lX.img",
                        NetOurIP & 0xFF,
-- 
1.7.3.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to