mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
385 lines
9.2 KiB
385 lines
9.2 KiB
/*++
|
|
|
|
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;
|
|
}
|
|
}
|