Allow to force TFTP to use a fixed UDP port
(Add a configuration option CONFIG_TFTP_PORT and optional env variable tftpport)
Patch by Jerry Van Baren, 10 Jan 2005
diff --git a/CHANGELOG b/CHANGELOG
index 1ed2fb7..bc194ff 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,11 @@
 Changes for U-Boot 1.1.4:
 ======================================================================
 
+* Allow to force TFTP to use a fixed UDP port
+  (Add a configuration option CONFIG_TFTP_PORT and optional env
+  variable tftpport)
+  Patch by Jerry Van Baren, 10 Jan 2005
+
 * Fix ethernet timeouts on dbau1550 and other au1x00 systems
   Patch by Leif Lindholm, 29 Dec 2004
 
diff --git a/README b/README
index e3d0537..3b36e50 100644
--- a/README
+++ b/README
@@ -1487,6 +1487,22 @@
 		When SystemACE support is added, the "ace" device type
 		becomes available to the fat commands, i.e. fatls.
 
+- TFTP Fixed UDP Port:
+		CONFIG_TFTP_PORT
+
+		If this is defined, the environment variable tftpport
+		is used to supply the TFTP UDP source port value.
+		If tftpport isn't defined, the normal pseudo-random port
+		number generator is used.
+
+		The purpose for this is to allow a TFTP server to
+		blindly start the TFTP transfer using the pre-configured
+		target IP address and UDP port. This has the effect of
+		"punching through" the (Windows XP) firewall, allowing
+		the remainder of the TFTP transfer to proceed normally.
+		A better solution is to properly configure the firewall,
+		but sometimes that is not allowed.
+
 - Show boot progress:
 		CONFIG_SHOW_BOOT_PROGRESS
 
@@ -2452,6 +2468,9 @@
 		  Useful on scripts which control the retry operation
 		  themselves.
 
+  tftpport	- If this is set, the value is used for TFTP's
+		  UDP source port.
+
    vlan		- When set to a value < 4095 the traffic over
 		  ethernet is encapsulated/received over 802.1q
 		  VLAN tagged frames.
diff --git a/net/tftp.c b/net/tftp.c
index 03a0027..a7c246a 100644
--- a/net/tftp.c
+++ b/net/tftp.c
@@ -313,6 +313,10 @@
 void
 TftpStart (void)
 {
+#ifdef CONFIG_TFTP_PORT
+	char *ep;             /* Environment pointer */
+#endif
+
 	if (BootFile[0] == '\0') {
 		sprintf(default_filename, "%02lX%02lX%02lX%02lX.img",
 			NetOurIP & 0xFF,
@@ -364,7 +368,13 @@
 	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);
+#ifdef CONFIG_TFTP_PORT
+	if ((ep = getenv("tftpport")) != NULL) {
+		TftpOurPort= simple_strtol(ep, NULL, 10);
+	}
+#endif
 	TftpBlock = 0;
 
 	/* zero out server ether in case the server ip has changed */