[tcp] Randomize TCP bind port
authorGuo-Fu Tseng <cooldavid@cooldavid.org>
Tue, 13 Jul 2010 13:16:26 +0000 (21:16 +0800)
committerMarty Connor <mdc@etherboot.org>
Sun, 1 Aug 2010 19:44:37 +0000 (15:44 -0400)
This changes is intended to reduce possible TCP port collisions.

Reviewed-by: Michael Brown <mcb30@ipxe.org>
Signed-off-by: Marty Connor <mdc@etherboot.org>
src/net/tcp.c

index 9dbc3f6..513c527 100644 (file)
@@ -174,13 +174,14 @@ tcp_dump_flags ( struct tcp_connection *tcp, unsigned int flags ) {
  */
 static int tcp_bind ( struct tcp_connection *tcp, unsigned int port ) {
        struct tcp_connection *existing;
-       static uint16_t try_port = 1023;
+       uint16_t try_port;
+       int i;
 
-       /* If no port specified, find the first available port */
+       /* If no port specified, find an available port */
        if ( ! port ) {
-               while ( try_port ) {
-                       try_port++;
-                       if ( try_port < 1024 )
+               try_port = ( random() % 64512 ) + 1023;
+               for ( i = 0 ; i < 65536 ; ++i ) {
+                       if ( ++try_port < 1024 )
                                continue;
                        if ( tcp_bind ( tcp, try_port ) == 0 )
                                return 0;