mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 08:25:03 +00:00
[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
This commit is contained in:
parent
0e8f87ff82
commit
54f9acbf0d
3 changed files with 84 additions and 17 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue