diff options
author | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
---|---|---|
committer | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
commit | e611b132f9b8abe35b362e5870b74bce94a1e58e (patch) | |
tree | a5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/ntos/ndis/testprot/tpdrvr/protocol.c | |
download | NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2 NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip |
Diffstat (limited to 'private/ntos/ndis/testprot/tpdrvr/protocol.c')
-rw-r--r-- | private/ntos/ndis/testprot/tpdrvr/protocol.c | 442 |
1 files changed, 442 insertions, 0 deletions
diff --git a/private/ntos/ndis/testprot/tpdrvr/protocol.c b/private/ntos/ndis/testprot/tpdrvr/protocol.c new file mode 100644 index 000000000..e45f71b2c --- /dev/null +++ b/private/ntos/ndis/testprot/tpdrvr/protocol.c @@ -0,0 +1,442 @@ +// ---------------------------- +// +// Copyright (c) 1990 Microsoft Corporation +// +// Module Name: +// +// protocol.c +// +// Abstract: +// +// Test Protocol Indication and Completion routines called by a MAC. +// +// Author: +// +// Tom Adams (tomad) 19-Nov-1991 +// +// Environment: +// +// Kernel mode, FSD +// +// Revision History: +// +// Tim Wynsma (timothyw) 4-27-94 +// Performance tests +// 5-18-94 +// Enhancements/improvements to performance tests +// 6-08-94 +// Perf tests chgd to client/server model +// +// --------------------------- + +#include <ndis.h> + +#include "tpdefs.h" +#include "media.h" +#include "tpprocs.h" + + + +VOID +TestProtocolOpenComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status, + IN NDIS_STATUS OpenErrorStatus + ) +{ + TpFuncOpenComplete( ProtocolBindingContext,Status,OpenErrorStatus ); +} + + + +VOID +TestProtocolCloseComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status + ) +{ + TpFuncCloseComplete( ProtocolBindingContext,Status ); +} + + + +VOID +TestProtocolSendComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status + ) +{ + POPEN_BLOCK OpenP = ((POPEN_BLOCK)ProtocolBindingContext); + ULONG PacketSignature; + + if (OpenP->PerformanceTest) + { + TpPerfSendComplete( ProtocolBindingContext,Packet,Status ); + } + else + { + // + // First get the signature out of the packet if it is a test prot + // packet. + // + + PacketSignature = TpGetPacketSignature( Packet ); + + if ((( OpenP->Stress->Stressing == TRUE ) && + ( OpenP->Stress->StressEnded == FALSE )) && + ( PacketSignature == STRESS_PACKET_SIGNATURE )) + { + NdisAcquireSpinLock( &OpenP->SpinLock ); + OpenP->GlobalCounters->SendComps++; + NdisReleaseSpinLock( &OpenP->SpinLock ); + + // + // If this is a stress packet, then let the stress send complete + // routine handle it. + // + + TpStressSendComplete( ProtocolBindingContext,Packet,Status ); + } + else + { + TpFuncSendComplete( ProtocolBindingContext,Packet,Status ); + } + } +} + + + +VOID +TestProtocolTransferDataComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status, + IN UINT BytesTransferred + ) +{ + POPEN_BLOCK OpenP = ((POPEN_BLOCK)ProtocolBindingContext); + PPROTOCOL_RESERVED ProtRes; + + ProtRes = PROT_RES( Packet ); + + if (OpenP->PerformanceTest) + { + TpPrint0("TestProtocolTransferDataComplete: called while in performance test\n"); + return; + } + + if ((( OpenP->Stress->Stressing == TRUE ) && + ( OpenP->Stress->StressEnded == FALSE )) && + ( ProtRes->RequestHandle->Signature == STRESS_REQUEST_HANDLE_SIGNATURE )) + { + // + // The transfer data was called by the stress routines, so + // let them complete it. + // + + TpStressTransferDataComplete( ProtocolBindingContext, + Packet, + Status, + BytesTransferred ); + } + else + { + TpFuncTransferDataComplete( ProtocolBindingContext, + Packet, + Status, + BytesTransferred ); + } +} + + + +VOID +TestProtocolResetComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status + ) +{ + POPEN_BLOCK OpenP = ((POPEN_BLOCK)ProtocolBindingContext); + + if ( OpenP->Stress->Resetting == TRUE ) + { + TpStressResetComplete( ProtocolBindingContext,Status ); + } + else + { + TpFuncResetComplete( ProtocolBindingContext,Status ); + } +} + + + +VOID +TestProtocolRequestComplete( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_REQUEST NdisRequest, + IN NDIS_STATUS Status + ) +{ + POPEN_BLOCK OpenP = ((POPEN_BLOCK)ProtocolBindingContext); + PTP_REQUEST_HANDLE ReqHndl; + BOOLEAN StressRequest = FALSE; + + if ((( OpenP->Stress->Stressing == TRUE ) && + ( OpenP->Stress->StressEnded == FALSE )) && + ( OpenP->StressReqHndl != NULL )) + { + if ( OpenP->StressReqHndl->u.STRESS_REQ.Request == NdisRequest ) + { + StressRequest = TRUE; + } + else + { + ReqHndl = OpenP->StressReqHndl; + + do + { + if ( ReqHndl->u.STRESS_REQ.NextReqHndl->u.STRESS_REQ.Request == NdisRequest ) + { + StressRequest = TRUE; + break; + } + else + { + ReqHndl = ReqHndl->u.STRESS_REQ.NextReqHndl; + } + } while ( ReqHndl->u.STRESS_REQ.NextReqHndl != NULL ); + } + + if ( StressRequest == TRUE ) + { + TpStressRequestComplete( ProtocolBindingContext,NdisRequest,Status ); + } + else + { + TpFuncRequestComplete( ProtocolBindingContext,NdisRequest,Status ); + } + } + else + { + TpFuncRequestComplete( ProtocolBindingContext,NdisRequest,Status ); + } +} + + + +NDIS_STATUS +TestProtocolReceive( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_HANDLE MacReceiveContext, + IN PVOID HeaderBuffer, + IN UINT HeaderBufferSize, + IN PVOID LookaheadBuffer, + IN UINT LookaheadBufferSize, + IN UINT PacketSize + ) +{ + POPEN_BLOCK OpenP = ((POPEN_BLOCK)ProtocolBindingContext); + PUCHAR Lookahead = (PUCHAR)LookaheadBuffer; + PPACKET_INFO PacketInfo; + // + // STARTCHANGE + // + UINT HeaderVariance = sizeof(MEDIA_HEADER)- HeaderBufferSize; + // + // STOPCHANGE + // + + + // + // SPECIAL ENTRY. THIS MUST BE REMOVED IF WE CREATE + // AND TEST FOR TRUE MAC FRAMES AND OTHER RESERVED TYPES + // + switch( OpenP->Media->MediumType ) + { + case NdisMedium802_5: + // + // If the Frame Control indicates that this frames is anything other than + // an LLC frame, we will not accept since we are not responsible for + // generating this frame and this is not part of our control environment + // + // In Token Ring the bit Frame Control field + // F F Z Z Z Z Z Z + // where FF must be 0 1 for an LLC PDU + // + + if ( (((PTR_802_5)HeaderBuffer)->FC & 0xC0) != 0x40 ) + { + IF_TPDBG( TP_DEBUG_INFOLEVEL_2 ) + { + TpPrint1( + "TestProtocolReceive: Dropping 802.5 frame as we received FC Control Frame set to : 0x%2.2x\n", + ((PTR_802_5)HeaderBuffer)->FC ); + } + return NDIS_STATUS_NOT_RECOGNIZED; + } + break; + + case NdisMediumFddi: + // + // If the Frame Control indicates that this frames is anything other than + // an LLC frame, we will not accept since we are not responsible for + // generating this frame and this is not part of our control environment + // + // In FDDI the bit Frame Control field + // C L F F Z Z Z Z + // where FF must be 0 1 for an LLC PDU + // + + if ( (((PFDDI)HeaderBuffer)->FC & 0x30) != 0x10 ) + { + IF_TPDBG( TP_DEBUG_INFOLEVEL_2 ) + { + TpPrint1( + "TestProtocolReceive: Dropping FDDI frame as we received FC Control Frame set to : 0x%2.2x\n", + ((PFDDI)HeaderBuffer)->FC ); + } + return NDIS_STATUS_NOT_RECOGNIZED; + } + break; + + default: + break; + + } + + // + // STARTCHANGE + // + // Adjust the look ahead buffer so that it points to + // the beginning of PACKET_INFO structure + // + LookaheadBuffer = (PVOID)( (PUCHAR)LookaheadBuffer + HeaderVariance ); + LookaheadBufferSize -= HeaderVariance; + // + // STOPCHANGE + // + + if (OpenP->PerformanceTest) + { + return TpPerfReceive( ProtocolBindingContext, + LookaheadBuffer, + LookaheadBufferSize, + PacketSize ); + } + + PacketInfo = LookaheadBuffer; + + if ((( OpenP->Stress->Stressing == TRUE ) && + ( OpenP->Stress->StressEnded == FALSE )) && + ( PacketInfo->Signature == STRESS_PACKET_SIGNATURE )) + { + // + // if so pass it to the stress receive routine. + // + + return TpStressReceive( ProtocolBindingContext, + MacReceiveContext, + HeaderBuffer, + HeaderBufferSize, + LookaheadBuffer, + LookaheadBufferSize, + PacketSize ); + + } + else + { + // + // otherwise let the functional receive routine handle it. + // + return TpFuncReceive( ProtocolBindingContext, + MacReceiveContext, + HeaderBuffer, + HeaderBufferSize, + LookaheadBuffer, + LookaheadBufferSize, + PacketSize ); + } +} + + + +VOID +TestProtocolReceiveComplete( + IN NDIS_HANDLE ProtocolBindingContext + ) +{ + POPEN_BLOCK OpenP = ((POPEN_BLOCK)ProtocolBindingContext); + + if (OpenP->PerformanceTest) + { + return; + } + + if (( OpenP->Stress->Stressing == TRUE ) && + ( OpenP->Stress->StressEnded == FALSE )) + { + NdisAcquireSpinLock( &OpenP->SpinLock ); + OpenP->GlobalCounters->ReceiveComps++; + NdisReleaseSpinLock( &OpenP->SpinLock ); + TpStressReceiveComplete( ProtocolBindingContext ); + } + else + { + TpFuncReceiveComplete( ProtocolBindingContext ); + } +} + + + +VOID +TestProtocolStatus( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS GeneralStatus, + IN PVOID StatusBuffer, + IN UINT StatusBufferSize + ) +{ + POPEN_BLOCK OpenP = ((POPEN_BLOCK)ProtocolBindingContext); + + if ( OpenP->Stress->Stressing == FALSE ) + { + UINT SpecificStatus; + + // + // XXX: add an expecting flag for tpstressreset. + // + // ADAMBA: Assume the buffer has a four-byte specific status. + // + + if ( StatusBufferSize == sizeof( SpecificStatus )) + { + SpecificStatus = *(PULONG)StatusBuffer; + + TpFuncStatus( ProtocolBindingContext, + GeneralStatus, + StatusBuffer, + StatusBufferSize ); + } + } +} + + + +VOID +TestProtocolStatusComplete( + IN NDIS_HANDLE ProtocolBindingContext + ) +{ + POPEN_BLOCK OpenP = ((POPEN_BLOCK)ProtocolBindingContext); + + if ( OpenP->Stress->Stressing == FALSE ) + { + // XXX: add an expecting flag for tpstressreset. + + TpFuncStatusComplete( ProtocolBindingContext ); + } +} + + + |