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 #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 */

View file

@ -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
} }

View file

@ -44,9 +44,77 @@ NTSTATUS AfdEventReceive(
IN PVOID Tsdu, IN PVOID Tsdu,
OUT PIRP *IoRequestPacket) 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.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;

View file

@ -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;

View file

@ -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,