Author: cgutman
Date: Tue Jul 12 21:31:36 2011
New Revision: 52667
URL:
http://svn.reactos.org/svn/reactos?rev=52667&view=rev
Log:
[IP]
- Store the address of an outgoing NIC properly (gethostname() fix)
- Don't do an explicit bind if we don't have to (ws2_32_winetest sock hang fix)
Modified:
trunk/reactos/lib/drivers/ip/transport/tcp/accept.c
trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c
Modified: trunk/reactos/lib/drivers/ip/transport/tcp/accept.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/transport/t…
==============================================================================
--- trunk/reactos/lib/drivers/ip/transport/tcp/accept.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/transport/tcp/accept.c [iso-8859-1] Tue Jul 12 21:31:36
2011
@@ -78,25 +78,36 @@
TI_DbgPrint(DEBUG_TCP,("Connection->SocketContext %x\n",
Connection->SocketContext));
- AddressToBind.sin_family = AF_INET;
- memcpy( &AddressToBind.sin_addr,
- &Connection->AddressFile->Address.Address.IPv4Address,
- sizeof(AddressToBind.sin_addr) );
- AddressToBind.sin_port = Connection->AddressFile->Port;
+ if (Connection->AddressFile->Port)
+ {
+ AddressToBind.sin_family = AF_INET;
+ memcpy( &AddressToBind.sin_addr,
+ &Connection->AddressFile->Address.Address.IPv4Address,
+ sizeof(AddressToBind.sin_addr) );
+ AddressToBind.sin_port = Connection->AddressFile->Port;
+ TI_DbgPrint(DEBUG_TCP,("AddressToBind - %x:%x\n",
AddressToBind.sin_addr, AddressToBind.sin_port));
- TI_DbgPrint(DEBUG_TCP,("AddressToBind - %x:%x\n", AddressToBind.sin_addr,
AddressToBind.sin_port));
+ /* Perform an explicit bind */
+ Status = TCPTranslateError(OskitTCPBind(Connection->SocketContext,
+ &AddressToBind,
+ sizeof(AddressToBind)));
+ }
+ else
+ {
+ /* An implicit bind will be performed */
+ Status = STATUS_SUCCESS;
+ }
- Status = TCPTranslateError( OskitTCPBind( Connection->SocketContext,
- &AddressToBind,
- sizeof(AddressToBind) ) );
+ if (NT_SUCCESS(Status))
+ Status = TCPTranslateError( OskitTCPListen( Connection->SocketContext, Backlog
) );
+
if (NT_SUCCESS(Status))
{
/* Check if we had an unspecified port */
if (!Connection->AddressFile->Port)
{
/* We did, so we need to copy back the port */
- Status = TCPGetSockAddress(Connection, (PTRANSPORT_ADDRESS)&LocalAddress,
FALSE);
- if (NT_SUCCESS(Status))
+ if (NT_SUCCESS(TCPGetSockAddress(Connection,
(PTRANSPORT_ADDRESS)&LocalAddress, FALSE)))
{
/* Allocate the port in the port bitmap */
Connection->AddressFile->Port =
TCPAllocatePort(LocalAddress.Address[0].Address[0].sin_port);
@@ -106,9 +117,6 @@
}
}
}
-
- if (NT_SUCCESS(Status))
- Status = TCPTranslateError( OskitTCPListen( Connection->SocketContext, Backlog
) );
UnlockObject(Connection, OldIrql);
Modified: trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/transport/t…
==============================================================================
--- trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c [iso-8859-1] Tue Jul 12 21:31:36
2011
@@ -723,7 +723,7 @@
USHORT RemotePort;
TA_IP_ADDRESS LocalAddress;
PTDI_BUCKET Bucket;
- PNEIGHBOR_CACHE_ENTRY NCE;
+ PNEIGHBOR_CACHE_ENTRY NCE = NULL;
KIRQL OldIrql;
TI_DbgPrint(DEBUG_TCP,("TCPConnect: Called\n"));
@@ -762,37 +762,36 @@
UnlockObject(Connection, OldIrql);
return STATUS_NETWORK_UNREACHABLE;
}
-
- AddressToBind.sin_addr.s_addr =
NCE->Interface->Unicast.Address.IPv4Address;
+ }
+
+ if (Connection->AddressFile->Port)
+ {
+ /* See if we had an unspecified bind address */
+ if (NCE)
+ {
+ /* We did, so use the interface unicast address associated with the route */
+ AddressToBind.sin_addr.s_addr =
NCE->Interface->Unicast.Address.IPv4Address;
+ }
+ else
+ {
+ /* Bind address was explicit so use it */
+ AddressToBind.sin_addr.s_addr =
Connection->AddressFile->Address.Address.IPv4Address;
+ }
+
+ AddressToBind.sin_port = Connection->AddressFile->Port;
+
+ /* Perform an explicit bind */
+ Status = TCPTranslateError(OskitTCPBind(Connection->SocketContext,
+ &AddressToBind,
+ sizeof(AddressToBind)));
}
else
{
- AddressToBind.sin_addr.s_addr =
Connection->AddressFile->Address.Address.IPv4Address;
- }
-
- AddressToBind.sin_port = Connection->AddressFile->Port;
-
- Status = TCPTranslateError
- ( OskitTCPBind( Connection->SocketContext,
- &AddressToBind,
- sizeof(AddressToBind) ) );
-
- if (NT_SUCCESS(Status)) {
- /* Check if we had an unspecified port */
- if (!Connection->AddressFile->Port)
- {
- /* We did, so we need to copy back the port */
- Status = TCPGetSockAddress(Connection, (PTRANSPORT_ADDRESS)&LocalAddress,
FALSE);
- if (NT_SUCCESS(Status))
- {
- /* Allocate the port in the port bitmap */
- Connection->AddressFile->Port =
TCPAllocatePort(LocalAddress.Address[0].Address[0].sin_port);
-
- /* This should never fail */
- ASSERT(Connection->AddressFile->Port != 0xFFFF);
- }
- }
-
+ /* An implicit bind will be performed */
+ Status = STATUS_SUCCESS;
+ }
+
+ if (NT_SUCCESS(Status)) {
if (NT_SUCCESS(Status))
{
memcpy( &AddressToConnect.sin_addr,
@@ -804,7 +803,31 @@
( OskitTCPConnect( Connection->SocketContext,
&AddressToConnect,
sizeof(AddressToConnect) ) );
-
+
+ if (NT_SUCCESS(Status))
+ {
+ /* Check if we had an unspecified port */
+ if (!Connection->AddressFile->Port)
+ {
+ /* We did, so we need to copy back the port */
+ if (NT_SUCCESS(TCPGetSockAddress(Connection,
(PTRANSPORT_ADDRESS)&LocalAddress, FALSE)))
+ {
+ /* Allocate the port in the port bitmap */
+ Connection->AddressFile->Port =
TCPAllocatePort(LocalAddress.Address[0].Address[0].sin_port);
+
+ /* This should never fail */
+ ASSERT(Connection->AddressFile->Port != 0xFFFF);
+ }
+ }
+
+ /* Check if the address was unspecified */
+ if (AddrIsUnspecified(&Connection->AddressFile->Address))
+ {
+ /* It is, so store the address of the outgoing NIC */
+ Connection->AddressFile->Address =
NCE->Interface->Unicast;
+ }
+ }
+
if (Status == STATUS_PENDING)
{
Bucket = ExAllocatePoolWithTag( NonPagedPool, sizeof(*Bucket),
TDI_BUCKET_TAG );