mirror of
https://github.com/reactos/reactos.git
synced 2024-06-30 18:01:07 +00:00
Preliminary version of recv.
svn path=/trunk/; revision=9666
This commit is contained in:
parent
f773e32aab
commit
0999a0ef81
|
@ -13,8 +13,8 @@
|
||||||
#ifdef DBG
|
#ifdef DBG
|
||||||
|
|
||||||
/* See debug.h for debug/trace constants */
|
/* See debug.h for debug/trace constants */
|
||||||
DWORD DebugTraceLevel = MID_TRACE;
|
//DWORD DebugTraceLevel = MID_TRACE;
|
||||||
//DWORD DebugTraceLevel = DEBUG_ULTRA;
|
DWORD DebugTraceLevel = DEBUG_ULTRA;
|
||||||
|
|
||||||
#endif /* DBG */
|
#endif /* DBG */
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,8 @@ NTSTATUS AfdpDispRecv(
|
||||||
PIRP Irp,
|
PIRP Irp,
|
||||||
PAFDFCB FCB,
|
PAFDFCB FCB,
|
||||||
PFILE_REQUEST_RECVFROM Request,
|
PFILE_REQUEST_RECVFROM Request,
|
||||||
PFILE_REPLY_RECVFROM Reply)
|
PFILE_REPLY_RECVFROM Reply,
|
||||||
|
BOOL Continuous)
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Receives data
|
* FUNCTION: Receives data
|
||||||
* ARGUMENTS:
|
* ARGUMENTS:
|
||||||
|
@ -64,7 +65,8 @@ NTSTATUS AfdpDispRecv(
|
||||||
FCB,
|
FCB,
|
||||||
Request->Buffers,
|
Request->Buffers,
|
||||||
Request->BufferCount,
|
Request->BufferCount,
|
||||||
&Count);
|
&Count,
|
||||||
|
Continuous); /* I.E. Packets are exhausted on short recv if not */
|
||||||
KeReleaseSpinLock(&FCB->ReceiveQueueLock, OldIrql);
|
KeReleaseSpinLock(&FCB->ReceiveQueueLock, OldIrql);
|
||||||
|
|
||||||
Reply->NumberOfBytesRecvd = Count;
|
Reply->NumberOfBytesRecvd = Count;
|
||||||
|
@ -490,7 +492,8 @@ NTSTATUS AfdDispRecvFrom(
|
||||||
Irp,
|
Irp,
|
||||||
FCB,
|
FCB,
|
||||||
Request,
|
Request,
|
||||||
Reply);
|
Reply,
|
||||||
|
FALSE);
|
||||||
} else {
|
} else {
|
||||||
Status = STATUS_INVALID_PARAMETER;
|
Status = STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
@ -761,7 +764,6 @@ NTSTATUS AfdDispRecv(
|
||||||
* Status of operation
|
* Status of operation
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
UINT InputBufferLength;
|
UINT InputBufferLength;
|
||||||
UINT OutputBufferLength;
|
UINT OutputBufferLength;
|
||||||
|
@ -786,9 +788,9 @@ NTSTATUS AfdDispRecv(
|
||||||
Status = AfdpDispRecv(
|
Status = AfdpDispRecv(
|
||||||
Irp,
|
Irp,
|
||||||
FCB,
|
FCB,
|
||||||
Request->Buffers,
|
(PFILE_REQUEST_RECVFROM)Request,
|
||||||
Request->BufferCount,
|
(PFILE_REPLY_RECVFROM)Reply,
|
||||||
&NumberOfBytesRecvd);
|
TRUE);
|
||||||
Reply->NumberOfBytesRecvd = NumberOfBytesRecvd;
|
Reply->NumberOfBytesRecvd = NumberOfBytesRecvd;
|
||||||
Reply->Status = NO_ERROR;
|
Reply->Status = NO_ERROR;
|
||||||
} else {
|
} else {
|
||||||
|
@ -798,9 +800,6 @@ NTSTATUS AfdDispRecv(
|
||||||
AFD_DbgPrint(MAX_TRACE, ("Status (0x%X).\n", Status));
|
AFD_DbgPrint(MAX_TRACE, ("Status (0x%X).\n", Status));
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
#else
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -44,8 +44,76 @@ NTSTATUS AfdEventReceive(
|
||||||
IN PVOID Tsdu,
|
IN PVOID Tsdu,
|
||||||
OUT PIRP *IoRequestPacket)
|
OUT PIRP *IoRequestPacket)
|
||||||
{
|
{
|
||||||
|
PAFDFCB FCB = (PAFDFCB)TdiEventContext;
|
||||||
|
PAFD_READ_REQUEST ReadRequest;
|
||||||
|
PVOID ReceiveBuffer;
|
||||||
|
PAFD_BUFFER Buffer;
|
||||||
|
PLIST_ENTRY Entry;
|
||||||
|
NTSTATUS Status;
|
||||||
|
KIRQL OldIrql;
|
||||||
|
ULONG Count;
|
||||||
|
|
||||||
AFD_DbgPrint(MAX_TRACE, ("Called.\n"));
|
AFD_DbgPrint(MAX_TRACE, ("Called.\n"));
|
||||||
|
|
||||||
|
AFD_DbgPrint(MID_TRACE, ("Receiving (%d) bytes on socket\n",
|
||||||
|
BytesAvailable));
|
||||||
|
|
||||||
|
ReceiveBuffer = ExAllocatePool(NonPagedPool, BytesAvailable);
|
||||||
|
if (!ReceiveBuffer)
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
|
/*Buffer = (PAFD_BUFFER)ExAllocateFromNPagedLookasideList(
|
||||||
|
&BufferLookasideList);*/
|
||||||
|
Buffer = (PAFD_BUFFER)ExAllocatePool(NonPagedPool, sizeof(AFD_BUFFER));
|
||||||
|
if (!Buffer) {
|
||||||
|
ExFreePool(ReceiveBuffer);
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy the data to a local buffer */
|
||||||
|
RtlCopyMemory(ReceiveBuffer, Tsdu, BytesAvailable);
|
||||||
|
|
||||||
|
Buffer->Buffer.len = BytesAvailable;
|
||||||
|
Buffer->Buffer.buf = ReceiveBuffer;
|
||||||
|
Buffer->Offset = 0;
|
||||||
|
|
||||||
|
ExInterlockedInsertTailList(
|
||||||
|
&FCB->ReceiveQueue,
|
||||||
|
&Buffer->ListEntry,
|
||||||
|
&FCB->ReceiveQueueLock);
|
||||||
|
|
||||||
|
KeAcquireSpinLock(&FCB->ReadRequestQueueLock, &OldIrql);
|
||||||
|
|
||||||
|
while (!IsListEmpty(&FCB->ReadRequestQueue) &&
|
||||||
|
!IsListEmpty(&FCB->ReceiveQueue)) {
|
||||||
|
AFD_DbgPrint(MAX_TRACE, ("Satisfying read request.\n"));
|
||||||
|
|
||||||
|
Entry = RemoveHeadList(&FCB->ReceiveQueue);
|
||||||
|
ReadRequest = CONTAINING_RECORD(Entry, AFD_READ_REQUEST, ListEntry);
|
||||||
|
|
||||||
|
Status = FillWSABuffers(
|
||||||
|
FCB,
|
||||||
|
ReadRequest->RecvFromRequest->Buffers,
|
||||||
|
ReadRequest->RecvFromRequest->BufferCount,
|
||||||
|
&Count,
|
||||||
|
TRUE ); /* Continuous */
|
||||||
|
ReadRequest->RecvFromReply->NumberOfBytesRecvd = Count;
|
||||||
|
ReadRequest->RecvFromReply->Status = NO_ERROR;
|
||||||
|
|
||||||
|
ReadRequest->Irp->IoStatus.Information = 0;
|
||||||
|
ReadRequest->Irp->IoStatus.Status = Status;
|
||||||
|
|
||||||
|
AFD_DbgPrint(MAX_TRACE, ("Completing IRP at (0x%X).\n", ReadRequest->Irp));
|
||||||
|
|
||||||
|
IoCompleteRequest(ReadRequest->Irp, IO_NETWORK_INCREMENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
KeReleaseSpinLock(&FCB->ReadRequestQueueLock, OldIrql);
|
||||||
|
|
||||||
|
*BytesTaken = BytesAvailable;
|
||||||
|
|
||||||
|
AFD_DbgPrint(MAX_TRACE, ("Leaving.\n"));
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,6 +193,7 @@ NTSTATUS AfdEventReceiveDatagramHandler(
|
||||||
|
|
||||||
Buffer->Buffer.len = BytesAvailable;
|
Buffer->Buffer.len = BytesAvailable;
|
||||||
Buffer->Buffer.buf = ReceiveBuffer;
|
Buffer->Buffer.buf = ReceiveBuffer;
|
||||||
|
Buffer->Offset = 0;
|
||||||
|
|
||||||
ExInterlockedInsertTailList(
|
ExInterlockedInsertTailList(
|
||||||
&FCB->ReceiveQueue,
|
&FCB->ReceiveQueue,
|
||||||
|
@ -143,7 +212,8 @@ NTSTATUS AfdEventReceiveDatagramHandler(
|
||||||
FCB,
|
FCB,
|
||||||
ReadRequest->RecvFromRequest->Buffers,
|
ReadRequest->RecvFromRequest->Buffers,
|
||||||
ReadRequest->RecvFromRequest->BufferCount,
|
ReadRequest->RecvFromRequest->BufferCount,
|
||||||
&Count);
|
&Count,
|
||||||
|
FALSE ); /* Packet oriented */
|
||||||
ReadRequest->RecvFromReply->NumberOfBytesRecvd = Count;
|
ReadRequest->RecvFromReply->NumberOfBytesRecvd = Count;
|
||||||
ReadRequest->RecvFromReply->Status = NO_ERROR;
|
ReadRequest->RecvFromReply->Status = NO_ERROR;
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,8 @@ NTSTATUS FillWSABuffers(
|
||||||
PAFDFCB FCB,
|
PAFDFCB FCB,
|
||||||
LPWSABUF Buffers,
|
LPWSABUF Buffers,
|
||||||
DWORD BufferCount,
|
DWORD BufferCount,
|
||||||
PULONG BytesCopied)
|
PULONG BytesCopied,
|
||||||
|
BOOL Continuous)
|
||||||
{
|
{
|
||||||
PUCHAR DstData, SrcData;
|
PUCHAR DstData, SrcData;
|
||||||
UINT DstSize, SrcSize;
|
UINT DstSize, SrcSize;
|
||||||
|
@ -108,8 +109,8 @@ NTSTATUS FillWSABuffers(
|
||||||
|
|
||||||
Entry = RemoveHeadList(&FCB->ReceiveQueue);
|
Entry = RemoveHeadList(&FCB->ReceiveQueue);
|
||||||
SrcBuffer = CONTAINING_RECORD(Entry, AFD_BUFFER, ListEntry);
|
SrcBuffer = CONTAINING_RECORD(Entry, AFD_BUFFER, ListEntry);
|
||||||
SrcData = SrcBuffer->Buffer.buf;
|
SrcData = SrcBuffer->Buffer.buf + SrcBuffer->Offset;
|
||||||
SrcSize = SrcBuffer->Buffer.len;
|
SrcSize = SrcBuffer->Buffer.len - SrcBuffer->Offset;
|
||||||
|
|
||||||
DstData = Buffers->buf;
|
DstData = Buffers->buf;
|
||||||
DstSize = Buffers->len;
|
DstSize = Buffers->len;
|
||||||
|
@ -169,6 +170,7 @@ NTSTATUS FillWSABuffers(
|
||||||
ExFreePool(SrcBuffer);
|
ExFreePool(SrcBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SrcBuffer->Offset += Total;
|
||||||
*BytesCopied = Total;
|
*BytesCopied = Total;
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
|
|
|
@ -87,6 +87,7 @@ typedef struct _AFDFCB {
|
||||||
typedef struct _AFD_BUFFER {
|
typedef struct _AFD_BUFFER {
|
||||||
LIST_ENTRY ListEntry;
|
LIST_ENTRY ListEntry;
|
||||||
WSABUF Buffer;
|
WSABUF Buffer;
|
||||||
|
UINT Offset;
|
||||||
} AFD_BUFFER, *PAFD_BUFFER;
|
} AFD_BUFFER, *PAFD_BUFFER;
|
||||||
|
|
||||||
typedef struct _AFD_READ_REQUEST {
|
typedef struct _AFD_READ_REQUEST {
|
||||||
|
@ -324,7 +325,8 @@ NTSTATUS FillWSABuffers(
|
||||||
PAFDFCB FCB,
|
PAFDFCB FCB,
|
||||||
LPWSABUF Buffers,
|
LPWSABUF Buffers,
|
||||||
DWORD BufferCount,
|
DWORD BufferCount,
|
||||||
PULONG BytesCopied);
|
PULONG BytesCopied,
|
||||||
|
BOOL Continuous);
|
||||||
|
|
||||||
VOID BuildIPv4Header(
|
VOID BuildIPv4Header(
|
||||||
PIPv4_HEADER IPHeader,
|
PIPv4_HEADER IPHeader,
|
||||||
|
|
Loading…
Reference in a new issue