Clean and fix up messy TFTP/RARP related code
authorPiotr Dymacz <pepe2k@gmail.com>
Sun, 5 Feb 2017 18:50:05 +0000 (19:50 +0100)
committerPiotr Dymacz <pepe2k@gmail.com>
Sun, 5 Feb 2017 18:50:05 +0000 (19:50 +0100)
u-boot/common/cmd_net.c
u-boot/net/rarp.c
u-boot/net/tftp.c
u-boot/net/tftp.h

index 939258f01f475c04660a5a665055ca23258ea11e..a7d002ccfe5fe3ba32b6d2158dbaba9929c68811 100644 (file)
 
 #if defined(CONFIG_CMD_NET)
 
-u32 save_addr; /* Default Save Address */
-u32 save_size; /* Default Save Size (in bytes) */
+u32 save_addr; /* Default save address for TFTPPUT */
+u32 save_size; /* Default save size (in bytes) for TFTPPUT */
 
 extern int do_bootm(cmd_tbl_t *, int, int, char *[]);
 static int netboot_common(proto_t, cmd_tbl_t *, int, char *[]);
 
 #if defined(CONFIG_CMD_HTTPD)
-int do_httpd(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){
+int do_httpd(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
        return NetLoopHttpd();
 }
-U_BOOT_CMD(httpd, 1, 1, do_httpd, "start www server for firmware recovery\n", NULL);
+
+U_BOOT_CMD(httpd, 1, 1, do_httpd,
+          "start web server for firmware recovery\n",
+          NULL);
 #endif /* CONFIG_CMD_HTTPD */
 
-int do_tftpb(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){
-       return netboot_common(TFTPGET, cmdtp, argc, argv);
+#if defined(CONFIG_CMD_DHCP)
+int do_dhcp(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       return netboot_common(DHCP, cmdtp, argc, argv);
 }
-U_BOOT_CMD(tftpboot, 3, 1, do_tftpb, "boot image via network using TFTP protocol\n", "[loadAddress] [bootfilename]\n");
 
-int do_tftpput(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+U_BOOT_CMD(dhcp, 3, 1, do_dhcp,
+          "invoke DHCP client to obtain IP/boot params\n",
+          NULL);
+#endif /* CONFIG_CMD_DHCP */
+
+#if defined(CONFIG_CMD_NFS)
+int do_nfs(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
-       if (argc < 4) {
+       return netboot_common(NFS, cmdtp, argc, argv);
+}
+U_BOOT_CMD(nfs, 3, 1, do_nfs,
+          "boot image via network using NFS protocol\n",
+          "[address] [host ip addr:filename]\n"
+          "\t- loads 'filename' at 'address' using NFS protocol");
+#endif /* CONFIG_CMD_NFS */
+
+#if defined(CONFIG_CMD_PING)
+int do_ping(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       if (argc < 2) {
                print_cmd_help(cmdtp);
                return -1;
        }
 
-       return netboot_common(TFTPPUT, cmdtp, argc, argv);
+       NetPingIP = string_to_ip(argv[1]);
+
+       if (NetPingIP == 0) {
+               print_cmd_help(cmdtp);
+               return -1;
+       }
+
+       if (NetLoop(PING) < 0) {
+               puts("\n");
+               printf_err("ping failed, host %s is not alive!\n\n", argv[1]);
+               return 1;
+       }
+
+       printf("\nPing OK, host %s is alive!\n\n", argv[1]);
+
+       return 0;
 }
 
-U_BOOT_CMD(tftpput, 4, 1, do_tftpput, "send file to TFTP server\n", "address size filename\n"
-               "\t- sends 'size' of data from 'address' as 'filename' to TFTP server");
+U_BOOT_CMD(ping, 2, 1, do_ping,
+          "send ICMP ECHO_REQUEST to network host\n",
+          "host IP\n"
+          "\t- sends ping to IP 'host IP'\n");
+#endif /* CONFIG_CMD_PING */
 
-#if defined(CONFIG_CMD_DHCP)
-int do_dhcp(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){
-       return netboot_common(DHCP, cmdtp, argc, argv);
+#if defined(CONFIG_CMD_SNTP)
+int do_sntp(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       char *toff;
+
+       if (argc < 2) {
+               print_cmd_help(cmdtp);
+               return -1;
+       } else {
+               NetNtpServerIP = string_to_ip(argv[1]);
+
+               if (NetNtpServerIP == 0) {
+                       printf_err("bad SNTP server IP address\n");
+                       return 1;
+               }
+       }
+
+       toff = getenv("timeoffset");
+
+       if (toff == NULL)
+               NetTimeOffset = 0;
+       else
+               NetTimeOffset = simple_strtol(toff, NULL, 10);
+
+       if (NetLoop(SNTP) < 0) {
+               printf_err("SNTP host %s not responding\n", argv[1]);
+               return 1;
+       }
+
+       return 0 ;
 }
-U_BOOT_CMD(dhcp, 3, 1, do_dhcp, "invoke DHCP client to obtain IP/boot params\n", NULL);
-#endif /* CONFIG_CMD_DHCP */
 
-#if defined(CONFIG_CMD_NFS)
-int do_nfs(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){
-       return netboot_common(NFS, cmdtp, argc, argv);
+U_BOOT_CMD(sntp, 2, 1, do_sntp,
+          "send NTP request to NTP server\n",
+          "ntpserverip\n"
+          "\t- sends NTP request to NTP server 'ntpserverip'\n");
+#endif /* CONFIG_CMD_SNTP */
+
+int do_tftpb(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       return netboot_common(TFTPGET, cmdtp, argc, argv);
 }
-U_BOOT_CMD(nfs, 3, 1, do_nfs, "boot image via network using NFS protocol\n", "[loadAddress] [host ip addr:bootfilename]\n");
-#endif /* CONFIG_CMD_NFS */
 
-static void netboot_update_env(void){
+U_BOOT_CMD(tftpboot, 3, 1, do_tftpb,
+          "boot image via network using TFTP protocol\n",
+          "[address] [filename]\n"
+          "\t- loads 'filename' at 'address' from TFTP server");
+
+int do_tftpput(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       if (argc < 4) {
+               print_cmd_help(cmdtp);
+               return -1;
+       }
+
+       return netboot_common(TFTPPUT, cmdtp, argc, argv);
+}
+
+U_BOOT_CMD(tftpput, 4, 1, do_tftpput,
+          "send file to TFTP server\n",
+          "address size filename\n"
+          "\t- sends 'size' of data from 'address' as 'filename' to TFTP server");
+
+static void netboot_update_env(void)
+{
        char tmp[22];
 
-       if(NetOurGatewayIP){
+       if (NetOurGatewayIP) {
                ip_to_string(NetOurGatewayIP, tmp);
                setenv("gatewayip", tmp);
        }
 
-       if(NetOurSubnetMask){
+       if (NetOurSubnetMask) {
                ip_to_string(NetOurSubnetMask, tmp);
                setenv("netmask", tmp);
        }
 
-       if(NetOurHostName[0]){
+       if (NetOurHostName[0])
                setenv("hostname", NetOurHostName);
-       }
 
-       if(NetOurRootPath[0]){
+       if (NetOurRootPath[0])
                setenv("rootpath", NetOurRootPath);
-       }
 
-       if(NetOurIP){
+       if (NetOurIP) {
                ip_to_string(NetOurIP, tmp);
                setenv("ipaddr", tmp);
        }
 
-       if(NetServerIP){
+       if (NetServerIP) {
                ip_to_string(NetServerIP, tmp);
                setenv("serverip", tmp);
        }
 
-       if(NetOurDNSIP){
+       if (NetOurDNSIP) {
                ip_to_string(NetOurDNSIP, tmp);
                setenv("dnsip", tmp);
        }
 
 #if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_DNS2)
-       if(NetOurDNS2IP){
-               ip_to_string (NetOurDNS2IP, tmp);
+       if (NetOurDNS2IP) {
+               ip_to_string(NetOurDNS2IP, tmp);
                setenv("dnsip2", tmp);
        }
 #endif
 
-       if(NetOurNISDomain[0]){
+       if (NetOurNISDomain[0])
                setenv("domain", NetOurNISDomain);
-       }
 
-#if defined(CONFIG_CMD_SNTP) && (CONFIG_BOOTP_MASK & CONFIG_BOOTP_TIMEOFFSET)
-       if(NetTimeOffset){
+#if defined(CONFIG_CMD_SNTP)
+  #if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_TIMEOFFSET)
+       if (NetTimeOffset) {
                sprintf(tmp, "%d", NetTimeOffset);
                setenv("timeoffset", tmp);
        }
-#endif
+  #endif
 
-#if defined(CONFIG_CMD_SNTP) && (CONFIG_BOOTP_MASK & CONFIG_BOOTP_NTPSERVER)
-       if (NetNtpServerIP){
+  #if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_NTPSERVER)
+       if (NetNtpServerIP) {
                ip_to_string(NetNtpServerIP, tmp);
                setenv("ntpserverip", tmp);
        }
-#endif
+  #endif
+#endif /* CONFIG_CMD_SNTP */
 }
 
-static int netboot_common(proto_t proto, cmd_tbl_t *cmdtp, int argc, char *argv[]){
+static int netboot_common(proto_t proto,
+                         cmd_tbl_t *cmdtp,
+                         int argc,
+                         char *argv[])
+{
        char *s;
-       int rcode = 0;
        int size;
+       ulong tmp;
+       int rcode = 0;
 
-       /* pre-set load_addr */
-       if((s = getenv("loadaddr")) != NULL){
+       /* Pre-set load_addr */
+       if ((s = getenv("loadaddr")) != NULL)
                load_addr = simple_strtoul(s, NULL, 16);
-       }
 
-       switch(argc){
-               case 1:
-                       break;
-
-               case 2:
-               /* only one arg - accept two forms:
-                * just load address, or just boot file name.
-                * The latter form must be written "filename" here.
+       switch (argc) {
+       case 1:
+               break;
+       case 2:
+               /*
+                * Don't allow to use loading address
+                * lower than RAM/FLASH base
                 */
-                       if(argv[1][0] == '"'){ /* just boot filename */
-                               copy_filename(BootFile, argv[1], sizeof(BootFile));
-                       } else { /* load address        */
-                               load_addr = simple_strtoul(argv[1], NULL, 16);
-                       }
-
-                       break;
-
-               case 3:
-                       load_addr = simple_strtoul(argv[1], NULL, 16);
-                       copy_filename(BootFile, argv[2], sizeof(BootFile));
-
-                       break;
+               tmp = simple_strtoul(argv[1], NULL, 16);
 
-               case 4:
-                       save_addr = simple_strtoul(argv[1], NULL, 16);
-                       save_size = simple_strtoul(argv[2], NULL, 16);
-                       copy_filename(BootFile, argv[3], sizeof(BootFile));
-                       break;
-
-               default:
-
-                       print_cmd_help(cmdtp);
-                       return 1;
+#if defined(CFG_DIRECT_FLASH_TFTP)
+               if ((tmp < CFG_SDRAM_BASE && tmp < CFG_FLASH_BASE) || tmp == 0)
+#else
+               if (tmp < CFG_SDRAM_BASE || tmp == 0)
+#endif
+                       copy_filename(BootFile, argv[1], sizeof(BootFile));
+               else
+                       load_addr = tmp;
+
+               break;
+       case 3:
+               load_addr = simple_strtoul(argv[1], NULL, 16);
+               copy_filename(BootFile, argv[2], sizeof(BootFile));
+               break;
+       case 4:
+               save_addr = simple_strtoul(argv[1], NULL, 16);
+               save_size = simple_strtoul(argv[2], NULL, 16);
+               copy_filename(BootFile, argv[3], sizeof(BootFile));
+               break;
+       default:
+               print_cmd_help(cmdtp);
+               return 1;
        }
 
-       if((size = NetLoop(proto)) < 0){
-               return(1);
-       }
+       if ((size = NetLoop(proto)) < 0)
+               return 1;
 
        /* NetLoop ok, update environment */
        netboot_update_env();
 
-       /* done if no file was loaded (no errors though) */
-       if(size == 0){
-               return(0);
-       }
+       /* Done if no file was loaded (no errors though) */
+       if (size == 0)
+               return 0;
 
-       /* flush cache */
+       /* Flush cache */
        flush_cache(load_addr, size);
 
        /* Loading ok, check if we should attempt an auto-start */
-       if(((s = getenv("autostart")) != NULL) && (strcmp(s, "yes") == 0)){
+       if (((s = getenv("autostart")) != NULL) && (strcmp(s, "yes") == 0)) {
                char *local_args[2];
                local_args[0] = argv[0];
                local_args[1] = NULL;
 
-               printf("Automatic boot of image at addr 0x%08lX ...\n", load_addr);
+               printf("Automatic boot of image at addr 0x%08lX ...\n",
+                      load_addr);
+
                rcode = do_bootm(cmdtp, 0, 1, local_args);
        }
 
-#ifdef CONFIG_AUTOSCRIPT
-       if(((s = getenv("autoscript")) != NULL) && (strcmp(s,"yes") == 0)){
-               printf("Running autoscript at addr 0x%08lX ...\n", load_addr);
+#if defined(CONFIG_AUTOSCRIPT)
+       if (((s = getenv("autoscript")) != NULL) && (strcmp(s,"yes") == 0)) {
+               printf("Running autoscript at addr 0x%08lX ...\n",
+                      load_addr);
+
                rcode = autoscript(load_addr);
        }
 #endif
-       return rcode;
-}
-
-#if defined(CONFIG_CMD_PING)
-int do_ping(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){
-
-       if(argc < 2){
-               print_cmd_help(cmdtp);
-               return(-1);
-       }
-
-       NetPingIP = string_to_ip(argv[1]);
 
-       if (NetPingIP == 0){
-               print_cmd_help(cmdtp);
-               return(-1);
-       }
-
-       if(NetLoop(PING) < 0){
-               puts("\n");
-               printf_err("ping failed, host %s is not alive!\n\n", argv[1]);
-               return(1);
-       }
-
-       printf("\nPing OK, host %s is alive!\n\n", argv[1]);
-
-       return(0);
-}
-
-U_BOOT_CMD(ping, 2, 1, do_ping, "send ICMP ECHO_REQUEST to network host\n", "host IP\n"
-               "\t- sends ping to IP 'host IP'\n");
-#endif /* CONFIG_CMD_PING */
-
-#if defined(CONFIG_CMD_SNTP)
-int do_sntp(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){
-       char *toff;
-
-       if(argc < 2){
-               print_cmd_help(cmdtp);
-               return(-1);
-       } else {
-               NetNtpServerIP = string_to_ip(argv[1]);
-               if(NetNtpServerIP == 0){
-                       printf_err("bad SNTP server IP address\n");
-                       return(1);
-               }
-       }
-
-       toff = getenv("timeoffset");
-
-       if(toff == NULL){
-               NetTimeOffset = 0;
-       } else{
-               NetTimeOffset = simple_strtol(toff, NULL, 10);
-       }
-
-       if(NetLoop(SNTP) < 0){
-               printf_err("SNTP host %s not responding\n", argv[1]);
-               return(1);
-       }
-
-       return(0);
+       return rcode;
 }
-
-U_BOOT_CMD(sntp, 2, 1, do_sntp, "send NTP request to NTP server\n", "ntpserverip\n"
-               "\t- sends NTP request to NTP server 'ntpserverip'\n");
-#endif /* CONFIG_CMD_SNTP */
-
 #endif /* CONFIG_CMD_NET */
index 6c5dfd568c7ded0865de39264e254b8e348b6cc7..6e9c72971c635673dbc27e070c6a83456dd7c186 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define TIMEOUT                5               /* Seconds before trying BOOTP again */
-#ifndef        CONFIG_NET_RETRY_COUNT
-# define TIMEOUT_COUNT 5               /* # of timeouts before giving up  */
+#define TIMEOUT        5       /* Seconds before trying BOOTP again */
+
+#if !defined(CONFIG_NET_RETRY_COUNT)
+       /* # of timeouts before giving up  */
+       #define TIMEOUT_COUNT   5
 #else
-# define TIMEOUT_COUNT  (CONFIG_NET_RETRY_COUNT)
+       #define TIMEOUT_COUNT   (CONFIG_NET_RETRY_COUNT)
 #endif
 
+int RarpTry;
 
-int            RarpTry;
-
-/*
- *     Handle a RARP received packet.
- */
-static void
-RarpHandler(uchar * dummi0, unsigned dummi1, unsigned dummi2, unsigned dummi3)
+/* Handle a RARP received packet */
+static void RarpHandler(uchar   *dummi0,
+                       unsigned dummi1,
+                       unsigned dummi2,
+                       unsigned dummi3)
 {
        char *s;
-#ifdef DEBUG
+
+#if defined(DEBUG)
        puts ("Got good RARP\n");
 #endif
+
        if ((s = getenv("autoload")) != NULL) {
                if (*s == 'n') {
                        /*
@@ -68,31 +71,30 @@ RarpHandler(uchar * dummi0, unsigned dummi1, unsigned dummi2, unsigned dummi3)
 #endif
                }
        }
-       TftpStart (TFTPGET);
-}
 
+       TftpStart(TFTPGET);
+}
 
-/*
- *     Timeout on BOOTP request.
- */
-static void RarpTimeout(void){
+/* Timeout on BOOTP request */
+static void RarpTimeout(void)
+{
        bd_t *bd = gd->bd;
 
        if (RarpTry >= TIMEOUT_COUNT) {
-               puts ("\nRetry count exceeded; starting again\n");
-               NetStartAgain ();
+               puts("\nRetry count exceeded; starting again\n");
+               NetStartAgain();
        } else {
-               NetSetTimeout (TIMEOUT * CFG_HZ, RarpTimeout);
-               RarpRequest ();
+               NetSetTimeout(TIMEOUT * CFG_HZ, RarpTimeout);
+               RarpRequest();
        }
 }
 
-
-void RarpRequest (void){
-       bd_t *bd = gd->bd;
+void RarpRequest(void)
+{
        int i;
+       ARP_t *rarp;
+       bd_t *bd = gd->bd;
        volatile uchar *pkt;
-       ARP_t * rarp;
 
        printf("RARP broadcast %d\n", ++RarpTry);
        pkt = NetTxPacket;
@@ -101,23 +103,23 @@ void RarpRequest (void){
 
        rarp = (ARP_t *)pkt;
 
-       rarp->ar_hrd = htons (ARP_ETHER);
-       rarp->ar_pro = htons (PROT_IP);
+       rarp->ar_hrd = htons(ARP_ETHER);
+       rarp->ar_pro = htons(PROT_IP);
        rarp->ar_hln = 6;
        rarp->ar_pln = 4;
-       rarp->ar_op  = htons (RARPOP_REQUEST);
-       memcpy (&rarp->ar_data[0],  NetOurEther, 6);    /* source ET addr */
-       memcpy (&rarp->ar_data[6],  &NetOurIP,   4);    /* source IP addr */
-       memcpy (&rarp->ar_data[10], NetOurEther, 6);    /* dest ET addr = source ET addr ??*/
-       /* dest. IP addr set to broadcast */
-       for (i = 0; i <= 3; i++) {
+       rarp->ar_op  = htons(RARPOP_REQUEST);
+
+       memcpy(&rarp->ar_data[0],  NetOurEther, 6);     /* source ET addr */
+       memcpy(&rarp->ar_data[6],  &NetOurIP,   4);     /* source IP addr */
+       memcpy(&rarp->ar_data[10], NetOurEther, 6);     /* dest ET addr = source ET addr ??*/
+
+       /* Dest. IP addr set to broadcast */
+       for (i = 0; i <= 3; i++)
                rarp->ar_data[16 + i] = 0xff;
-       }
 
        NetSendPacket(NetTxPacket, (pkt - NetTxPacket) + ARP_HDR_SIZE);
 
        NetSetTimeout(TIMEOUT * CFG_HZ, RarpTimeout);
        NetSetHandler(RarpHandler);
 }
-
 #endif /* CONFIG_CMD_NET */
index 53c622997cfea76014933e8d7283af71626208bb..9a0d4fc7b4dbab378eb497e84c76b6829256654e 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define WELL_KNOWN_PORT                69              /* Well known TFTP port # */
-#define TIMEOUT                                5               /* Seconds to timeout for a lost pkt */
+#define WELL_KNOWN_PORT                69      /* Well known TFTP port # */
+#define TIMEOUT                        5       /* Seconds to timeout for a lost pkt */
 
-#ifndef        CONFIG_NET_RETRY_COUNT
-       #define TIMEOUT_COUNT   10              /* # of timeouts before giving up */
+#if !defined(CONFIG_NET_RETRY_COUNT)
+       #define TIMEOUT_COUNT   10      /* # of timeouts before giving up */
 #else
-       #define TIMEOUT_COUNT  (CONFIG_NET_RETRY_COUNT * 2)
+       #define TIMEOUT_COUNT   (CONFIG_NET_RETRY_COUNT * 2)
 #endif
 
-/* (for checking the image size)       */
-#define HASHES_PER_LINE                40              /* Number of "loading" hashes per line */
+#define HASHES_PER_LINE                40      /* Number of "loading"/"saving" hashes per line */
 
 /*
- *     TFTP operations.
+ * TFTP operations
  */
 #define TFTP_RRQ       1
 #define TFTP_WRQ       2
@@ -38,57 +37,59 @@ DECLARE_GLOBAL_DATA_PTR;
 #define TFTP_ERROR     5
 #define TFTP_OACK      6
 
-
-static int TftpServerPort;                     /* The UDP port at their end */
-static int TftpOurPort;                                /* The UDP port at our end */
+static int TftpServerPort;             /* The UDP port at their end */
+static int TftpOurPort;                        /* The UDP port at our end */
 static int TftpTimeoutCount;
 static int TftpState;
-static int TftpWriting;                                /* 1 if writing, else 0 */
-static int TftpFinalBlock;                     /* 1 if we have sent the last block */
-
-static ulong TftpBlock;                                /* packet sequence number */
-static ulong TftpLastBlock;                    /* last packet sequence number received */
-static ulong TftpBlockWrap;                    /* count of sequence number wraparounds */
-static ulong TftpBlockWrapOffset;      /* memory offset due to wrapping */
-
-#define STATE_RRQ                      1
-#define STATE_DATA                     2
-#define STATE_TOO_LARGE                3
-#define STATE_BAD_MAGIC                4
-#define STATE_OACK                     5
+static int TftpWriting;                        /* 1 if writing, else 0 */
+static int TftpFinalBlock;             /* 1 if we have sent the last block */
+
+static ulong TftpBlock;                        /* Packet sequence number */
+static ulong TftpLastBlock;            /* Last packet sequence number received */
+static ulong TftpBlockWrap;            /* Count of sequence number wraparounds */
+static ulong TftpBlockWrapOffset;      /* Memory offset due to wrapping */
+
+#define STATE_RRQ      1
+#define STATE_DATA     2
+#define STATE_TOO_LARGE        3
+#define STATE_BAD_MAGIC        4
+#define STATE_OACK     5
 #define STATE_WRQ      7
 
-#define TFTP_BLOCK_SIZE                512                             /* default TFTP block size */
-#define TFTP_SEQUENCE_SIZE     ((ulong)(1<<16))    /* sequence number is 16 bit */
+#define TFTP_BLOCK_SIZE                512                     /* Default TFTP block size */
+#define TFTP_SEQUENCE_SIZE     ((ulong)(1<<16))        /* Sequence number is 16 bit */
 
 #define DEFAULT_NAME_LEN       (8 + 4 + 1)
 
 static char default_filename[DEFAULT_NAME_LEN];
 static char *tftp_filename;
 
-#ifdef CFG_DIRECT_FLASH_TFTP
+#if defined(CFG_DIRECT_FLASH_TFTP)
        extern flash_info_t flash_info[];
 #endif
 
-static __inline__ void store_block(unsigned block, uchar * src, unsigned len){
-       ulong offset = block * TFTP_BLOCK_SIZE + TftpBlockWrapOffset;
+static __inline__ void store_block(unsigned block, uchar *src, unsigned len)
+{
+       ulong offset  = block * TFTP_BLOCK_SIZE + TftpBlockWrapOffset;
        ulong newsize = offset + len;
 
-#ifdef CFG_DIRECT_FLASH_TFTP
+#if defined(CFG_DIRECT_FLASH_TFTP)
        int i, rc = 0;
 
-       for(i=0; i<CFG_MAX_FLASH_BANKS; i++){
-               /* start address in flash? */
-               if(load_addr + offset >= flash_info[i].start[0]){
+       for (i = 0; i < CFG_MAX_FLASH_BANKS; i++) {
+               /* Start address in flash? */
+               if (load_addr + offset >= flash_info[i].start[0]) {
                        rc = 1;
                        break;
                }
        }
 
-       if(rc){ /* Flash is destination for this packet */
-               rc = flash_write((char *)src, (ulong)(load_addr+offset), len);
+       /* Flash is destination for this packet */
+       if (rc) {
+               rc = flash_write((char *)src, (ulong)(load_addr + offset),
+                                len);
 
-               if(rc){
+               if (rc) {
                        flash_perror(rc);
                        NetState = NETLOOP_FAIL;
                        return;
@@ -99,9 +100,8 @@ static __inline__ void store_block(unsigned block, uchar * src, unsigned len){
                (void)memcpy((void *)(load_addr + offset), src, len);
        }
 
-       if(NetBootFileXferSize < newsize){
+       if (NetBootFileXferSize < newsize)
                NetBootFileXferSize = newsize;
-       }
 }
 
 /* Load the next block from memory to be sent over tftp */
@@ -128,243 +128,240 @@ static void show_progress(const ulong TftpBlock)
 static void show_success(void)
 {
        puts("\n\nTFTP transfer complete!\n");
-
        NetState = NETLOOP_SUCCESS;
 }
 
 static void TftpSend(void);
 static void TftpTimeout(void);
 
-/**********************************************************************/
-
-static void TftpSend(void){
-       uchar *pkt;
-       volatile uchar *xp;
+static void TftpSend(void)
+{
        int len = 0;
+       uchar *pkt, *xp;
        volatile ushort *s;
 
        /*
-        *      We will always be sending some sort of packet, so
-        *      cobble together the packet headers now.
+        * We will always be sending some sort of packet, so
+        * cobble together the packet headers now.
         */
        pkt = (uchar *)(NetTxPacket + NetEthHdrSize() + IP_HDR_SIZE);
 
-       switch(TftpState){
-               case STATE_RRQ:
-               case STATE_WRQ:
-                       xp = pkt;
-                       s = (ushort *)pkt;
-                       *s++ = htons(TftpState == STATE_RRQ ? TFTP_RRQ : TFTP_WRQ);
-
-                       pkt = (uchar *)s;
-                       strcpy ((char *)pkt, tftp_filename);
-
-                       pkt += strlen(tftp_filename) + 1;
-                       strcpy ((char *)pkt, "octet");
-
-                       pkt += 5 /*strlen("octet")*/ + 1;
-                       strcpy ((char *)pkt, "timeout");
-
-                       pkt += 7 /*strlen("timeout")*/ + 1;
-                       sprintf((char *)pkt, "%d", TIMEOUT);
-       #ifdef ET_DEBUG
-                       printf("send option \"timeout %s\"\n", (char *)pkt);
-       #endif
-                       pkt += strlen((char *)pkt) + 1;
-                       len = pkt - xp;
-                       break;
+       switch (TftpState) {
+       case STATE_RRQ:
+       case STATE_WRQ:
+               xp = pkt;
+               s = (ushort *)pkt;
+               *s++ = htons(TftpState == STATE_RRQ ? TFTP_RRQ : TFTP_WRQ);
 
-               case STATE_DATA:
-               case STATE_OACK:
-                       xp = pkt;
-                       s = (ushort *)pkt;
+               pkt = (uchar *)s;
+               strcpy((char *)pkt, tftp_filename);
 
-                       s[0] = htons(TFTP_ACK);
-                       s[1] = htons(TftpBlock);
-                       pkt = (uchar *)(s + 2);
+               pkt += strlen(tftp_filename) + 1;
+               strcpy((char *)pkt, "octet");
 
-                       if (TftpWriting) {
-                               int toload = TFTP_BLOCK_SIZE;
-                               int loaded = load_block(TftpBlock, pkt, toload);
+               pkt += 6; /* strlen("octet") + 1 */
+               strcpy((char *)pkt, "timeout");
 
-                               s[0] = htons(TFTP_DATA);
-                               pkt += loaded;
+               pkt += 8; /* strlen("timeout") + 1 */
+               sprintf((char *)pkt, "%d", TIMEOUT);
 
-                               TftpFinalBlock = (loaded < toload);
-                       }
+#if defined(ET_DEBUG)
+               printf("send option \"timeout %s\"\n", (char *)pkt);
+#endif
 
-                       len = pkt - xp;
-                       break;
+               pkt += strlen((char *)pkt) + 1;
+               len = pkt - xp;
+               break;
+       case STATE_DATA:
+       case STATE_OACK:
+               xp = pkt;
+               s = (ushort *)pkt;
 
-               case STATE_TOO_LARGE:
-                       xp = pkt;
-                       s = (ushort *)pkt;
-                       *s++ = htons(TFTP_ERROR);
-                       *s++ = htons(3);
-                       pkt = (uchar *)s;
-                       strcpy((char *)pkt, "File too large");
-                       pkt += 14 /*strlen("File too large")*/ + 1;
-                       len = pkt - xp;
-                       break;
+               s[0] = htons(TFTP_ACK);
+               s[1] = htons(TftpBlock);
+               pkt = (uchar *)(s + 2);
 
-               case STATE_BAD_MAGIC:
-                       xp = pkt;
-                       s = (ushort *)pkt;
-                       *s++ = htons(TFTP_ERROR);
-                       *s++ = htons(2);
-                       pkt = (uchar *)s;
-                       strcpy((char *)pkt, "File has bad magic");
-                       pkt += 18 /*strlen("File has bad magic")*/ + 1;
-                       len = pkt - xp;
-                       break;
+               if (TftpWriting) {
+                       int toload = TFTP_BLOCK_SIZE;
+                       int loaded = load_block(TftpBlock, pkt, toload);
+
+                       s[0] = htons(TFTP_DATA);
+                       pkt += loaded;
+
+                       TftpFinalBlock = (loaded < toload);
+               }
+
+               len = pkt - xp;
+               break;
+       case STATE_TOO_LARGE:
+               xp = pkt;
+               s = (ushort *)pkt;
+               *s++ = htons(TFTP_ERROR);
+               *s++ = htons(3);
+               pkt = (uchar *)s;
+               strcpy((char *)pkt, "File too large");
+               pkt += 15; /* strlen("File too large") + 1 */
+               len = pkt - xp;
+               break;
+       case STATE_BAD_MAGIC:
+               xp = pkt;
+               s = (ushort *)pkt;
+               *s++ = htons(TFTP_ERROR);
+               *s++ = htons(2);
+               pkt = (uchar *)s;
+               strcpy((char *)pkt, "File has bad magic");
+               pkt += 19; /* strlen("File has bad magic") + 1 */
+               len = pkt - xp;
+               break;
        }
 
-       NetSendUDPPacket(NetServerEther, NetServerIP, TftpServerPort, TftpOurPort, len);
+       NetSendUDPPacket(NetServerEther, NetServerIP, TftpServerPort,
+                        TftpOurPort, len);
 }
 
-static void TftpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len){
-       bd_t *bd = gd->bd;
-       ushort proto;
-       ushort *s;
+static void TftpHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len)
+{
        int block;
+       ushort proto, *s;
+       bd_t *bd = gd->bd;
 
-       if(dest != TftpOurPort){
+       if (dest != TftpOurPort)
                return;
-       }
 
        if (TftpState != STATE_RRQ && TftpState != STATE_WRQ &&
-           src != TftpServerPort) {
+           src != TftpServerPort)
                return;
-       }
 
-       if(len < 2){
+       if (len < 2)
                return;
-       }
 
        len -= 2;
 
-       /* warning: don't use increment (++) in ntohs() macros!! */
+       /* Warning: don't use increment (++) in ntohs() macros!! */
        s = (ushort *)pkt;
        proto = *s++;
        pkt = (uchar *)s;
 
        block = ntohs(*s);
 
-       switch(ntohs(proto)){
-               case TFTP_RRQ:
-               case TFTP_WRQ:
-                       break;
+       switch (ntohs(proto)) {
+       case TFTP_RRQ:
+       case TFTP_WRQ:
+               break;
+       case TFTP_ACK:
+               if (TftpWriting) {
+                       if (TftpFinalBlock) {
+                               show_success();
+                       } else {
+                               show_progress(TftpBlock);
+                               TftpBlock = block + 1;
 
-               case TFTP_ACK:
-                       if (TftpWriting) {
-                               if (TftpFinalBlock) {
-                                       show_success();
-                               } else {
-                                       show_progress(TftpBlock);
-                                       TftpBlock = block + 1;
-                                       TftpSend(); /* Send next data block */
-                               }
+                               NetSetTimeout(TIMEOUT * CFG_HZ, TftpTimeout);
+
+                               TftpSend();
                        }
-                       break;
+               }
 
-               default:
-                       break;
+               break;
+       case TFTP_OACK:
+#if defined(ET_DEBUG)
+               printf("Got OACK: %s %s\n", pkt, pkt+strlen(pkt)+1);
+#endif
+               TftpState = STATE_OACK;
+               TftpServerPort = src;
 
-               case TFTP_OACK:
-       #ifdef ET_DEBUG
-                       printf("Got OACK: %s %s\n", pkt, pkt+strlen(pkt)+1);
-       #endif
-                       TftpState = STATE_OACK;
-                       TftpServerPort = src;
+               if (TftpWriting) {
+                       /* Get ready to send the first block */
+                       TftpState = STATE_DATA;
+                       TftpBlock++;
+               }
 
-                       if (TftpWriting) {
-                               /* Get ready to send the first block */
-                               TftpState = STATE_DATA;
-                               TftpBlock++;
-                       }
+               NetSetTimeout(TIMEOUT * CFG_HZ, TftpTimeout);
 
-                       TftpSend(); /* Send ACK */
-                       break;
+               TftpSend();
+               break;
+       case TFTP_DATA:
+               if (len < 2)
+                       return;
 
-               // TFTP DATA PACKET
-               case TFTP_DATA:
-                       if(len < 2){
-                               return;
-                       }
+               len -= 2;
+               TftpBlock = ntohs(*(ushort *)pkt);
 
-                       len -= 2;
-                       TftpBlock = ntohs(*(ushort *)pkt);
-
-                       /*
-                        * RFC1350 specifies that the first data packet will
-                        * have sequence number 1. If we receive a sequence
-                        * number of 0 this means that there was a wrap
-                        * around of the (16 bit) counter.
-                        */
-                       if(TftpBlock == 0){
-                               TftpBlockWrap++;
-                               TftpBlockWrapOffset += TFTP_BLOCK_SIZE * TFTP_SEQUENCE_SIZE;
-                               printf("\n         %lu MB received\n         ", TftpBlockWrapOffset>>20);
-                       } else
-                               show_progress(TftpBlock);
+               /*
+                * RFC1350 specifies that the first data packet will
+                * have sequence number 1. If we receive a sequence
+                * number of 0 this means that there was a wrap
+                * around of the (16 bit) counter.
+                */
+               if (TftpBlock == 0) {
+                       TftpBlockWrap++;
+                       TftpBlockWrapOffset += TFTP_BLOCK_SIZE * TFTP_SEQUENCE_SIZE;
 
-       #ifdef ET_DEBUG
-                       if(TftpState == STATE_RRQ){
-                               printf_err("server did not acknowledge timeout option!\n");
-                       }
-       #endif
-
-                       if(TftpState == STATE_RRQ || TftpState == STATE_OACK){
-                               /* first block received */
-                               TftpState = STATE_DATA;
-                               TftpServerPort = src;
-                               TftpLastBlock = 0;
-                               TftpBlockWrap = 0;
-                               TftpBlockWrapOffset = 0;
-
-                               if(TftpBlock != 1){     /* Assertion */
-                                       puts("\n");
-                                       printf_err("first block is not block 1 (%ld), starting again!\n\n", TftpBlock);
-                                       NetStartAgain();
-                                       break;
-                               }
-                       }
+                       puts("\n");
+                       puts("\n              ");
+                       printf("[ %lu MB ]\n",
+                              TftpBlockWrapOffset >> 20);
+                       puts("\n              ");
+               } else
+                       show_progress(TftpBlock);
+
+#if defined(ET_DEBUG)
+               if (TftpState == STATE_RRQ)
+                       printf_err("server did not ACK timeout option!\n");
+#endif
 
-                       if(TftpBlock == TftpLastBlock){
-                               /*
-                                *      Same block again; ignore it.
-                                */
+               if (TftpState == STATE_RRQ || TftpState == STATE_OACK) {
+                       /* First block received */
+                       TftpState = STATE_DATA;
+                       TftpServerPort = src;
+                       TftpLastBlock = 0;
+                       TftpBlockWrap = 0;
+                       TftpBlockWrapOffset = 0;
+
+                       if (TftpBlock != 1) {
+                               puts("\n");
+                               printf_err("first block is not block 1 (%ld), starting again!\n\n", TftpBlock);
+                               NetStartAgain();
                                break;
                        }
+               }
 
-                       TftpLastBlock = TftpBlock;
-                       NetSetTimeout(TIMEOUT * CFG_HZ, TftpTimeout);
+               /* Same block again; ignore it */
+               if (TftpBlock == TftpLastBlock)
+                       break;
 
-                       store_block(TftpBlock - 1, pkt + 2, len);
+               TftpLastBlock = TftpBlock;
+               NetSetTimeout(TIMEOUT * CFG_HZ, TftpTimeout);
 
-                       /*
-                        *      Acknoledge the block just received, which will prompt
-                        *      the server for the next one.
-                        */
-                       TftpSend();
+               store_block(TftpBlock - 1, pkt + 2, len);
 
-                       if(len < TFTP_BLOCK_SIZE)
-                               show_success();
+               /*
+                * Acknoledge the block just received, which will prompt
+                * the server for the next one.
+                */
+               TftpSend();
 
-                       break;
+               if (len < TFTP_BLOCK_SIZE)
+                       show_success();
 
-               case TFTP_ERROR:
-                       puts("\n");
-                       printf_err("'%s' (%d), starting again!\n\n", pkt + 2, ntohs(*(ushort *)pkt));
-                       NetStartAgain();
-                       break;
+               break;
+       case TFTP_ERROR:
+               puts("\n");
+               printf_err("'%s' (%d), starting again!\n\n",
+                          pkt + 2, ntohs(*(ushort *)pkt));
+
+               NetStartAgain();
+               break;
+       default:
+               break;
        }
 }
 
-static void TftpTimeout(void){
+static void TftpTimeout(void)
+{
        bd_t *bd = gd->bd;
 
-       if(++TftpTimeoutCount > TIMEOUT_COUNT){
+       if (++TftpTimeoutCount > TIMEOUT_COUNT) {
                puts("\n\n");
                printf_err("retry count exceeded, starting again!\n\n");
                NetStartAgain();
@@ -375,21 +372,28 @@ static void TftpTimeout(void){
        }
 }
 
-void TftpStart(proto_t protocol){
+void TftpStart(proto_t protocol)
+{
        bd_t *bd = gd->bd;
 
 #ifdef CONFIG_TFTP_PORT
-       char *ep; /* Environment pointer */
+       /* Environment pointer */
+       char *ep;
 #endif
 
-       if(BootFile[0] == '\0'){
-               sprintf(default_filename, "%02lX%02lX%02lX%02lX.img", NetOurIP & 0xFF, (NetOurIP >> 8) & 0xFF,  (NetOurIP >> 16) & 0xFF, (NetOurIP >> 24) & 0xFF);
+       if (BootFile[0] == '\0') {
+               sprintf(default_filename,
+                       "%02lX%02lX%02lX%02lX.img",
+                       (NetOurIP >> 0)  & 0xFF,
+                       (NetOurIP >> 8)  & 0xFF,
+                       (NetOurIP >> 16) & 0xFF,
+                       (NetOurIP >> 24) & 0xFF);
+
                tftp_filename = default_filename;
 
                printf_wrn("no boot file name, using: '%s'\n", tftp_filename);
-       } else {
+       } else
                tftp_filename = BootFile;
-       }
 
        printf("\n%s ", protocol == TFTPPUT ? "  TFTP to IP:" : "TFTP from IP:");
        print_IPaddr(NetServerIP);
@@ -398,19 +402,18 @@ void TftpStart(proto_t protocol){
        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;
-
-           if(OurNet != ServerNet){
-               puts("\n  Gateway IP: ");
-               print_IPaddr(NetOurGatewayIP) ;
-           }
+       if (NetOurGatewayIP && NetOurSubnetMask) {
+               IPaddr_t OurNet    = NetOurIP    & NetOurSubnetMask;
+               IPaddr_t ServerNet = NetServerIP & NetOurSubnetMask;
+
+               if (OurNet != ServerNet) {
+                       puts("\n  Gateway IP: ");
+                       print_IPaddr(NetOurGatewayIP) ;
+               }
        }
 
        printf("\n    Filename: %s", tftp_filename);
 
-
 #if defined(CONFIG_NET_MULTI)
        printf("\n       Using: %s", eth_get_name());
 #endif
@@ -418,8 +421,9 @@ void TftpStart(proto_t protocol){
        TftpWriting = (protocol == TFTPPUT);
 
        if (TftpWriting) {
-               printf("\nSave address: 0x%lx", save_addr);
-               printf("\n   Save size: 0x%lx", save_size);
+               printf("\nSave address: 0x%lX", save_addr);
+               printf("\n   Save size: 0x%lX (", save_size);
+               print_size(save_size, ")");
                puts("\n\n     Sending: *\b");
 
                NetBootFileXferSize = save_size;
@@ -427,10 +431,12 @@ void TftpStart(proto_t protocol){
 
                TftpState = STATE_WRQ;
        } else {
-               printf("\nLoad address: 0x%lx", load_addr);
+               printf("\nLoad address: 0x%lX", load_addr);
 
-               if (NetBootFileSize)
-                       printf("\n   Load size: 0x%lx", NetBootFileSize << 9);
+               if (NetBootFileSize) {
+                       printf("\n   Load size: 0x%lX (", NetBootFileSize << 9);
+                       print_size(NetBootFileSize << 9, ")");
+               }
 
                puts("\n\n     Loading: *\b");
 
@@ -440,27 +446,25 @@ void TftpStart(proto_t protocol){
        NetSetTimeout(TIMEOUT * CFG_HZ, TftpTimeout);
        NetSetHandler(TftpHandler);
 
-       TftpServerPort = WELL_KNOWN_PORT;
+       TftpServerPort   = WELL_KNOWN_PORT;
        TftpTimeoutCount = 0;
 
        /* Use a pseudo-random port unless a specific port is set */
        TftpOurPort = 1024 + (get_timer(0) % 3072);
 
-#ifdef CONFIG_TFTP_PORT
-       if((ep = getenv("tftpdstp")) != NULL){
+#if defined(CONFIG_TFTP_PORT)
+       if ((ep = getenv("tftpdstp")) != NULL)
                TftpServerPort = simple_strtol(ep, NULL, 10);
-       }
-       if((ep = getenv("tftpsrcp")) != NULL){
+
+       if ((ep = getenv("tftpsrcp")) != NULL)
                TftpOurPort= simple_strtol(ep, NULL, 10);
-       }
 #endif
 
        TftpBlock = 0;
 
-       /* zero out server ether in case the server ip has changed */
+       /* Zero out server ether in case the server ip has changed */
        memset(NetServerEther, 0, 6);
 
        TftpSend();
 }
-
 #endif /* CONFIG_CMD_NET */
index abba6259de308931cc20d7573b55c0e6f9d0daeb..172e1bfada22cbc4610eab21aa9c0e621566af06 100644 (file)
@@ -8,14 +8,11 @@
 #ifndef __TFTP_H__
 #define __TFTP_H__
 
-/**********************************************************************/
 /*
- *     Global functions and variables.
+ * Global functions and variables
  */
 
-/* tftp.c */
-extern void    TftpStart(proto_t protocol);    /* Begin TFTP get */
-
-/**********************************************************************/
+/* Begin TFTP get */
+extern void TftpStart(proto_t protocol);
 
 #endif /* __TFTP_H__ */