common: Drop image.h from common header
[oweals/u-boot.git] / net / tftp.c
1 /*
2  * Copyright 1994, 1995, 2000 Neil Russell.
3  * (See License)
4  * Copyright 2000, 2001 DENX Software Engineering, Wolfgang Denk, wd@denx.de
5  * Copyright 2011 Comelit Group SpA,
6  *                Luca Ceresoli <luca.ceresoli@comelit.it>
7  */
8
9 #include <common.h>
10 #include <command.h>
11 #include <efi_loader.h>
12 #include <env.h>
13 #include <image.h>
14 #include <lmb.h>
15 #include <mapmem.h>
16 #include <net.h>
17 #include <net/tftp.h>
18 #include "bootp.h"
19 #ifdef CONFIG_SYS_DIRECT_FLASH_TFTP
20 #include <flash.h>
21 #endif
22
23 DECLARE_GLOBAL_DATA_PTR;
24
25 /* Well known TFTP port # */
26 #define WELL_KNOWN_PORT 69
27 /* Millisecs to timeout for lost pkt */
28 #define TIMEOUT         5000UL
29 #ifndef CONFIG_NET_RETRY_COUNT
30 /* # of timeouts before giving up */
31 # define TIMEOUT_COUNT  10
32 #else
33 # define TIMEOUT_COUNT  (CONFIG_NET_RETRY_COUNT * 2)
34 #endif
35 /* Number of "loading" hashes per line (for checking the image size) */
36 #define HASHES_PER_LINE 65
37
38 /*
39  *      TFTP operations.
40  */
41 #define TFTP_RRQ        1
42 #define TFTP_WRQ        2
43 #define TFTP_DATA       3
44 #define TFTP_ACK        4
45 #define TFTP_ERROR      5
46 #define TFTP_OACK       6
47
48 static ulong timeout_ms = TIMEOUT;
49 static int timeout_count_max = TIMEOUT_COUNT;
50 static ulong time_start;   /* Record time we started tftp */
51
52 /*
53  * These globals govern the timeout behavior when attempting a connection to a
54  * TFTP server. tftp_timeout_ms specifies the number of milliseconds to
55  * wait for the server to respond to initial connection. Second global,
56  * tftp_timeout_count_max, gives the number of such connection retries.
57  * tftp_timeout_count_max must be non-negative and tftp_timeout_ms must be
58  * positive. The globals are meant to be set (and restored) by code needing
59  * non-standard timeout behavior when initiating a TFTP transfer.
60  */
61 ulong tftp_timeout_ms = TIMEOUT;
62 int tftp_timeout_count_max = TIMEOUT_COUNT;
63
64 enum {
65         TFTP_ERR_UNDEFINED           = 0,
66         TFTP_ERR_FILE_NOT_FOUND      = 1,
67         TFTP_ERR_ACCESS_DENIED       = 2,
68         TFTP_ERR_DISK_FULL           = 3,
69         TFTP_ERR_UNEXPECTED_OPCODE   = 4,
70         TFTP_ERR_UNKNOWN_TRANSFER_ID  = 5,
71         TFTP_ERR_FILE_ALREADY_EXISTS = 6,
72 };
73
74 static struct in_addr tftp_remote_ip;
75 /* The UDP port at their end */
76 static int      tftp_remote_port;
77 /* The UDP port at our end */
78 static int      tftp_our_port;
79 static int      timeout_count;
80 /* packet sequence number */
81 static ulong    tftp_cur_block;
82 /* last packet sequence number received */
83 static ulong    tftp_prev_block;
84 /* count of sequence number wraparounds */
85 static ulong    tftp_block_wrap;
86 /* memory offset due to wrapping */
87 static ulong    tftp_block_wrap_offset;
88 static int      tftp_state;
89 static ulong    tftp_load_addr;
90 #ifdef CONFIG_LMB
91 static ulong    tftp_load_size;
92 #endif
93 #ifdef CONFIG_TFTP_TSIZE
94 /* The file size reported by the server */
95 static int      tftp_tsize;
96 /* The number of hashes we printed */
97 static short    tftp_tsize_num_hash;
98 #endif
99 #ifdef CONFIG_CMD_TFTPPUT
100 /* 1 if writing, else 0 */
101 static int      tftp_put_active;
102 /* 1 if we have sent the last block */
103 static int      tftp_put_final_block_sent;
104 #else
105 #define tftp_put_active 0
106 #endif
107
108 #define STATE_SEND_RRQ  1
109 #define STATE_DATA      2
110 #define STATE_TOO_LARGE 3
111 #define STATE_BAD_MAGIC 4
112 #define STATE_OACK      5
113 #define STATE_RECV_WRQ  6
114 #define STATE_SEND_WRQ  7
115
116 /* default TFTP block size */
117 #define TFTP_BLOCK_SIZE         512
118 /* sequence number is 16 bit */
119 #define TFTP_SEQUENCE_SIZE      ((ulong)(1<<16))
120
121 #define DEFAULT_NAME_LEN        (8 + 4 + 1)
122 static char default_filename[DEFAULT_NAME_LEN];
123
124 #ifndef CONFIG_TFTP_FILE_NAME_MAX_LEN
125 #define MAX_LEN 128
126 #else
127 #define MAX_LEN CONFIG_TFTP_FILE_NAME_MAX_LEN
128 #endif
129
130 static char tftp_filename[MAX_LEN];
131
132 /* 512 is poor choice for ethernet, MTU is typically 1500.
133  * Minus eth.hdrs thats 1468.  Can get 2x better throughput with
134  * almost-MTU block sizes.  At least try... fall back to 512 if need be.
135  * (but those using CONFIG_IP_DEFRAG may want to set a larger block in cfg file)
136  */
137
138 static unsigned short tftp_block_size = TFTP_BLOCK_SIZE;
139 static unsigned short tftp_block_size_option = CONFIG_TFTP_BLOCKSIZE;
140
141 static inline int store_block(int block, uchar *src, unsigned int len)
142 {
143         ulong offset = block * tftp_block_size + tftp_block_wrap_offset;
144         ulong newsize = offset + len;
145         ulong store_addr = tftp_load_addr + offset;
146 #ifdef CONFIG_SYS_DIRECT_FLASH_TFTP
147         int i, rc = 0;
148
149         for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) {
150                 /* start address in flash? */
151                 if (flash_info[i].flash_id == FLASH_UNKNOWN)
152                         continue;
153                 if (store_addr >= flash_info[i].start[0]) {
154                         rc = 1;
155                         break;
156                 }
157         }
158
159         if (rc) { /* Flash is destination for this packet */
160                 rc = flash_write((char *)src, store_addr, len);
161                 if (rc) {
162                         flash_perror(rc);
163                         return rc;
164                 }
165         } else
166 #endif /* CONFIG_SYS_DIRECT_FLASH_TFTP */
167         {
168                 void *ptr;
169
170 #ifdef CONFIG_LMB
171                 ulong end_addr = tftp_load_addr + tftp_load_size;
172
173                 if (!end_addr)
174                         end_addr = ULONG_MAX;
175
176                 if (store_addr < tftp_load_addr ||
177                     store_addr + len > end_addr) {
178                         puts("\nTFTP error: ");
179                         puts("trying to overwrite reserved memory...\n");
180                         return -1;
181                 }
182 #endif
183                 ptr = map_sysmem(store_addr, len);
184                 memcpy(ptr, src, len);
185                 unmap_sysmem(ptr);
186         }
187
188         if (net_boot_file_size < newsize)
189                 net_boot_file_size = newsize;
190
191         return 0;
192 }
193
194 /* Clear our state ready for a new transfer */
195 static void new_transfer(void)
196 {
197         tftp_prev_block = 0;
198         tftp_block_wrap = 0;
199         tftp_block_wrap_offset = 0;
200 #ifdef CONFIG_CMD_TFTPPUT
201         tftp_put_final_block_sent = 0;
202 #endif
203 }
204
205 #ifdef CONFIG_CMD_TFTPPUT
206 /**
207  * Load the next block from memory to be sent over tftp.
208  *
209  * @param block Block number to send
210  * @param dst   Destination buffer for data
211  * @param len   Number of bytes in block (this one and every other)
212  * @return number of bytes loaded
213  */
214 static int load_block(unsigned block, uchar *dst, unsigned len)
215 {
216         /* We may want to get the final block from the previous set */
217         ulong offset = ((int)block - 1) * len + tftp_block_wrap_offset;
218         ulong tosend = len;
219
220         tosend = min(net_boot_file_size - offset, tosend);
221         (void)memcpy(dst, (void *)(image_save_addr + offset), tosend);
222         debug("%s: block=%u, offset=%lu, len=%u, tosend=%lu\n", __func__,
223               block, offset, len, tosend);
224         return tosend;
225 }
226 #endif
227
228 static void tftp_send(void);
229 static void tftp_timeout_handler(void);
230
231 /**********************************************************************/
232
233 static void show_block_marker(void)
234 {
235 #ifdef CONFIG_TFTP_TSIZE
236         if (tftp_tsize) {
237                 ulong pos = tftp_cur_block * tftp_block_size +
238                         tftp_block_wrap_offset;
239                 if (pos > tftp_tsize)
240                         pos = tftp_tsize;
241
242                 while (tftp_tsize_num_hash < pos * 50 / tftp_tsize) {
243                         putc('#');
244                         tftp_tsize_num_hash++;
245                 }
246         } else
247 #endif
248         {
249                 if (((tftp_cur_block - 1) % 10) == 0)
250                         putc('#');
251                 else if ((tftp_cur_block % (10 * HASHES_PER_LINE)) == 0)
252                         puts("\n\t ");
253         }
254 }
255
256 /**
257  * restart the current transfer due to an error
258  *
259  * @param msg   Message to print for user
260  */
261 static void restart(const char *msg)
262 {
263         printf("\n%s; starting again\n", msg);
264         net_start_again();
265 }
266
267 /*
268  * Check if the block number has wrapped, and update progress
269  *
270  * TODO: The egregious use of global variables in this file should be tidied.
271  */
272 static void update_block_number(void)
273 {
274         /*
275          * RFC1350 specifies that the first data packet will
276          * have sequence number 1. If we receive a sequence
277          * number of 0 this means that there was a wrap
278          * around of the (16 bit) counter.
279          */
280         if (tftp_cur_block == 0 && tftp_prev_block != 0) {
281                 tftp_block_wrap++;
282                 tftp_block_wrap_offset += tftp_block_size * TFTP_SEQUENCE_SIZE;
283                 timeout_count = 0; /* we've done well, reset the timeout */
284         } else {
285                 show_block_marker();
286         }
287 }
288
289 /* The TFTP get or put is complete */
290 static void tftp_complete(void)
291 {
292 #ifdef CONFIG_TFTP_TSIZE
293         /* Print hash marks for the last packet received */
294         while (tftp_tsize && tftp_tsize_num_hash < 49) {
295                 putc('#');
296                 tftp_tsize_num_hash++;
297         }
298         puts("  ");
299         print_size(tftp_tsize, "");
300 #endif
301         time_start = get_timer(time_start);
302         if (time_start > 0) {
303                 puts("\n\t ");  /* Line up with "Loading: " */
304                 print_size(net_boot_file_size /
305                         time_start * 1000, "/s");
306         }
307         puts("\ndone\n");
308         net_set_state(NETLOOP_SUCCESS);
309 }
310
311 static void tftp_send(void)
312 {
313         uchar *pkt;
314         uchar *xp;
315         int len = 0;
316         ushort *s;
317
318         /*
319          *      We will always be sending some sort of packet, so
320          *      cobble together the packet headers now.
321          */
322         pkt = net_tx_packet + net_eth_hdr_size() + IP_UDP_HDR_SIZE;
323
324         switch (tftp_state) {
325         case STATE_SEND_RRQ:
326         case STATE_SEND_WRQ:
327                 xp = pkt;
328                 s = (ushort *)pkt;
329 #ifdef CONFIG_CMD_TFTPPUT
330                 *s++ = htons(tftp_state == STATE_SEND_RRQ ? TFTP_RRQ :
331                         TFTP_WRQ);
332 #else
333                 *s++ = htons(TFTP_RRQ);
334 #endif
335                 pkt = (uchar *)s;
336                 strcpy((char *)pkt, tftp_filename);
337                 pkt += strlen(tftp_filename) + 1;
338                 strcpy((char *)pkt, "octet");
339                 pkt += 5 /*strlen("octet")*/ + 1;
340                 strcpy((char *)pkt, "timeout");
341                 pkt += 7 /*strlen("timeout")*/ + 1;
342                 sprintf((char *)pkt, "%lu", timeout_ms / 1000);
343                 debug("send option \"timeout %s\"\n", (char *)pkt);
344                 pkt += strlen((char *)pkt) + 1;
345 #ifdef CONFIG_TFTP_TSIZE
346                 pkt += sprintf((char *)pkt, "tsize%c%u%c",
347                                 0, net_boot_file_size, 0);
348 #endif
349                 /* try for more effic. blk size */
350                 pkt += sprintf((char *)pkt, "blksize%c%d%c",
351                                 0, tftp_block_size_option, 0);
352                 len = pkt - xp;
353                 break;
354
355         case STATE_OACK:
356
357         case STATE_RECV_WRQ:
358         case STATE_DATA:
359                 xp = pkt;
360                 s = (ushort *)pkt;
361                 s[0] = htons(TFTP_ACK);
362                 s[1] = htons(tftp_cur_block);
363                 pkt = (uchar *)(s + 2);
364 #ifdef CONFIG_CMD_TFTPPUT
365                 if (tftp_put_active) {
366                         int toload = tftp_block_size;
367                         int loaded = load_block(tftp_cur_block, pkt, toload);
368
369                         s[0] = htons(TFTP_DATA);
370                         pkt += loaded;
371                         tftp_put_final_block_sent = (loaded < toload);
372                 }
373 #endif
374                 len = pkt - xp;
375                 break;
376
377         case STATE_TOO_LARGE:
378                 xp = pkt;
379                 s = (ushort *)pkt;
380                 *s++ = htons(TFTP_ERROR);
381                         *s++ = htons(3);
382
383                 pkt = (uchar *)s;
384                 strcpy((char *)pkt, "File too large");
385                 pkt += 14 /*strlen("File too large")*/ + 1;
386                 len = pkt - xp;
387                 break;
388
389         case STATE_BAD_MAGIC:
390                 xp = pkt;
391                 s = (ushort *)pkt;
392                 *s++ = htons(TFTP_ERROR);
393                 *s++ = htons(2);
394                 pkt = (uchar *)s;
395                 strcpy((char *)pkt, "File has bad magic");
396                 pkt += 18 /*strlen("File has bad magic")*/ + 1;
397                 len = pkt - xp;
398                 break;
399         }
400
401         net_send_udp_packet(net_server_ethaddr, tftp_remote_ip,
402                             tftp_remote_port, tftp_our_port, len);
403 }
404
405 #ifdef CONFIG_CMD_TFTPPUT
406 static void icmp_handler(unsigned type, unsigned code, unsigned dest,
407                          struct in_addr sip, unsigned src, uchar *pkt,
408                          unsigned len)
409 {
410         if (type == ICMP_NOT_REACH && code == ICMP_NOT_REACH_PORT) {
411                 /* Oh dear the other end has gone away */
412                 restart("TFTP server died");
413         }
414 }
415 #endif
416
417 static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
418                          unsigned src, unsigned len)
419 {
420         __be16 proto;
421         __be16 *s;
422         int i;
423
424         if (dest != tftp_our_port) {
425                         return;
426         }
427         if (tftp_state != STATE_SEND_RRQ && src != tftp_remote_port &&
428             tftp_state != STATE_RECV_WRQ && tftp_state != STATE_SEND_WRQ)
429                 return;
430
431         if (len < 2)
432                 return;
433         len -= 2;
434         /* warning: don't use increment (++) in ntohs() macros!! */
435         s = (__be16 *)pkt;
436         proto = *s++;
437         pkt = (uchar *)s;
438         switch (ntohs(proto)) {
439         case TFTP_RRQ:
440                 break;
441
442         case TFTP_ACK:
443 #ifdef CONFIG_CMD_TFTPPUT
444                 if (tftp_put_active) {
445                         if (tftp_put_final_block_sent) {
446                                 tftp_complete();
447                         } else {
448                                 /*
449                                  * Move to the next block. We want our block
450                                  * count to wrap just like the other end!
451                                  */
452                                 int block = ntohs(*s);
453                                 int ack_ok = (tftp_cur_block == block);
454
455                                 tftp_cur_block = (unsigned short)(block + 1);
456                                 update_block_number();
457                                 if (ack_ok)
458                                         tftp_send(); /* Send next data block */
459                         }
460                 }
461 #endif
462                 break;
463
464         default:
465                 break;
466
467 #ifdef CONFIG_CMD_TFTPSRV
468         case TFTP_WRQ:
469                 debug("Got WRQ\n");
470                 tftp_remote_ip = sip;
471                 tftp_remote_port = src;
472                 tftp_our_port = 1024 + (get_timer(0) % 3072);
473                 new_transfer();
474                 tftp_send(); /* Send ACK(0) */
475                 break;
476 #endif
477
478         case TFTP_OACK:
479                 debug("Got OACK: %s %s\n",
480                       pkt, pkt + strlen((char *)pkt) + 1);
481                 tftp_state = STATE_OACK;
482                 tftp_remote_port = src;
483                 /*
484                  * Check for 'blksize' option.
485                  * Careful: "i" is signed, "len" is unsigned, thus
486                  * something like "len-8" may give a *huge* number
487                  */
488                 for (i = 0; i+8 < len; i++) {
489                         if (strcmp((char *)pkt + i, "blksize") == 0) {
490                                 tftp_block_size = (unsigned short)
491                                         simple_strtoul((char *)pkt + i + 8,
492                                                        NULL, 10);
493                                 debug("Blocksize ack: %s, %d\n",
494                                       (char *)pkt + i + 8, tftp_block_size);
495                         }
496 #ifdef CONFIG_TFTP_TSIZE
497                         if (strcmp((char *)pkt+i, "tsize") == 0) {
498                                 tftp_tsize = simple_strtoul((char *)pkt + i + 6,
499                                                            NULL, 10);
500                                 debug("size = %s, %d\n",
501                                       (char *)pkt + i + 6, tftp_tsize);
502                         }
503 #endif
504                 }
505 #ifdef CONFIG_CMD_TFTPPUT
506                 if (tftp_put_active) {
507                         /* Get ready to send the first block */
508                         tftp_state = STATE_DATA;
509                         tftp_cur_block++;
510                 }
511 #endif
512                 tftp_send(); /* Send ACK or first data block */
513                 break;
514         case TFTP_DATA:
515                 if (len < 2)
516                         return;
517                 len -= 2;
518                 tftp_cur_block = ntohs(*(__be16 *)pkt);
519
520                 update_block_number();
521
522                 if (tftp_state == STATE_SEND_RRQ)
523                         debug("Server did not acknowledge timeout option!\n");
524
525                 if (tftp_state == STATE_SEND_RRQ || tftp_state == STATE_OACK ||
526                     tftp_state == STATE_RECV_WRQ) {
527                         /* first block received */
528                         tftp_state = STATE_DATA;
529                         tftp_remote_port = src;
530                         new_transfer();
531
532                         if (tftp_cur_block != 1) {      /* Assertion */
533                                 puts("\nTFTP error: ");
534                                 printf("First block is not block 1 (%ld)\n",
535                                        tftp_cur_block);
536                                 puts("Starting again\n\n");
537                                 net_start_again();
538                                 break;
539                         }
540                 }
541
542                 if (tftp_cur_block == tftp_prev_block) {
543                         /* Same block again; ignore it. */
544                         break;
545                 }
546
547                 tftp_prev_block = tftp_cur_block;
548                 timeout_count_max = tftp_timeout_count_max;
549                 net_set_timeout_handler(timeout_ms, tftp_timeout_handler);
550
551                 if (store_block(tftp_cur_block - 1, pkt + 2, len)) {
552                         eth_halt();
553                         net_set_state(NETLOOP_FAIL);
554                         break;
555                 }
556
557                 /*
558                  *      Acknowledge the block just received, which will prompt
559                  *      the remote for the next one.
560                  */
561                 tftp_send();
562
563                 if (len < tftp_block_size)
564                         tftp_complete();
565                 break;
566
567         case TFTP_ERROR:
568                 printf("\nTFTP error: '%s' (%d)\n",
569                        pkt + 2, ntohs(*(__be16 *)pkt));
570
571                 switch (ntohs(*(__be16 *)pkt)) {
572                 case TFTP_ERR_FILE_NOT_FOUND:
573                 case TFTP_ERR_ACCESS_DENIED:
574                         puts("Not retrying...\n");
575                         eth_halt();
576                         net_set_state(NETLOOP_FAIL);
577                         break;
578                 case TFTP_ERR_UNDEFINED:
579                 case TFTP_ERR_DISK_FULL:
580                 case TFTP_ERR_UNEXPECTED_OPCODE:
581                 case TFTP_ERR_UNKNOWN_TRANSFER_ID:
582                 case TFTP_ERR_FILE_ALREADY_EXISTS:
583                 default:
584                         puts("Starting again\n\n");
585                         net_start_again();
586                         break;
587                 }
588                 break;
589         }
590 }
591
592
593 static void tftp_timeout_handler(void)
594 {
595         if (++timeout_count > timeout_count_max) {
596                 restart("Retry count exceeded");
597         } else {
598                 puts("T ");
599                 net_set_timeout_handler(timeout_ms, tftp_timeout_handler);
600                 if (tftp_state != STATE_RECV_WRQ)
601                         tftp_send();
602         }
603 }
604
605 /* Initialize tftp_load_addr and tftp_load_size from image_load_addr and lmb */
606 static int tftp_init_load_addr(void)
607 {
608 #ifdef CONFIG_LMB
609         struct lmb lmb;
610         phys_size_t max_size;
611
612         lmb_init_and_reserve(&lmb, gd->bd, (void *)gd->fdt_blob);
613
614         max_size = lmb_get_free_size(&lmb, image_load_addr);
615         if (!max_size)
616                 return -1;
617
618         tftp_load_size = max_size;
619 #endif
620         tftp_load_addr = image_load_addr;
621         return 0;
622 }
623
624 void tftp_start(enum proto_t protocol)
625 {
626 #if CONFIG_NET_TFTP_VARS
627         char *ep;             /* Environment pointer */
628
629         /*
630          * Allow the user to choose TFTP blocksize and timeout.
631          * TFTP protocol has a minimal timeout of 1 second.
632          */
633
634         ep = env_get("tftpblocksize");
635         if (ep != NULL)
636                 tftp_block_size_option = simple_strtol(ep, NULL, 10);
637
638         ep = env_get("tftptimeout");
639         if (ep != NULL)
640                 timeout_ms = simple_strtol(ep, NULL, 10);
641
642         if (timeout_ms < 1000) {
643                 printf("TFTP timeout (%ld ms) too low, set min = 1000 ms\n",
644                        timeout_ms);
645                 timeout_ms = 1000;
646         }
647
648         ep = env_get("tftptimeoutcountmax");
649         if (ep != NULL)
650                 tftp_timeout_count_max = simple_strtol(ep, NULL, 10);
651
652         if (tftp_timeout_count_max < 0) {
653                 printf("TFTP timeout count max (%d ms) negative, set to 0\n",
654                        tftp_timeout_count_max);
655                 tftp_timeout_count_max = 0;
656         }
657 #endif
658
659         debug("TFTP blocksize = %i, timeout = %ld ms\n",
660               tftp_block_size_option, timeout_ms);
661
662         tftp_remote_ip = net_server_ip;
663         if (!net_parse_bootfile(&tftp_remote_ip, tftp_filename, MAX_LEN)) {
664                 sprintf(default_filename, "%02X%02X%02X%02X.img",
665                         net_ip.s_addr & 0xFF,
666                         (net_ip.s_addr >>  8) & 0xFF,
667                         (net_ip.s_addr >> 16) & 0xFF,
668                         (net_ip.s_addr >> 24) & 0xFF);
669
670                 strncpy(tftp_filename, default_filename, DEFAULT_NAME_LEN);
671                 tftp_filename[DEFAULT_NAME_LEN - 1] = 0;
672
673                 printf("*** Warning: no boot file name; using '%s'\n",
674                        tftp_filename);
675         }
676
677         printf("Using %s device\n", eth_get_name());
678         printf("TFTP %s server %pI4; our IP address is %pI4",
679 #ifdef CONFIG_CMD_TFTPPUT
680                protocol == TFTPPUT ? "to" : "from",
681 #else
682                "from",
683 #endif
684                &tftp_remote_ip, &net_ip);
685
686         /* Check if we need to send across this subnet */
687         if (net_gateway.s_addr && net_netmask.s_addr) {
688                 struct in_addr our_net;
689                 struct in_addr remote_net;
690
691                 our_net.s_addr = net_ip.s_addr & net_netmask.s_addr;
692                 remote_net.s_addr = tftp_remote_ip.s_addr & net_netmask.s_addr;
693                 if (our_net.s_addr != remote_net.s_addr)
694                         printf("; sending through gateway %pI4", &net_gateway);
695         }
696         putc('\n');
697
698         printf("Filename '%s'.", tftp_filename);
699
700         if (net_boot_file_expected_size_in_blocks) {
701                 printf(" Size is 0x%x Bytes = ",
702                        net_boot_file_expected_size_in_blocks << 9);
703                 print_size(net_boot_file_expected_size_in_blocks << 9, "");
704         }
705
706         putc('\n');
707 #ifdef CONFIG_CMD_TFTPPUT
708         tftp_put_active = (protocol == TFTPPUT);
709         if (tftp_put_active) {
710                 printf("Save address: 0x%lx\n", image_save_addr);
711                 printf("Save size:    0x%lx\n", image_save_size);
712                 net_boot_file_size = image_save_size;
713                 puts("Saving: *\b");
714                 tftp_state = STATE_SEND_WRQ;
715                 new_transfer();
716         } else
717 #endif
718         {
719                 if (tftp_init_load_addr()) {
720                         eth_halt();
721                         net_set_state(NETLOOP_FAIL);
722                         puts("\nTFTP error: ");
723                         puts("trying to overwrite reserved memory...\n");
724                         return;
725                 }
726                 printf("Load address: 0x%lx\n", tftp_load_addr);
727                 puts("Loading: *\b");
728                 tftp_state = STATE_SEND_RRQ;
729 #ifdef CONFIG_CMD_BOOTEFI
730                 efi_set_bootdev("Net", "", tftp_filename);
731 #endif
732         }
733
734         time_start = get_timer(0);
735         timeout_count_max = tftp_timeout_count_max;
736
737         net_set_timeout_handler(timeout_ms, tftp_timeout_handler);
738         net_set_udp_handler(tftp_handler);
739 #ifdef CONFIG_CMD_TFTPPUT
740         net_set_icmp_handler(icmp_handler);
741 #endif
742         tftp_remote_port = WELL_KNOWN_PORT;
743         timeout_count = 0;
744         /* Use a pseudo-random port unless a specific port is set */
745         tftp_our_port = 1024 + (get_timer(0) % 3072);
746
747 #ifdef CONFIG_TFTP_PORT
748         ep = env_get("tftpdstp");
749         if (ep != NULL)
750                 tftp_remote_port = simple_strtol(ep, NULL, 10);
751         ep = env_get("tftpsrcp");
752         if (ep != NULL)
753                 tftp_our_port = simple_strtol(ep, NULL, 10);
754 #endif
755         tftp_cur_block = 0;
756
757         /* zero out server ether in case the server ip has changed */
758         memset(net_server_ethaddr, 0, 6);
759         /* Revert tftp_block_size to dflt */
760         tftp_block_size = TFTP_BLOCK_SIZE;
761 #ifdef CONFIG_TFTP_TSIZE
762         tftp_tsize = 0;
763         tftp_tsize_num_hash = 0;
764 #endif
765
766         tftp_send();
767 }
768
769 #ifdef CONFIG_CMD_TFTPSRV
770 void tftp_start_server(void)
771 {
772         tftp_filename[0] = 0;
773
774         if (tftp_init_load_addr()) {
775                 eth_halt();
776                 net_set_state(NETLOOP_FAIL);
777                 puts("\nTFTP error: trying to overwrite reserved memory...\n");
778                 return;
779         }
780         printf("Using %s device\n", eth_get_name());
781         printf("Listening for TFTP transfer on %pI4\n", &net_ip);
782         printf("Load address: 0x%lx\n", tftp_load_addr);
783
784         puts("Loading: *\b");
785
786         timeout_count_max = tftp_timeout_count_max;
787         timeout_count = 0;
788         timeout_ms = TIMEOUT;
789         net_set_timeout_handler(timeout_ms, tftp_timeout_handler);
790
791         /* Revert tftp_block_size to dflt */
792         tftp_block_size = TFTP_BLOCK_SIZE;
793         tftp_cur_block = 0;
794         tftp_our_port = WELL_KNOWN_PORT;
795
796 #ifdef CONFIG_TFTP_TSIZE
797         tftp_tsize = 0;
798         tftp_tsize_num_hash = 0;
799 #endif
800
801         tftp_state = STATE_RECV_WRQ;
802         net_set_udp_handler(tftp_handler);
803
804         /* zero out server ether in case the server ip has changed */
805         memset(net_server_ethaddr, 0, 6);
806 }
807 #endif /* CONFIG_CMD_TFTPSRV */
808