From 4c8e421fe993dcc79b9ea0db2b0dd18823d897f5 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 3 Jul 2009 00:57:47 +0000 Subject: [PATCH] - TCPIP locking rewrite (part 2 of x) - Add locking in places that need it - Eliminate double acquisition of TCPLock for the same request - Next step: Verify that all places that need locking have it svn path=/trunk/; revision=41751 --- .../drivers/network/tcpip/tcpip/dispatch.c | 19 ++++++++++- reactos/lib/drivers/ip/transport/tcp/accept.c | 4 +-- reactos/lib/drivers/ip/transport/tcp/tcp.c | 32 ------------------- 3 files changed, 20 insertions(+), 35 deletions(-) diff --git a/reactos/drivers/network/tcpip/tcpip/dispatch.c b/reactos/drivers/network/tcpip/tcpip/dispatch.c index ff4e81f9e5c..a9428b98427 100644 --- a/reactos/drivers/network/tcpip/tcpip/dispatch.c +++ b/reactos/drivers/network/tcpip/tcpip/dispatch.c @@ -646,15 +646,19 @@ NTSTATUS DispTdiQueryInformation( PTDI_REQUEST_KERNEL_QUERY_INFORMATION Parameters; PTRANSPORT_CONTEXT TranContext; PIO_STACK_LOCATION IrpSp; + NTSTATUS Status; TI_DbgPrint(DEBUG_IRP, ("Called.\n")); IrpSp = IoGetCurrentIrpStackLocation(Irp); Parameters = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)&IrpSp->Parameters; + TcpipRecursiveMutexEnter( &TCPLock, TRUE ); + TranContext = IrpSp->FileObject->FsContext; if (!TranContext) { TI_DbgPrint(MID_TRACE, ("Bad transport context.\n")); + TcpipRecursiveMutexLeave(&TCPLock); return STATUS_INVALID_PARAMETER; } @@ -672,6 +676,7 @@ NTSTATUS DispTdiQueryInformation( (FIELD_OFFSET(TDI_ADDRESS_INFO, Address.Address[0].Address) + sizeof(TDI_ADDRESS_IP))) { TI_DbgPrint(MID_TRACE, ("MDL buffer too small.\n")); + TcpipRecursiveMutexLeave(&TCPLock); return STATUS_BUFFER_TOO_SMALL; } @@ -690,6 +695,7 @@ NTSTATUS DispTdiQueryInformation( RtlZeroMemory( &Address->Address[0].Address[0].sin_zero, sizeof(Address->Address[0].Address[0].sin_zero)); + TcpipRecursiveMutexLeave(&TCPLock); return STATUS_SUCCESS; case TDI_CONNECTION_FILE: @@ -700,18 +706,22 @@ NTSTATUS DispTdiQueryInformation( RtlZeroMemory( &Address->Address[0].Address[0].sin_zero, sizeof(Address->Address[0].Address[0].sin_zero)); + TcpipRecursiveMutexLeave(&TCPLock); return STATUS_SUCCESS; default: TI_DbgPrint(MIN_TRACE, ("Invalid transport context\n")); + TcpipRecursiveMutexLeave(&TCPLock); return STATUS_INVALID_PARAMETER; } if (!AddrFile) { TI_DbgPrint(MID_TRACE, ("No address file object.\n")); + TcpipRecursiveMutexLeave(&TCPLock); return STATUS_INVALID_PARAMETER; } + TcpipRecursiveMutexLeave(&TCPLock); return STATUS_SUCCESS; } @@ -725,6 +735,7 @@ NTSTATUS DispTdiQueryInformation( (FIELD_OFFSET(TDI_CONNECTION_INFORMATION, RemoteAddress) + sizeof(PVOID))) { TI_DbgPrint(MID_TRACE, ("MDL buffer too small (ptr).\n")); + TcpipRecursiveMutexLeave(&TCPLock); return STATUS_BUFFER_TOO_SMALL; } @@ -743,18 +754,24 @@ NTSTATUS DispTdiQueryInformation( default: TI_DbgPrint(MIN_TRACE, ("Invalid transport context\n")); + TcpipRecursiveMutexLeave(&TCPLock); return STATUS_INVALID_PARAMETER; } if (!Endpoint) { TI_DbgPrint(MID_TRACE, ("No connection object.\n")); + TcpipRecursiveMutexLeave(&TCPLock); return STATUS_INVALID_PARAMETER; } - return TCPGetSockAddress( Endpoint, AddressInfo->RemoteAddress, TRUE ); + Status = TCPGetSockAddress( Endpoint, AddressInfo->RemoteAddress, TRUE ); + + TcpipRecursiveMutexLeave(&TCPLock); + return Status; } } + TcpipRecursiveMutexLeave(&TCPLock); return STATUS_NOT_IMPLEMENTED; } diff --git a/reactos/lib/drivers/ip/transport/tcp/accept.c b/reactos/lib/drivers/ip/transport/tcp/accept.c index ba0f99c48d1..6a4b0712703 100644 --- a/reactos/lib/drivers/ip/transport/tcp/accept.c +++ b/reactos/lib/drivers/ip/transport/tcp/accept.c @@ -142,6 +142,8 @@ NTSTATUS TCPAccept ( PTDI_REQUEST Request, Status = TCPServiceListeningSocket( Listener, Connection, (PTDI_REQUEST_KERNEL)Request ); + TcpipRecursiveMutexLeave( &TCPLock ); + if( Status == STATUS_PENDING ) { Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) ); @@ -155,8 +157,6 @@ NTSTATUS TCPAccept ( PTDI_REQUEST Request, Status = STATUS_NO_MEMORY; } - TcpipRecursiveMutexLeave( &TCPLock ); - TI_DbgPrint(DEBUG_TCP,("TCPAccept finished %x\n", Status)); return Status; } diff --git a/reactos/lib/drivers/ip/transport/tcp/tcp.c b/reactos/lib/drivers/ip/transport/tcp/tcp.c index faf32586c3f..876db93e5b8 100644 --- a/reactos/lib/drivers/ip/transport/tcp/tcp.c +++ b/reactos/lib/drivers/ip/transport/tcp/tcp.c @@ -332,7 +332,6 @@ NTSTATUS TCPSocket( PCONNECTION_ENDPOINT Connection, "Proto %d\n", Connection, Family, Type, Proto)); - TcpipRecursiveMutexEnter( &TCPLock, TRUE ); Status = TCPTranslateError( OskitTCPSocket( Connection, &Connection->SocketContext, Family, @@ -344,8 +343,6 @@ NTSTATUS TCPSocket( PCONNECTION_ENDPOINT Connection, TI_DbgPrint(DEBUG_TCP,("Connection->SocketContext %x\n", Connection->SocketContext)); - TcpipRecursiveMutexLeave( &TCPLock ); - return Status; } @@ -599,11 +596,8 @@ NTSTATUS TCPConnect return STATUS_NETWORK_UNREACHABLE; } - TcpipRecursiveMutexEnter( &TCPLock, TRUE ); - if (Connection->State & SEL_FIN) { - TcpipRecursiveMutexLeave( &TCPLock ); return STATUS_REMOTE_DISCONNECT; } @@ -649,8 +643,6 @@ NTSTATUS TCPConnect } } - TcpipRecursiveMutexLeave( &TCPLock ); - return Status; } @@ -665,8 +657,6 @@ NTSTATUS TCPDisconnect TI_DbgPrint(DEBUG_TCP,("started\n")); - TcpipRecursiveMutexEnter( &TCPLock, TRUE ); - switch( Flags & (TDI_DISCONNECT_ABORT | TDI_DISCONNECT_RELEASE) ) { case 0: case TDI_DISCONNECT_ABORT: @@ -685,8 +675,6 @@ NTSTATUS TCPDisconnect Status = TCPTranslateError ( OskitTCPShutdown( Connection->SocketContext, Flags ) ); - TcpipRecursiveMutexLeave( &TCPLock ); - TI_DbgPrint(DEBUG_TCP,("finished %x\n", Status)); return Status; @@ -698,16 +686,12 @@ NTSTATUS TCPClose TI_DbgPrint(DEBUG_TCP,("TCPClose started\n")); - TcpipRecursiveMutexEnter( &TCPLock, TRUE ); - /* Make our code remove all pending IRPs */ Connection->State |= SEL_FIN; DrainSignals(); Status = TCPTranslateError( OskitTCPClose( Connection->SocketContext ) ); - TcpipRecursiveMutexLeave( &TCPLock ); - TI_DbgPrint(DEBUG_TCP,("TCPClose finished %x\n", Status)); return Status; @@ -731,12 +715,9 @@ NTSTATUS TCPReceiveData ASSERT_KM_POINTER(Connection->SocketContext); - TcpipRecursiveMutexEnter( &TCPLock, TRUE ); - /* Closing */ if (Connection->State & SEL_FIN) { - TcpipRecursiveMutexLeave( &TCPLock ); *BytesReceived = 0; return STATUS_REMOTE_DISCONNECT; } @@ -761,7 +742,6 @@ NTSTATUS TCPReceiveData Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) ); if( !Bucket ) { TI_DbgPrint(DEBUG_TCP,("Failed to allocate bucket\n")); - TcpipRecursiveMutexLeave( &TCPLock ); return STATUS_NO_MEMORY; } @@ -778,8 +758,6 @@ NTSTATUS TCPReceiveData *BytesReceived = Received; } - TcpipRecursiveMutexLeave( &TCPLock ); - TI_DbgPrint(DEBUG_TCP,("Status %x\n", Status)); return Status; @@ -802,8 +780,6 @@ NTSTATUS TCPSendData ASSERT_KM_POINTER(Connection->SocketContext); - TcpipRecursiveMutexEnter( &TCPLock, TRUE ); - TI_DbgPrint(DEBUG_TCP,("Connection = %x\n", Connection)); TI_DbgPrint(DEBUG_TCP,("Connection->SocketContext = %x\n", Connection->SocketContext)); @@ -811,7 +787,6 @@ NTSTATUS TCPSendData /* Closing */ if (Connection->State & SEL_FIN) { - TcpipRecursiveMutexLeave( &TCPLock ); *BytesSent = 0; return STATUS_REMOTE_DISCONNECT; } @@ -829,7 +804,6 @@ NTSTATUS TCPSendData Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) ); if( !Bucket ) { TI_DbgPrint(DEBUG_TCP,("Failed to allocate bucket\n")); - TcpipRecursiveMutexLeave( &TCPLock ); return STATUS_NO_MEMORY; } @@ -846,8 +820,6 @@ NTSTATUS TCPSendData *BytesSent = Sent; } - TcpipRecursiveMutexLeave( &TCPLock ); - TI_DbgPrint(DEBUG_TCP,("Status %x\n", Status)); return Status; @@ -880,8 +852,6 @@ NTSTATUS TCPGetSockAddress OSK_UI16 LocalPort, RemotePort; PTA_IP_ADDRESS AddressIP = (PTA_IP_ADDRESS)Address; - TcpipRecursiveMutexEnter( &TCPLock, TRUE ); - OskitTCPGetAddress ( Connection->SocketContext, &LocalAddress, &LocalPort, @@ -893,8 +863,6 @@ NTSTATUS TCPGetSockAddress AddressIP->Address[0].Address[0].sin_port = GetRemote ? RemotePort : LocalPort; AddressIP->Address[0].Address[0].in_addr = GetRemote ? RemoteAddress : LocalAddress; - TcpipRecursiveMutexLeave( &TCPLock ); - return STATUS_SUCCESS; }