diff options
Diffstat (limited to '')
-rw-r--r-- | private/ntos/ndis/testprot/tpdrvr/buffer.c | 313 |
1 files changed, 313 insertions, 0 deletions
diff --git a/private/ntos/ndis/testprot/tpdrvr/buffer.c b/private/ntos/ndis/testprot/tpdrvr/buffer.c new file mode 100644 index 000000000..34ac561f8 --- /dev/null +++ b/private/ntos/ndis/testprot/tpdrvr/buffer.c @@ -0,0 +1,313 @@ +/*++ + +Copyright (c) 1990 Microsoft Corporation + +Module Name: + + buffer.c + +Abstract: + + This module implements the buffer manipulation routines for + Test Protocol. + +Author: + + Tom Adams (tomad) 15-Dec-1990 + +Environment: + + Kernel mode, FSD + +Revision History: + + Sanjeev Katariya (sanjeevk) 3-24-1993 + 1. Added function to free MDL's associated with Data block with the stress block + Effected Function: TpStressFreeDataBufferMdls() + 2. Changed functions TpStressInitDataBuffer() and TpStressFreeDataBuffers() to + handle two data buffer locations + +--*/ + +#include <ndis.h> +#include "tpdefs.h" +#include "tpprocs.h" + + +PNDIS_BUFFER +TpAllocateBuffer( + PUCHAR TmpBuf, + INT BufSize + ) + +/*++ + +Routine Description: + + This routine creates an NDIS_BUFFER. An NDIS_BUFFER is merely an + MDL that may be chained to other NDIS_BUFFERs to form an MDL chain. + This chain contains the actual contents of the NDIS frame that + will be sent on the wire. If the size of the buffer to be created + is zero, the size is temporarily set to one to be valid for + IoAllocateMdl. + +Arguments: + + TmpBuf - A pointer to the memory to be placed in the NDIS_BUFFER. + + BufSize - The size of TmpBuf. + +Return Value: + + PNDIS_BUFFER - A pointer to the new MDL that references the TmpBuf. + +--*/ + +{ + PMDL TmpMdl; + BOOLEAN Reset; + + Reset = FALSE; + + // + // IoAllocateMdl must be called with a positive value for the + // buffer size, so if TmpBuf is zero bytes long set the size to + // one temporarily. + // + + if ( BufSize == 0 ) { + BufSize = 1; + Reset = TRUE; + } + + // + // Allocate the MDL and set the various fields. + // + + TmpMdl = IoAllocateMdl( + TmpBuf, + BufSize, + TRUE, + FALSE, + NULL + ); + + if ( TmpMdl == NULL ) { + TpPrint0("TpAllocateBuffer: failed to allocate TmpMdl\n"); + return (PNDIS_BUFFER)NULL; + } + + MmBuildMdlForNonPagedPool( TmpMdl ); + + // + // if this is to be a zero by NDIS_BUFFER we must reset the MDL. + // + + if ( Reset == TRUE ) { + TmpMdl->ByteCount = 0; + } + + return (PNDIS_BUFFER)TmpMdl; +} + + +VOID +TpFreeBuffer( + PNDIS_BUFFER Buffer + ) + +/*++ + +Routine Description: + + This routine simply deallocates the MDL that was built in the routine + TpBuildBuffer. + +Arguments: + + Buffer - The PNDIS_BUFFER (PMDL) that is to be destroyed. + +Return Value: + + None. + +--*/ + +{ + IoFreeMdl( Buffer ); +} + + +VOID +TpStressInitDataBuffer( + POPEN_BLOCK OpenP, + INT BufferSize + ) + +/*++ + +Routine Description: + + This routine initializes the Data Buffers that will be referenced by + all packets as their data. It is twice as long as the maximum packet + allowable for the media in question, and contains an ascending sequence + of characters from 0x00 to 0xff repeating. This routine also allocates + the MDLs which reference these buffers. The MDLs are used by the packet + creation routines in the call IoBuildPartialMdl(); + +Arguments: + + OpenP - The Open Block to allocate the Data Buffer and MDL for. + + BufferSize - The size of the Data Buffer to allocate and initialize. + +Return Value: + + None - if successful two DataBuffers and two MDLs are referenced by this Open + Block + +--*/ + +{ + INT i, j; + + // + // Allocate the data buffers + // + NdisAllocateMemory( + (PVOID *)&OpenP->Stress->DataBuffer[0], + BufferSize, + 0, + HighestAddress + ); + NdisAllocateMemory( + (PVOID *)&OpenP->Stress->DataBuffer[1], + BufferSize, + 0, + HighestAddress + ); + + // + // Verify creation of data buffers + // + if ( OpenP->Stress->DataBuffer[0] == (PUCHAR)NULL || + OpenP->Stress->DataBuffer[1] == (PUCHAR)NULL ) { + TpPrint0("TpStressInitDataBuffer: failed to allocate Data Buffers\n"); + TpStressFreeDataBuffers( OpenP ); + return; + } + + + // + // Clear the two buffers + // + NdisZeroMemory( OpenP->Stress->DataBuffer[0],BufferSize ); + NdisZeroMemory( OpenP->Stress->DataBuffer[1],BufferSize ); + + + // + // And now initialize them 0x00 thru 0xff repeating + // + for ( j = 0; j < MAX_NUMBER_BUFFERS; j++ ) { + for ( i=0 ; i < BufferSize ; i++ ) { + OpenP->Stress->DataBuffer[j][i] = (UCHAR)(i % 256); + } + } + + // + // Now create the MDLs which reference these two data buffers + // + OpenP->Stress->DataBufferMdl[0] = (PMDL)TpAllocateBuffer( + OpenP->Stress->DataBuffer[0], + BufferSize + ); + OpenP->Stress->DataBufferMdl[1] = (PMDL)TpAllocateBuffer( + OpenP->Stress->DataBuffer[1], + BufferSize + ); + // + // Verify creation of the MDLs + // + if ( OpenP->Stress->DataBufferMdl[0] == NULL || + OpenP->Stress->DataBufferMdl[1] == NULL ) { + TpPrint0("TpStressInitDataBuffer: failed to create the DataBufferMdls\n"); + TpStressFreeDataBuffers( OpenP ); + TpStressFreeDataBufferMdls( OpenP ); + } + +} + + + +VOID +TpStressFreeDataBuffers( + POPEN_BLOCK OpenP + ) + +/*++ + +Routine Description: + + This routine simply frees the DataBuffers + +Arguments: + + OpenP - The Open to free the DataBuffers from. + +Return Value: + + None - if successful the data buffers are deallocated. + +--*/ + +{ + + // + // CHANGED: SanjeevK + // + + if ( OpenP->Stress->DataBuffer[0] != NULL ) NdisFreeMemory( OpenP->Stress->DataBuffer[0],0,0 ); + if ( OpenP->Stress->DataBuffer[1] != NULL ) NdisFreeMemory( OpenP->Stress->DataBuffer[1],0,0 ); + + OpenP->Stress->DataBuffer[0] = NULL; + OpenP->Stress->DataBuffer[1] = NULL; + +} + + +VOID +TpStressFreeDataBufferMdls( + POPEN_BLOCK OpenP + ) + +/*++ + +Routine Description: + + This routines simply frees DataBuffer MDLs. + +Arguments: + + OpenP - The Open to free the DataBuffer MDLs from. + +Return Value: + + None - if successful the data buffer MDLs are deallocated. + +--*/ + +{ + + // + // ADDED: SanjeevK + // + if( OpenP->Stress->DataBufferMdl[0] != (PMDL)NULL ) + TpFreeBuffer( (PNDIS_BUFFER)OpenP->Stress->DataBufferMdl[0] ); + + if( OpenP->Stress->DataBufferMdl[1] != (PMDL)NULL ) + TpFreeBuffer( (PNDIS_BUFFER)OpenP->Stress->DataBufferMdl[1] ); + + OpenP->Stress->DataBufferMdl[0] = NULL; + OpenP->Stress->DataBufferMdl[1] = NULL; + +} |