
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@chromium.org --- net/bootp.c | 3 ++- net/net.c | 12 ++++++++++-- net/tftp.c | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/net/bootp.c b/net/bootp.c index a3d0e63..1f4523f 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..77bd192 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,