From: <pa...@us...> - 2011-06-19 21:35:57
|
Revision: 4498 http://fuse-emulator.svn.sourceforge.net/fuse-emulator/?rev=4498&view=rev Author: pak21 Date: 2011-06-19 21:35:50 +0000 (Sun, 19 Jun 2011) Log Message: ----------- Bind sockets when we first attempt to use them rather than we the PORT register is written to to prevent multiple bind attempts. Also deals with the problem of the bytes of PORT being written to in different orders in different bits of the Spectranet code. Modified Paths: -------------- branches/2011-02-16-spectranet/fuse/hacking/ChangeLog branches/2011-02-16-spectranet/fuse/peripherals/nic/w5100_internals.h branches/2011-02-16-spectranet/fuse/peripherals/nic/w5100_socket.c Modified: branches/2011-02-16-spectranet/fuse/hacking/ChangeLog =================================================================== --- branches/2011-02-16-spectranet/fuse/hacking/ChangeLog 2011-06-19 20:33:46 UTC (rev 4497) +++ branches/2011-02-16-spectranet/fuse/hacking/ChangeLog 2011-06-19 21:35:50 UTC (rev 4498) @@ -3740,3 +3740,8 @@ are properly cleared out on reset. 20110619 peripherals/spectranet.c: implement "deny downstream A15" lack of support. +20110619 peripherals/nic/{w5100_internals.h,w5100_socket.c}: bind sockets when + we first attempt to use them rather than we the PORT register is + written to to prevent multiple bind attempts. Also deals with the + problem of the bytes of PORT being written to in different orders in + different bits of the Spectranet code. Modified: branches/2011-02-16-spectranet/fuse/peripherals/nic/w5100_internals.h =================================================================== --- branches/2011-02-16-spectranet/fuse/peripherals/nic/w5100_internals.h 2011-06-19 20:33:46 UTC (rev 4497) +++ branches/2011-02-16-spectranet/fuse/peripherals/nic/w5100_internals.h 2011-06-19 21:35:50 UTC (rev 4498) @@ -106,6 +106,7 @@ /* Host properties */ int fd; /* Socket file descriptor */ + int socket_bound; /* True once we've bound the socket to a port */ int write_pending; /* True if we're waiting to write data on this socket */ /* Flag used to indicate that a socket has been closed since we started Modified: branches/2011-02-16-spectranet/fuse/peripherals/nic/w5100_socket.c =================================================================== --- branches/2011-02-16-spectranet/fuse/peripherals/nic/w5100_socket.c 2011-06-19 20:33:46 UTC (rev 4497) +++ branches/2011-02-16-spectranet/fuse/peripherals/nic/w5100_socket.c 2011-06-19 21:35:50 UTC (rev 4498) @@ -52,6 +52,7 @@ { socket->id = which; socket->fd = -1; + socket->socket_bound = 0; socket->ok_for_io = 0; pthread_mutex_init( &socket->lock, NULL ); } @@ -109,6 +110,7 @@ w5100_socket_acquire_lock( socket ); close( socket->fd ); socket->fd = -1; + socket->socket_bound = 0; socket->ok_for_io = 0; socket->write_pending = 0; w5100_socket_release_lock( socket ); @@ -199,17 +201,13 @@ memcpy( &sa.sin_port, socket->port, 2 ); memcpy( &sa.sin_addr.s_addr, self->sip, 4 ); - w5100_socket_acquire_lock( socket ); if( bind( socket->fd, (struct sockaddr*)&sa, sizeof(sa) ) == -1 ) { printf("w5100: failed to bind socket %d; errno = %d\n", socket->id, errno); w5100_socket_release_lock( socket ); return; } - w5100_socket_release_lock( socket ); - nic_w5100_wake_io_thread( self ); - - printf("w5100: successfully bound socket %d\n", socket->id); + printf("w5100: successfully bound socket %d to port 0x%04x\n", socket->id, ntohs(sa.sin_port) ); } static void @@ -220,6 +218,7 @@ w5100_socket_acquire_lock( socket ); close( socket->fd ); socket->fd = -1; + socket->socket_bound = 0; socket->ok_for_io = 0; socket->state = W5100_SOCKET_STATE_CLOSED; w5100_socket_release_lock( socket ); @@ -233,6 +232,8 @@ if( socket->mode == W5100_SOCKET_MODE_UDP && socket->state == W5100_SOCKET_STATE_UDP ) { w5100_socket_acquire_lock( socket ); + if( !socket->socket_bound ) + w5100_socket_bind_port( self, socket ); socket->write_pending = 1; w5100_socket_release_lock( socket ); nic_w5100_wake_io_thread( self ); @@ -356,8 +357,6 @@ case W5100_SOCKET_PORT0: case W5100_SOCKET_PORT1: printf("w5100: writing 0x%02x to S%d_PORT%d\n", b, socket->id, socket_reg - W5100_SOCKET_PORT0); socket->port[socket_reg - W5100_SOCKET_PORT0] = b; - if( socket_reg == W5100_SOCKET_PORT0 ) - w5100_socket_bind_port( self, socket ); break; case W5100_SOCKET_DIPR0: case W5100_SOCKET_DIPR1: case W5100_SOCKET_DIPR2: case W5100_SOCKET_DIPR3: printf("w5100: writing 0x%02x to S%d_DIPR%d\n", b, socket->id, socket_reg - W5100_SOCKET_DIPR0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |