diff options
Diffstat (limited to '')
-rw-r--r-- | private/ntos/ndis/testprot/tpdrvr/media.c | 385 |
1 files changed, 385 insertions, 0 deletions
diff --git a/private/ntos/ndis/testprot/tpdrvr/media.c b/private/ntos/ndis/testprot/tpdrvr/media.c new file mode 100644 index 000000000..8bdeff293 --- /dev/null +++ b/private/ntos/ndis/testprot/tpdrvr/media.c @@ -0,0 +1,385 @@ +/*++ + +Copyright (c) 1990 Microsoft Corporation + +Module Name: + + media.c + +Abstract: + + Functions used to determine information about a specific MAC, it's + packet size, and other media specifici information. + +Author: + + Tom Adams (tomad) 14-Jul-1990 + +Environment: + + Kernel mode, FSD + +Revision History: + + Tom Adams (tomad) 03-Jan-1991 Changed to support all MAC types. + + Sanjeev Katariya (sanjeevk) 04-6-1993 + Added native ARCNET support +--*/ + +#include <ndis.h> + +#include "tpdefs.h" +#include "media.h" + +// +// Medium array is used during NdisOpenAdapter to determine the +// media being supported by the card. +// + +// +// STARTCHANGE +// +NDIS_MEDIUM NdisMediumArray[NDIS_MEDIUM_ARRAY_SIZE] = { + NdisMedium802_3, + NdisMedium802_5, + NdisMediumDix, + NdisMediumFddi, + NdisMediumArcnet878_2 +}; +// +// STOPCHANGE +// + + +NDIS_STATUS +TpInitMedia( + POPEN_BLOCK OpenP, + ULONG FrameSize + ) + +/*++ + +Routine Description: + + TpInitMedia initializes the media data structure with information + specific to the media type that will be test on. The information + descibes the size of various elements of a packet for the media in + question, and is used when creating and destroying packets, etc. + +Arguments: + + MediumType - the specific NDIS Media that is being used in this test. + +Return Value: + + PTP_MEDIA_INFO - a pointer to the media information structure for + the Media being used in this test. + +--*/ + +{ + NDIS_STATUS Status; + + Status = NdisAllocateMemory( + (PVOID *)&OpenP->Media, + sizeof( TP_MEDIA_INFO ), + 0, + HighestAddress + ); + + if ( Status != NDIS_STATUS_SUCCESS ) + { + IF_TPDBG ( TP_DEBUG_RESOURCES ) + { + TpPrint0("TpInitMedia: failed to allocate Media buffer.\n"); + } + return NDIS_STATUS_RESOURCES; + } + else + { + NdisZeroMemory( OpenP->Media,sizeof( TP_MEDIA_INFO ) ); + } + + OpenP->Media->MediumType = NdisMediumArray[OpenP->MediumIndex]; + OpenP->Media->MaxPacketLen = FrameSize; + + switch( NdisMediumArray[OpenP->MediumIndex] ) + { + + case NdisMedium802_5: // TokenRing + + OpenP->Media->HeaderSize = TOKENRING_HEADER_SIZE; + OpenP->Media->Padding = TOKENRING_PADDING; + OpenP->Media->AddressLen = TOKENRING_ADDRESS_LEN; + OpenP->Media->DestAddrOffset = TOKENRING_DEST_ADDRESS_OFFSET; + OpenP->Media->SrcAddrOffset = TOKENRING_SRC_ADDRESS_OFFSET; + break; + + case NdisMedium802_3: // Ethernet + case NdisMediumDix: + + OpenP->Media->HeaderSize = ETHERNET_HEADER_SIZE; + OpenP->Media->Padding = ETHERNET_PADDING; + OpenP->Media->AddressLen = ETHERNET_ADDRESS_LEN; + OpenP->Media->DestAddrOffset = ETHERNET_DEST_ADDRESS_OFFSET; + OpenP->Media->SrcAddrOffset = ETHERNET_SRC_ADDRESS_OFFSET; + break; + + case NdisMediumFddi: + + OpenP->Media->HeaderSize = FDDI_HEADER_SIZE; + OpenP->Media->Padding = FDDI_PADDING; + OpenP->Media->AddressLen = FDDI_ADDRESS_LEN; + OpenP->Media->DestAddrOffset = FDDI_DEST_ADDRESS_OFFSET; + OpenP->Media->SrcAddrOffset = FDDI_SRC_ADDRESS_OFFSET; + break; + + // + // STARTCHANGE + // + + case NdisMediumArcnet878_2: + + OpenP->Media->HeaderSize = ARCNET_HEADER_SIZE; + OpenP->Media->Padding = ARCNET_PADDING; + OpenP->Media->AddressLen = ARCNET_ADDRESS_LEN; + OpenP->Media->DestAddrOffset = ARCNET_DEST_ADDRESS_OFFSET; + OpenP->Media->SrcAddrOffset = ARCNET_SRC_ADDRESS_OFFSET; + break; + // + // STOPCHANGE + // + + default: + IF_TPDBG ( TP_DEBUG_RESOURCES ) + { + TpPrint0("TpInitMedia: Invalid media type.\n"); + } + + return NDIS_STATUS_NOT_SUPPORTED; + } + + return NDIS_STATUS_SUCCESS; +} + + +BOOLEAN +TpInitMediaHeader( + PFUNC1_PACKET F1Packet, + PTP_MEDIA_INFO Media, + PUCHAR DestAddr, + PUCHAR SrcAddr, + INT PacketSize + ) +{ + PUCHAR p; + PUCHAR q; + USHORT DataSizeShort; + SHORT i; + +// DestAddr += (ADDRESS_LENGTH - Media->AddressLen); +// SrcAddr += (ADDRESS_LENGTH - Media->AddressLen); + + switch( Media->MediumType ) + { + case NdisMediumDix: + case NdisMedium802_3: + + p = (PUCHAR)&F1Packet->media.e.DestAddress[0]; + q = (PUCHAR)&F1Packet->media.e.SrcAddress[0]; + + for ( i = 0 ; i < Media->AddressLen ; i++ ) + { + *p++ = *DestAddr++; + *q++ = *SrcAddr++; + } + + DataSizeShort = (USHORT)( PacketSize - Media->HeaderSize ); + + F1Packet->media.e.PacketSize_Hi = (UCHAR)( DataSizeShort >> 8 ); + F1Packet->media.e.PacketSize_Lo = (UCHAR)DataSizeShort; + + break; + + + case NdisMedium802_5: + + F1Packet->media.tr.AC = 0x10; + F1Packet->media.tr.FC = 0x40; + + p = (PUCHAR)&F1Packet->media.tr.DestAddress[0]; + q = (PUCHAR)&F1Packet->media.tr.SrcAddress[0]; + + for ( i = 0 ; i < Media->AddressLen ; i++ ) + { + *p++ = *DestAddr++; + *q++ = *SrcAddr++; + } + + break; + + + case NdisMediumFddi: + + F1Packet->media.fddi.FC = 0x57; + + p = (PUCHAR)&F1Packet->media.fddi.DestAddress[0]; + q = (PUCHAR)&F1Packet->media.fddi.SrcAddress[0]; + + for ( i = 0 ; i < Media->AddressLen ; i++ ) + { + *p++ = *DestAddr++; + *q++ = *SrcAddr++; + } + + break; + + // + // STARTCHANGE + // + case NdisMediumArcnet878_2: + + F1Packet->media.a.ProtocolID = ARCNET_DEFAULT_PROTOCOLID; + + p = (PUCHAR)&F1Packet->media.a.DestAddress[0]; + q = (PUCHAR)&F1Packet->media.a.SrcAddress[0]; + + for ( i = 0 ; i < Media->AddressLen ; i++ ) + { + *p++ = *DestAddr++; + *q++ = *SrcAddr++; + } + + break; + // + // STOPCHANGE + // + + default: + IF_TPDBG ( TP_DEBUG_RESOURCES ) + { + TpPrint0("TpStressInitPacketHeader: Unsupported MAC Type\n"); + } + return FALSE; + } + return TRUE; +} + + +VOID +TpInitPoolMediaHeader( + PFUNC1_PACKET F1Packet, + PTP_MEDIA_INFO Media, + PUCHAR DestAddr + ) +{ + USHORT i; + +// DestAddr += (ADDRESS_LENGTH - Media->AddressLen); + + switch( Media->MediumType ) + { + case NdisMediumDix: + case NdisMedium802_3: + for ( i = 0 ; i < (USHORT)Media->AddressLen ; i++ ) + { + F1Packet->media.e.DestAddress[i] = *DestAddr++; + } + break; + case NdisMedium802_5: + for ( i = 0 ; i < (USHORT)Media->AddressLen ; i++ ) + { + F1Packet->media.tr.DestAddress[i] = *DestAddr++; + } + break; + case NdisMediumFddi: + for ( i = 0 ; i < (USHORT)Media->AddressLen ; i++ ) + { + F1Packet->media.fddi.DestAddress[i] = *DestAddr++; + } + break; + // + // STARTCHANGE + // + case NdisMediumArcnet878_2: + for ( i = 0 ; i < (USHORT)Media->AddressLen ; i++ ) + { + F1Packet->media.a.DestAddress[i] = *DestAddr++; + } + break; + // + // STOPCHANGE + // + default: + IF_TPDBG ( TP_DEBUG_RESOURCES ) + { + TpPrint0("TpStressSetPoolPacketInfo: Unsupported MAC Type\n"); + } + break; + } +} + + +VOID +TpInitTruncatedMediaHeader( + PFUNC1_PACKET F1Packet, + PTP_MEDIA_INFO Media, + PUCHAR DestAddr, + INT PacketSize + ) +{ + USHORT DataSizeShort; + USHORT i; + +// DestAddr += (ADDRESS_LENGTH - Media->AddressLen); + + switch( Media->MediumType ) + { + case NdisMediumDix: + case NdisMedium802_3: + + DataSizeShort = (USHORT)( PacketSize - Media->HeaderSize ); + + F1Packet->media.e.PacketSize_Hi = (UCHAR)( DataSizeShort >> 8 ); + F1Packet->media.e.PacketSize_Lo = (UCHAR)DataSizeShort; + + for ( i=0;i<(USHORT)Media->AddressLen;i++ ) + { + F1Packet->media.e.DestAddress[i] = *DestAddr++; + } + break; + + case NdisMedium802_5: + for ( i=0;i<(USHORT)Media->AddressLen;i++ ) + { + F1Packet->media.tr.DestAddress[i] = *DestAddr++; + } + break; + + case NdisMediumFddi: + for ( i=0;i<(USHORT)Media->AddressLen;i++ ) + { + F1Packet->media.fddi.DestAddress[i] = *DestAddr++; + } + break; + // + // STARTCHANGE + // + case NdisMediumArcnet878_2: + for ( i = 0 ; i < (USHORT)Media->AddressLen ; i++ ) + { + F1Packet->media.a.DestAddress[i] = *DestAddr++; + } + break; + // + // STOPCHANGE + // + default: + IF_TPDBG ( TP_DEBUG_RESOURCES ) + { + TpPrint0("TpStressSetTruncatedPacketInfo: Unsupported MAC Type\n"); + } + break; + } +} |