TFTP: add host ip addr support
authorJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Fri, 18 Jan 2008 00:14:03 +0000 (01:14 +0100)
committerWolfgang Denk <wd@denx.de>
Mon, 4 Feb 2008 23:41:55 +0000 (00:41 +0100)
allow to use a different server as set in serverip
add CONFIG_TFTP_FILE_NAME_MAX_LEN to configure the file name length
if not defined the max length will be at 128

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
common/cmd_net.c
net/tftp.c

index 56eb684d555a0d9a5364d071465cbeafc26630a3..dbf6b861b1bdd9b6b0c62ce637e4869eabb4fbf9 100644 (file)
@@ -51,7 +51,7 @@ int do_tftpb (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 U_BOOT_CMD(
        tftpboot,       3,      1,      do_tftpb,
        "tftpboot- boot image via network using TFTP protocol\n",
-       "[loadAddress] [bootfilename]\n"
+       "[loadAddress] [[hostIPaddr:]bootfilename]\n"
 );
 
 int do_rarpb (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
index 8b95bcfec49fbad572ea0b34831b27b926bf7df5..3dd2b06aae16a79e7b94f72bc4e6ef7cc4dbb74d 100644 (file)
@@ -34,7 +34,7 @@
 #define TFTP_ERROR     5
 #define TFTP_OACK      6
 
-
+static IPaddr_t TftpServerIP;
 static int     TftpServerPort;         /* The UDP port at their end            */
 static int     TftpOurPort;            /* The UDP port at our end              */
 static int     TftpTimeoutCount;
@@ -55,7 +55,14 @@ static int   TftpState;
 
 #define DEFAULT_NAME_LEN       (8 + 4 + 1)
 static char default_filename[DEFAULT_NAME_LEN];
-static char *tftp_filename;
+
+#ifndef CONFIG_TFTP_FILE_NAME_MAX_LEN
+#define MAX_LEN 128
+#else
+#define MAX_LEN CONFIG_TFTP_FILE_NAME_MAX_LEN
+#endif
+
+static char tftp_filename[MAX_LEN];
 
 #ifdef CFG_DIRECT_FLASH_TFTP
 extern flash_info_t flash_info[];
@@ -231,7 +238,7 @@ TftpSend (void)
                break;
        }
 
-       NetSendUDPPacket(NetServerEther, NetServerIP, TftpServerPort, TftpOurPort, len);
+       NetSendUDPPacket(NetServerEther, TftpServerIP, TftpServerPort, TftpOurPort, len);
 }
 
 
@@ -372,7 +379,7 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
 #ifdef CONFIG_MCAST_TFTP
                /* if I am the MasterClient, actively calculate what my next
                 * needed block is; else I'm passive; not ACKING
-                */
+                */
                if (Multicast) {
                        if (len < TftpBlkSize)  {
                                TftpEndingBlock = TftpBlock;
@@ -453,30 +460,43 @@ TftpStart (void)
        char *ep;             /* Environment pointer */
 #endif
 
+       TftpServerIP = NetServerIP;
        if (BootFile[0] == '\0') {
                sprintf(default_filename, "%02lX%02lX%02lX%02lX.img",
                        NetOurIP & 0xFF,
                        (NetOurIP >>  8) & 0xFF,
                        (NetOurIP >> 16) & 0xFF,
                        (NetOurIP >> 24) & 0xFF );
-               tftp_filename = default_filename;
+
+               strncpy(tftp_filename, default_filename, MAX_LEN);
+               tftp_filename[MAX_LEN-1] = 0;
 
                printf ("*** Warning: no boot file name; using '%s'\n",
                        tftp_filename);
        } else {
-               tftp_filename = BootFile;
+               char *p = strchr (p, ':');
+
+               if (p == NULL) {
+                       strncpy(tftp_filename, BootFile, MAX_LEN);
+                       tftp_filename[MAX_LEN-1] = 0;
+               } else {
+                       *p++ = '\0';
+                       TftpServerIP = string_to_ip (BootFile);
+                       strncpy(tftp_filename, p, MAX_LEN);
+                       tftp_filename[MAX_LEN-1] = 0;
+               }
        }
 
 #if defined(CONFIG_NET_MULTI)
        printf ("Using %s device\n", eth_get_name());
 #endif
-       puts ("TFTP from server ");     print_IPaddr (NetServerIP);
+       puts ("TFTP from server ");     print_IPaddr (TftpServerIP);
        puts ("; our IP address is ");  print_IPaddr (NetOurIP);
 
        /* Check if we need to send across this subnet */
        if (NetOurGatewayIP && NetOurSubnetMask) {
-           IPaddr_t OurNet     = NetOurIP    & NetOurSubnetMask;
-           IPaddr_t ServerNet  = NetServerIP & NetOurSubnetMask;
+           IPaddr_t OurNet     = NetOurIP    & NetOurSubnetMask;
+           IPaddr_t ServerNet  = TftpServerIP & NetOurSubnetMask;
 
            if (OurNet != ServerNet) {
                puts ("; sending through gateway ");
@@ -522,7 +542,7 @@ TftpStart (void)
        /* Revert TftpBlkSize to dflt */
        TftpBlkSize = TFTP_BLOCK_SIZE;
 #ifdef CONFIG_MCAST_TFTP
-       mcast_cleanup();
+       mcast_cleanup();
 #endif
 
        TftpSend ();