- Merge aicom-network-fixes up to r36921

svn path=/trunk/; revision=36922
This commit is contained in:
Cameron Gutman 2008-10-24 09:09:00 +00:00
parent 2f626cf5fe
commit 497d2b42a7
8 changed files with 55 additions and 38 deletions

View file

@ -77,11 +77,6 @@ static NTSTATUS NTAPI StreamSocketConnectComplete
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;
@ -91,6 +86,11 @@ static NTSTATUS NTAPI StreamSocketConnectComplete
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;
AFD_DbgPrint(MID_TRACE,("Going to connected state %d\n", FCB->State));

View file

@ -102,15 +102,15 @@ static NTSTATUS NTAPI ListenComplete
PAFD_FCB FCB = (PAFD_FCB)Context;
PAFD_TDI_OBJECT_QELT Qelt;
if( Irp->Cancel ) {
if( FCB ) FCB->ListenIrp.InFlightRequest = NULL;
return STATUS_CANCELLED;
}
if( !SocketAcquireStateLock( FCB ) ) return STATUS_FILE_CLOSED;
FCB->ListenIrp.InFlightRequest = NULL;
if( Irp->Cancel ) {
SocketStateUnlock( FCB );
return STATUS_CANCELLED;
}
if( FCB->State == SOCKET_STATE_CLOSED ) {
SocketStateUnlock( FCB );
DestroySocket( FCB );

View file

@ -234,14 +234,15 @@ NTSTATUS NTAPI ReceiveComplete
ASSERT_IRQL(APC_LEVEL);
if( Irp->Cancel ) {
if( FCB ) FCB->ReceiveIrp.InFlightRequest = NULL;
return STATUS_CANCELLED;
}
if( !SocketAcquireStateLock( FCB ) ) return Status;
FCB->ReceiveIrp.InFlightRequest = NULL;
if( Irp->Cancel ) {
SocketStateUnlock( FCB );
return STATUS_CANCELLED;
}
FCB->Recv.Content = Irp->IoStatus.Information;
FCB->Recv.BytesUsed = 0;
@ -455,15 +456,15 @@ PacketSocketRecvComplete(
AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB));
if( Irp->Cancel ) {
if( FCB ) FCB->ReceiveIrp.InFlightRequest = NULL;
return STATUS_CANCELLED;
}
if( !SocketAcquireStateLock( FCB ) ) return STATUS_FILE_CLOSED;
FCB->ReceiveIrp.InFlightRequest = NULL;
if( Irp->Cancel ) {
SocketStateUnlock( FCB );
return STATUS_CANCELLED;
}
if( FCB->State == SOCKET_STATE_CLOSED ) {
SocketStateUnlock( FCB );
DestroySocket( FCB );

View file

@ -40,16 +40,16 @@ static NTSTATUS NTAPI SendComplete
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 );
DestroySocket( FCB );
@ -176,20 +176,20 @@ static NTSTATUS NTAPI PacketSocketSendComplete
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->PollState |= AFD_EVENT_SEND;
PollReeval( FCB->DeviceExt, FCB->FileObject );
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 );
if( FCB->State == SOCKET_STATE_CLOSED ) {
SocketStateUnlock( FCB );
DestroySocket( FCB );

View file

@ -485,18 +485,22 @@ NTSTATUS DispTdiDisconnect(
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 @@ NTSTATUS DispTdiDisconnect(
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 @@ NTSTATUS DispTdiSetInformationEx(
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);

View file

@ -437,6 +437,7 @@ TiDispatchInternal(
case TDI_DISCONNECT:
Status = DispTdiDisconnect(Irp);
Complete = FALSE;
break;
case TDI_ASSOCIATE_ADDRESS:

View file

@ -230,7 +230,7 @@ VOID ARPReceive(
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

View file

@ -254,6 +254,9 @@ NTSTATUS DGReceiveDatagram(
{
ReceiveRequest->RemotePort = 0;
}
IoMarkIrpPending(Irp);
ReceiveRequest->ReturnInfo = ReturnInfo;
ReceiveRequest->Buffer = BufferData;
ReceiveRequest->BufferSize = ReceiveLength;