Preliminary version of recv.

svn path=/trunk/; revision=9666
This commit is contained in:
Art Yerkes 2004-06-14 03:22:27 +00:00
parent f773e32aab
commit 0999a0ef81
5 changed files with 92 additions and 19 deletions

View file

@ -13,8 +13,8 @@
#ifdef DBG
/* See debug.h for debug/trace constants */
DWORD DebugTraceLevel = MID_TRACE;
//DWORD DebugTraceLevel = DEBUG_ULTRA;
//DWORD DebugTraceLevel = MID_TRACE;
DWORD DebugTraceLevel = DEBUG_ULTRA;
#endif /* DBG */

View file

@ -13,7 +13,8 @@ NTSTATUS AfdpDispRecv(
PIRP Irp,
PAFDFCB FCB,
PFILE_REQUEST_RECVFROM Request,
PFILE_REPLY_RECVFROM Reply)
PFILE_REPLY_RECVFROM Reply,
BOOL Continuous)
/*
* FUNCTION: Receives data
* ARGUMENTS:
@ -64,7 +65,8 @@ NTSTATUS AfdpDispRecv(
FCB,
Request->Buffers,
Request->BufferCount,
&Count);
&Count,
Continuous); /* I.E. Packets are exhausted on short recv if not */
KeReleaseSpinLock(&FCB->ReceiveQueueLock, OldIrql);
Reply->NumberOfBytesRecvd = Count;
@ -490,7 +492,8 @@ NTSTATUS AfdDispRecvFrom(
Irp,
FCB,
Request,
Reply);
Reply,
FALSE);
} else {
Status = STATUS_INVALID_PARAMETER;
}
@ -761,7 +764,6 @@ NTSTATUS AfdDispRecv(
* Status of operation
*/
{
#if 0
NTSTATUS Status;
UINT InputBufferLength;
UINT OutputBufferLength;
@ -786,9 +788,9 @@ NTSTATUS AfdDispRecv(
Status = AfdpDispRecv(
Irp,
FCB,
Request->Buffers,
Request->BufferCount,
&NumberOfBytesRecvd);
(PFILE_REQUEST_RECVFROM)Request,
(PFILE_REPLY_RECVFROM)Reply,
TRUE);
Reply->NumberOfBytesRecvd = NumberOfBytesRecvd;
Reply->Status = NO_ERROR;
} else {
@ -798,9 +800,6 @@ NTSTATUS AfdDispRecv(
AFD_DbgPrint(MAX_TRACE, ("Status (0x%X).\n", Status));
return Status;
#else
return STATUS_SUCCESS;
#endif
}

View file

@ -44,9 +44,77 @@ NTSTATUS AfdEventReceive(
IN PVOID Tsdu,
OUT PIRP *IoRequestPacket)
{
AFD_DbgPrint(MAX_TRACE, ("Called.\n"));
PAFDFCB FCB = (PAFDFCB)TdiEventContext;
PAFD_READ_REQUEST ReadRequest;
PVOID ReceiveBuffer;
PAFD_BUFFER Buffer;
PLIST_ENTRY Entry;
NTSTATUS Status;
KIRQL OldIrql;
ULONG Count;
return STATUS_SUCCESS;
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;
}
@ -125,6 +193,7 @@ NTSTATUS AfdEventReceiveDatagramHandler(
Buffer->Buffer.len = BytesAvailable;
Buffer->Buffer.buf = ReceiveBuffer;
Buffer->Offset = 0;
ExInterlockedInsertTailList(
&FCB->ReceiveQueue,
@ -143,7 +212,8 @@ NTSTATUS AfdEventReceiveDatagramHandler(
FCB,
ReadRequest->RecvFromRequest->Buffers,
ReadRequest->RecvFromRequest->BufferCount,
&Count);
&Count,
FALSE ); /* Packet oriented */
ReadRequest->RecvFromReply->NumberOfBytesRecvd = Count;
ReadRequest->RecvFromReply->Status = NO_ERROR;

View file

@ -91,7 +91,8 @@ NTSTATUS FillWSABuffers(
PAFDFCB FCB,
LPWSABUF Buffers,
DWORD BufferCount,
PULONG BytesCopied)
PULONG BytesCopied,
BOOL Continuous)
{
PUCHAR DstData, SrcData;
UINT DstSize, SrcSize;
@ -108,8 +109,8 @@ NTSTATUS FillWSABuffers(
Entry = RemoveHeadList(&FCB->ReceiveQueue);
SrcBuffer = CONTAINING_RECORD(Entry, AFD_BUFFER, ListEntry);
SrcData = SrcBuffer->Buffer.buf;
SrcSize = SrcBuffer->Buffer.len;
SrcData = SrcBuffer->Buffer.buf + SrcBuffer->Offset;
SrcSize = SrcBuffer->Buffer.len - SrcBuffer->Offset;
DstData = Buffers->buf;
DstSize = Buffers->len;
@ -169,6 +170,7 @@ NTSTATUS FillWSABuffers(
ExFreePool(SrcBuffer);
}
SrcBuffer->Offset += Total;
*BytesCopied = Total;
return STATUS_SUCCESS;

View file

@ -87,6 +87,7 @@ typedef struct _AFDFCB {
typedef struct _AFD_BUFFER {
LIST_ENTRY ListEntry;
WSABUF Buffer;
UINT Offset;
} AFD_BUFFER, *PAFD_BUFFER;
typedef struct _AFD_READ_REQUEST {
@ -324,7 +325,8 @@ NTSTATUS FillWSABuffers(
PAFDFCB FCB,
LPWSABUF Buffers,
DWORD BufferCount,
PULONG BytesCopied);
PULONG BytesCopied,
BOOL Continuous);
VOID BuildIPv4Header(
PIPv4_HEADER IPHeader,