Author: cgutman Date: Fri Oct 24 04:09:00 2008 New Revision: 36922
URL: http://svn.reactos.org/svn/reactos?rev=36922&view=rev Log: - Merge aicom-network-fixes up to r36921
Modified: trunk/reactos/drivers/network/afd/afd/connect.c trunk/reactos/drivers/network/afd/afd/listen.c trunk/reactos/drivers/network/afd/afd/read.c trunk/reactos/drivers/network/afd/afd/write.c trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c trunk/reactos/drivers/network/tcpip/tcpip/main.c trunk/reactos/lib/drivers/ip/network/arp.c trunk/reactos/lib/drivers/ip/transport/datagram/datagram.c
Modified: trunk/reactos/drivers/network/afd/afd/connect.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/con... ============================================================================== --- trunk/reactos/drivers/network/afd/afd/connect.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/afd/connect.c [iso-8859-1] Fri Oct 24 04:09:00 2008 @@ -77,11 +77,6 @@ AFD_DbgPrint(MID_TRACE,("Called: FCB %x, FO %x\n", Context, FCB->FileObject));
- if( Irp->Cancel ) { - if( FCB ) FCB->ConnectIrp.InFlightRequest = NULL; - return STATUS_CANCELLED; - } - /* I was wrong about this before as we can have pending writes to a not * yet connected socket */ if( !SocketAcquireStateLock( FCB ) ) return STATUS_FILE_CLOSED; @@ -90,6 +85,11 @@ Irp->IoStatus.Status));
FCB->ConnectIrp.InFlightRequest = NULL; + + if( Irp->Cancel ) { + SocketStateUnlock( FCB ); + return STATUS_CANCELLED; + }
if( NT_SUCCESS(Irp->IoStatus.Status) ) { FCB->PollState |= AFD_EVENT_CONNECT | AFD_EVENT_SEND;
Modified: trunk/reactos/drivers/network/afd/afd/listen.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/lis... ============================================================================== --- trunk/reactos/drivers/network/afd/afd/listen.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/afd/listen.c [iso-8859-1] Fri Oct 24 04:09:00 2008 @@ -102,14 +102,14 @@ PAFD_FCB FCB = (PAFD_FCB)Context; PAFD_TDI_OBJECT_QELT Qelt;
+ if( !SocketAcquireStateLock( FCB ) ) return STATUS_FILE_CLOSED; + + FCB->ListenIrp.InFlightRequest = NULL; + if( Irp->Cancel ) { - if( FCB ) FCB->ListenIrp.InFlightRequest = NULL; + SocketStateUnlock( FCB ); return STATUS_CANCELLED; } - - if( !SocketAcquireStateLock( FCB ) ) return STATUS_FILE_CLOSED; - - FCB->ListenIrp.InFlightRequest = NULL;
if( FCB->State == SOCKET_STATE_CLOSED ) { SocketStateUnlock( FCB );
Modified: trunk/reactos/drivers/network/afd/afd/read.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/rea... ============================================================================== --- trunk/reactos/drivers/network/afd/afd/read.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/afd/read.c [iso-8859-1] Fri Oct 24 04:09:00 2008 @@ -234,14 +234,15 @@
ASSERT_IRQL(APC_LEVEL);
+ if( !SocketAcquireStateLock( FCB ) ) return Status; + + FCB->ReceiveIrp.InFlightRequest = NULL; + if( Irp->Cancel ) { - if( FCB ) FCB->ReceiveIrp.InFlightRequest = NULL; + SocketStateUnlock( FCB ); return STATUS_CANCELLED; }
- if( !SocketAcquireStateLock( FCB ) ) return Status; - - FCB->ReceiveIrp.InFlightRequest = NULL; FCB->Recv.Content = Irp->IoStatus.Information; FCB->Recv.BytesUsed = 0;
@@ -455,14 +456,14 @@
AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB));
+ if( !SocketAcquireStateLock( FCB ) ) return STATUS_FILE_CLOSED; + + FCB->ReceiveIrp.InFlightRequest = NULL; + if( Irp->Cancel ) { - if( FCB ) FCB->ReceiveIrp.InFlightRequest = NULL; + SocketStateUnlock( FCB ); return STATUS_CANCELLED; } - - if( !SocketAcquireStateLock( FCB ) ) return STATUS_FILE_CLOSED; - - FCB->ReceiveIrp.InFlightRequest = NULL;
if( FCB->State == SOCKET_STATE_CLOSED ) { SocketStateUnlock( FCB );
Modified: trunk/reactos/drivers/network/afd/afd/write.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/wri... ============================================================================== --- trunk/reactos/drivers/network/afd/afd/write.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/afd/write.c [iso-8859-1] Fri Oct 24 04:09:00 2008 @@ -40,15 +40,15 @@
ASSERT_IRQL(APC_LEVEL);
- if( Irp->Cancel ) { - if( FCB ) FCB->SendIrp.InFlightRequest = NULL; - return STATUS_CANCELLED; - } - if( !SocketAcquireStateLock( FCB ) ) return Status;
FCB->SendIrp.InFlightRequest = NULL; /* Request is not in flight any longer */ + + if( Irp->Cancel ) { + SocketStateUnlock( FCB ); + return STATUS_CANCELLED; + }
if( FCB->State == SOCKET_STATE_CLOSED ) { SocketStateUnlock( FCB ); @@ -176,19 +176,19 @@ Irp->IoStatus.Status, Irp->IoStatus.Information));
- if( Irp->Cancel ) { - if( FCB ) FCB->SendIrp.InFlightRequest = NULL; - return STATUS_CANCELLED; - } - /* It's ok if the FCB already died */ if( !SocketAcquireStateLock( FCB ) ) return STATUS_SUCCESS;
+ FCB->SendIrp.InFlightRequest = NULL; + /* Request is not in flight any longer */ + + if( Irp->Cancel ) { + SocketStateUnlock( FCB ); + return STATUS_CANCELLED; + } + FCB->PollState |= AFD_EVENT_SEND; PollReeval( FCB->DeviceExt, FCB->FileObject ); - - FCB->SendIrp.InFlightRequest = NULL; - /* Request is not in flight any longer */
if( FCB->State == SOCKET_STATE_CLOSED ) { SocketStateUnlock( FCB );
Modified: trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/tcpip... ============================================================================== --- trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c [iso-8859-1] Fri Oct 24 04:09:00 2008 @@ -485,18 +485,22 @@ IrpSp = IoGetCurrentIrpStackLocation(Irp); DisReq = (PTDI_REQUEST_KERNEL_DISCONNECT)&IrpSp->Parameters;
+ TcpipRecursiveMutexEnter( &TCPLock, TRUE ); + /* Get associated connection endpoint file object. Quit if none exists */
TranContext = IrpSp->FileObject->FsContext; if (!TranContext) { TI_DbgPrint(MID_TRACE, ("Bad transport context.\n")); - return STATUS_INVALID_CONNECTION; + Status = STATUS_INVALID_CONNECTION; + goto done; }
Connection = (PCONNECTION_ENDPOINT)TranContext->Handle.ConnectionContext; if (!Connection) { TI_DbgPrint(MID_TRACE, ("No connection endpoint file object.\n")); - return STATUS_INVALID_CONNECTION; + Status = STATUS_INVALID_CONNECTION; + goto done; }
Status = TCPDisconnect( @@ -507,7 +511,15 @@ DispDataRequestComplete, Irp );
- TI_DbgPrint(MAX_TRACE, ("TCP Connect returned %08x\n", Status)); +done: + if (Status != STATUS_PENDING) { + DispDataRequestComplete(Irp, Status, 0); + } else + IoMarkIrpPending(Irp); + + TcpipRecursiveMutexLeave( &TCPLock ); + + TI_DbgPrint(MAX_TRACE, ("TCP Disconnect returned %08x\n", Status));
return Status; } @@ -1490,7 +1502,7 @@
TI_DbgPrint(DEBUG_IRP, ("Completing IRP at (0x%X).\n", Irp));
- return IRPFinish(Irp, STATUS_INVALID_PARAMETER); + return Irp->IoStatus.Status; }
Status = DispPrepareIrpForCancel(TranContext, Irp, NULL);
Modified: trunk/reactos/drivers/network/tcpip/tcpip/main.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/tcpip... ============================================================================== --- trunk/reactos/drivers/network/tcpip/tcpip/main.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/tcpip/tcpip/main.c [iso-8859-1] Fri Oct 24 04:09:00 2008 @@ -437,6 +437,7 @@
case TDI_DISCONNECT: Status = DispTdiDisconnect(Irp); + Complete = FALSE; break;
case TDI_ASSOCIATE_ADDRESS:
Modified: trunk/reactos/lib/drivers/ip/network/arp.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/network/arp.... ============================================================================== --- trunk/reactos/lib/drivers/ip/network/arp.c [iso-8859-1] (original) +++ trunk/reactos/lib/drivers/ip/network/arp.c [iso-8859-1] Fri Oct 24 04:09:00 2008 @@ -230,7 +230,7 @@ Header->HWAddrLen, NUD_REACHABLE); }
- if (Header->Opcode != ARP_OPCODE_REQUEST) + if (Header->Opcode != ARP_OPCODE_REQUEST || !NCE) return;
/* This is a request for our address. Swap the addresses and
Modified: trunk/reactos/lib/drivers/ip/transport/datagram/datagram.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/transport/da... ============================================================================== --- trunk/reactos/lib/drivers/ip/transport/datagram/datagram.c [iso-8859-1] (original) +++ trunk/reactos/lib/drivers/ip/transport/datagram/datagram.c [iso-8859-1] Fri Oct 24 04:09:00 2008 @@ -254,6 +254,9 @@ { ReceiveRequest->RemotePort = 0; } + + IoMarkIrpPending(Irp); + ReceiveRequest->ReturnInfo = ReturnInfo; ReceiveRequest->Buffer = BufferData; ReceiveRequest->BufferSize = ReceiveLength;