[U-Boot] [PATCH 5/5] Allow tftp server to be different from bootp/dhcp server

Simon Glass sjg at chromium.org
Tue Apr 12 23:14:00 CEST 2011


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 <sjg at 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



More information about the U-Boot mailing list