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