#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 */
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') {
/*
#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;
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 */
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
#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;
(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 */
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();
}
}
-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);
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
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;
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");
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 */
#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__ */