From 54f9acbf0df857f73fedb5622c36eec7aa53d9bf Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 4 Jul 2011 18:07:55 +0000 Subject: [PATCH] [AFD] - Add support for AFD_INFO_INLINING_MODE - Add support for setting AFD_INFO_RECEIVE_WINDOW_SIZE and AFD_INFO_SEND_WINDOW_SIZE - None of this is used by our current msafd but mswsock_new uses it svn path=/trunk/; revision=52538 --- reactos/drivers/network/afd/afd/connect.c | 39 +++++++++------ reactos/drivers/network/afd/afd/info.c | 60 +++++++++++++++++++++++ reactos/drivers/network/afd/include/afd.h | 2 +- 3 files changed, 84 insertions(+), 17 deletions(-) diff --git a/reactos/drivers/network/afd/afd/connect.c b/reactos/drivers/network/afd/afd/connect.c index 56935b7f526..38150d066e9 100644 --- a/reactos/drivers/network/afd/afd/connect.c +++ b/reactos/drivers/network/afd/afd/connect.c @@ -223,26 +223,33 @@ NTSTATUS MakeSocketIntoConnection( PAFD_FCB FCB ) { ASSERT(!FCB->Recv.Window); ASSERT(!FCB->Send.Window); - Status = TdiQueryMaxDatagramLength(FCB->Connection.Object, - &FCB->Send.Size); - if (!NT_SUCCESS(Status)) - return Status; + if (!FCB->Recv.Size) + { + Status = TdiQueryMaxDatagramLength(FCB->Connection.Object, + &FCB->Recv.Size); + if (!NT_SUCCESS(Status)) + return Status; + } - FCB->Recv.Size = FCB->Send.Size; + if (!FCB->Send.Size) + { + Status = TdiQueryMaxDatagramLength(FCB->Connection.Object, + &FCB->Send.Size); + if (!NT_SUCCESS(Status)) + return Status; + } /* Allocate the receive area and start receiving */ - FCB->Recv.Window = - ExAllocatePool( PagedPool, FCB->Recv.Size ); + if (!FCB->Recv.Window) + { + FCB->Recv.Window = ExAllocatePool( PagedPool, FCB->Recv.Size ); + if( !FCB->Recv.Window ) return STATUS_NO_MEMORY; + } - if( !FCB->Recv.Window ) return STATUS_NO_MEMORY; - - FCB->Send.Window = - ExAllocatePool( PagedPool, FCB->Send.Size ); - - if( !FCB->Send.Window ) { - ExFreePool( FCB->Recv.Window ); - FCB->Recv.Window = NULL; - return STATUS_NO_MEMORY; + if (!FCB->Send.Window) + { + FCB->Send.Window = ExAllocatePool( PagedPool, FCB->Send.Size ); + if( !FCB->Send.Window ) return STATUS_NO_MEMORY; } FCB->State = SOCKET_STATE_CONNECTED; diff --git a/reactos/drivers/network/afd/afd/info.c b/reactos/drivers/network/afd/afd/info.c index 523007a50ef..70e41a89115 100644 --- a/reactos/drivers/network/afd/afd/info.c +++ b/reactos/drivers/network/afd/afd/info.c @@ -50,6 +50,10 @@ AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, case AFD_INFO_BLOCKING_MODE: InfoReq->Information.Boolean = FCB->NonBlocking; break; + + case AFD_INFO_INLINING_MODE: + InfoReq->Information.Boolean = FCB->OobInline; + break; case AFD_INFO_RECEIVE_CONTENT_SIZE: /* Only touch InfoReq if a socket has been set up. @@ -106,6 +110,7 @@ AfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, PAFD_INFO InfoReq = LockRequest(Irp, IrpSp); PFILE_OBJECT FileObject = IrpSp->FileObject; PAFD_FCB FCB = FileObject->FsContext; + PCHAR NewBuffer; if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp); @@ -118,6 +123,61 @@ AfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, AFD_DbgPrint(MID_TRACE,("Blocking mode set to %d\n", InfoReq->Information.Boolean)); FCB->NonBlocking = InfoReq->Information.Boolean; break; + case AFD_INFO_INLINING_MODE: + FCB->OobInline = InfoReq->Information.Boolean; + break; + case AFD_INFO_RECEIVE_WINDOW_SIZE: + NewBuffer = ExAllocatePool(PagedPool, InfoReq->Information.Ulong); + if (NewBuffer) + { + if (FCB->Recv.Content > InfoReq->Information.Ulong) + FCB->Recv.Content = InfoReq->Information.Ulong; + + if (FCB->Recv.Window) + { + RtlCopyMemory(NewBuffer, + FCB->Recv.Window, + FCB->Recv.Content); + + ExFreePool(FCB->Recv.Window); + } + + FCB->Recv.Size = InfoReq->Information.Ulong; + FCB->Recv.Window = NewBuffer; + + Status = STATUS_SUCCESS; + } + else + { + Status = STATUS_NO_MEMORY; + } + break; + case AFD_INFO_SEND_WINDOW_SIZE: + NewBuffer = ExAllocatePool(PagedPool, InfoReq->Information.Ulong); + if (NewBuffer) + { + if (FCB->Send.BytesUsed > InfoReq->Information.Ulong) + FCB->Send.BytesUsed = InfoReq->Information.Ulong; + + if (FCB->Send.Window) + { + RtlCopyMemory(NewBuffer, + FCB->Send.Window, + FCB->Send.BytesUsed); + + ExFreePool(FCB->Send.Window); + } + + FCB->Send.Size = InfoReq->Information.Ulong; + FCB->Send.Window = NewBuffer; + + Status = STATUS_SUCCESS; + } + else + { + Status = STATUS_NO_MEMORY; + } + break; default: AFD_DbgPrint(MIN_TRACE,("Unknown request %d\n", InfoReq->InformationClass)); break; diff --git a/reactos/drivers/network/afd/include/afd.h b/reactos/drivers/network/afd/include/afd.h index 6fd04e9c822..aa9bcff6cea 100644 --- a/reactos/drivers/network/afd/include/afd.h +++ b/reactos/drivers/network/afd/include/afd.h @@ -173,7 +173,7 @@ typedef struct _AFD_STORED_DATAGRAM { } AFD_STORED_DATAGRAM, *PAFD_STORED_DATAGRAM; typedef struct _AFD_FCB { - BOOLEAN Locked, Critical, Overread, NonBlocking; + BOOLEAN Locked, Critical, Overread, NonBlocking, OobInline; UINT State, Flags, GroupID, GroupType; KIRQL OldIrql; UINT LockCount;