
Hi Wolfgang,
Attached is a patch to allow the user to set an environment variable "tftpourport" to force TFTP to use that value for "TftpOurPort" (our UDP port). As discussed yesterday on this list, this is helpful for "punching through" a firewall such as is installed with Windows XP SP2.
Making it an environment variable is cute but an overkill. If there is an outcry over the level of overkill, I would be willing to make the UDP port a simple #define of a compile time constant, in which case it would actually save a few bytes of ROM over the pseudo-random algorithm :-).
Thanks, gvb
CHANGELOG:
* Patch by Jerry Van Baren 05 Jan 2005 - Make the u-boot TFTP source port be configurable using the environment variable "tftpourport": * If set, use that port as the u-boot source port * If not set, use the current method of using a pseudo random port
- The additional code can be totally removed by setting the #define TFTP_PORT_FROM_ENV (in the net/tftp.c file) to zero.
- The purpose behind this change is that our customer will modify their TFTP server so that it blindly starts the TFTP transfer using the pre-configured target IP address and UDP port. This will have the effect of "punching through" the (Windows XP) firewall, allowing the remainder of the TFTP transfer to proceed normally.
Index: net/tftp.c =================================================================== RCS file: /cvsroot/u-boot/u-boot/net/tftp.c,v retrieving revision 1.9 diff -p -u -r1.9 tftp.c --- net/tftp.c 15 Apr 2004 21:48:55 -0000 1.9 +++ net/tftp.c 6 Jan 2005 03:20:41 -0000 @@ -24,6 +24,9 @@ /* (for checking the image size) */ #define HASHES_PER_LINE 65 /* Number of "loading" hashes per line */
+#define TFTP_PORT_FROM_ENV 1 /* define this to allow setting the */ + /* TFTP source port in the environment */ + /* variable "tftpourport" */ /* * TFTP operations. */ @@ -301,6 +304,8 @@ TftpTimeout (void) void TftpStart (void) { + char *ep; /* Environment pointer */ + if (BootFile[0] == '\0') { IPaddr_t OurIP = ntohl(NetOurIP);
@@ -354,7 +359,13 @@ TftpStart (void) TftpServerPort = WELL_KNOWN_PORT; TftpTimeoutCount = 0; TftpState = STATE_RRQ; + /* Use a pseudo-random port unless a specific port is set */ TftpOurPort = 1024 + (get_timer(0) % 3072); +#if TFTP_PORT_FROM_ENV + if ((ep = getenv("tftpourport")) != NULL) { + TftpOurPort= simple_strtol(ep, NULL, 10); + } +#endif TftpBlock = 0;
/* zero out server ether in case the server ip has changed */