/*++ Copyright (c) 1990 Microsoft Corporation Module Name: testmac.h Abstract: Definitions for test MAC. Motsly taken from the Elnkii code spec. Author: Adam Barr (adamba) 16-Jul-1990 Revision History: --*/ #define AllocPhys(s) ExAllocatePool(NonPagedPool, s) #define FreePhys(s) ExFreePool(s) #define ADDRESS_LEN 6 typedef ULONG MASK; UCHAR BroadcastAddress[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; // only have one of these structures typedef struct _MAC_BLOCK { // NDIS information NDIS_HANDLE NdisMacHandle; // returned from NdisRegisterMac NDIS_MAC_CHARACTERISTICS MacCharacteristics; UCHAR MacName[8]; // adapters registered for us UINT NumAdapters; struct _ADAPTER_BLOCK * AdapterQueue; // should we be verbose BOOLEAN Debug; // NT specific PDRIVER_OBJECT DriverObject; KPOWER_STATUS PowerStatus; BOOLEAN PowerBoolean; NDIS_SPIN_LOCK SpinLock; // guards NumAdapter and AdapterQueue } MAC_BLOCK, * PMAC_BLOCK; // the multicast address list consists of these typedef struct _MULTICAST_ENTRY { UCHAR Address[ADDRESS_LEN]; MASK ProtocolMask; // determines which opens it applies to } MULTICAST_ENTRY, * PMULTICAST_ENTRY; // one of these per adapter registered typedef struct _ADAPTER_BLOCK { // NDIS information NDIS_HANDLE NdisAdapterHandle; // returned from NdisRegisterAdapter PSTRING AdapterName; // used to mark us UINT AdapterNumber; // links with our MAC PMAC_BLOCK MacBlock; struct _ADAPTER_BLOCK * NextAdapter; // used by MacBlock->OpenQueue // opens for this adapter UINT MaxOpens; // maximum number struct _OPEN_BLOCK * OpenBlocks; // storage for MaxOpens OPEN_BLOCKs UINT NumOpens; struct _OPEN_BLOCK * OpenQueue; struct _OPEN_BLOCK * FreeOpenQueue; // should we be verbose BOOLEAN Debug; // PROTOCOL.INI information UINT MulticastListMax; // these are for the current packet UCHAR PacketHeader[4]; UCHAR Lookahead[256]; UINT PacketLen; // receive information UINT MulticastListSize; // current size PMULTICAST_ENTRY MulticastList; NDIS_SPIN_LOCK MulticastSpinLock; // guards all data in this section BOOLEAN MulticastDontModify; // an extended spinlock MASK MulticastFilter; // these filters work as explained MASK DirectedFilter; // in the design note MASK BroadcastFilter; MASK PromiscuousFilter; MASK AllMulticastFilter; // loopback information PNDIS_PACKET LoopbackQueue; PNDIS_PACKET LoopbackQTail; NDIS_SPIN_LOCK LoopbackSpinLock; PNDIS_PACKET LoopbackPacket; // NT specific PKINTERRUPT Interrupt; KDPC IndicateDpc; BOOLEAN DpcQueued; } ADAPTER_BLOCK, * PADAPTER_BLOCK; // general macros #define MSB(value) ((UCHAR)((value) << 8)) #define LSB(value) ((UCHAR)((value) && 0xff)) // one of these per open on the adapter typedef struct _OPEN_BLOCK { // NDIS information NDIS_HANDLE NdisBindingContext; // passed to MacOpenAdapter PSTRING AddressingInformation; // not used currently // links to our adapter PADAPTER_BLOCK AdapterBlock; struct _OPEN_BLOCK * NextOpen; // links to our MAC PMAC_BLOCK MacBlock; // faster than using AdapterBlock->MacBlock // should we be verbose BOOLEAN Debug; // used for multicast addresses MASK MulticastBit; } OPEN_BLOCK, * POPEN_BLOCK; // the reserved section of a packet typedef struct _MAC_RESERVED { // can't be more than 16 bytes PNDIS_PACKET NextPacket; // used to in the transmit queue (4 bytes) NDIS_HANDLE RequestHandle; // for async send completion (4 bytes) POPEN_BLOCK OpenBlock; // so we know who to complete to (4 bytes) USHORT Status; // completion status (2 bytes) BOOLEAN Loopback; // is this a loopback packet (1 byte) BOOLEAN ReadyToComplete; // is one out of xmit or loopback done (1 byte) } MAC_RESERVED, * PMAC_RESERVED; // macro to retrieve the MAC_RESERVED structure from a packet #define RESERVED(Packet) ((PMAC_RESERVED)((Packet)->MacReserved)) extern MAC_BLOCK GlobalMacBlock; // // function prototypes // NTSTATUS TestMacInitialize( IN PDRIVER_OBJECT DriverObject ); static NTSTATUS TestMacDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); static NDIS_STATUS TestMacRegisterAdapter( IN PSTRING AdapterName, IN UINT AdapterNumber ); static NDIS_STATUS TestMacOpenAdapter( OUT NDIS_HANDLE * MacBindingHandle, IN NDIS_HANDLE RequestHandle, IN NDIS_HANDLE NdisBindingContext, IN NDIS_HANDLE MacAdapterContext, IN PSTRING AddressingInformation OPTIONAL ); static NDIS_STATUS TestMacCloseAdapter( IN NDIS_HANDLE MacBindingHandle, IN NDIS_HANDLE RequestHandle ); static NDIS_STATUS TestMacSetPacketFilter( IN NDIS_HANDLE MacBindingHandle, IN NDIS_HANDLE RequestHandle, IN UINT PacketFilter ); static NDIS_STATUS TestMacAddMulticastAddress( IN NDIS_HANDLE MacBindingHandle, IN NDIS_HANDLE RequestHandle, IN PSTRING MulticastAddress ); static VOID TestMacGetMulticastAccess( IN PADAPTER_BLOCK AdaptP ); static PMULTICAST_ENTRY TestMacFindMulticastAddress( IN PMULTICAST_ENTRY List, IN UINT Size, IN PUCHAR MulticastAddress ); static VOID TestMacKillMulticastAddresses( IN PADAPTER_BLOCK AdaptP, IN MASK MulticastBit ); static NDIS_STATUS TestMacDeleteMulticastAddress( IN NDIS_HANDLE MacBindingHandle, IN NDIS_HANDLE RequestHandle, IN PSTRING MulticastAddress ); static NDIS_STATUS TestMacSend( IN NDIS_HANDLE MacBindingHandle, IN NDIS_HANDLE RequestHandle, IN PNDIS_PACKET Packet ); static VOID TestMacSetLoopbackFlag( IN OUT PNDIS_PACKET Packet ); static VOID TestMacLoopbackPacket( IN PADAPTER_BLOCK AdaptP, IN OUT PNDIS_PACKET Packet ); static VOID TestMacIndicateLoopbackPacket( IN PADAPTER_BLOCK AdaptP, IN PNDIS_PACKET Packet ); static UINT TestMacPacketSize( IN PNDIS_PACKET Packet ); static UINT TestMacCopyOver( OUT PUCHAR Buf, IN PNDIS_PACKET Packet, IN UINT Offset, IN UINT Length ); static NDIS_STATUS TestMacTransferData( IN NDIS_HANDLE MacBindingHandle, IN NDIS_HANDLE RequestHandle, IN NDIS_HANDLE MacReceiveContext, IN UINT ByteOffset, IN UINT BytesToTransfer, OUT PNDIS_PACKET Packet, OUT PUINT BytesTransferred ); static NDIS_STATUS TestMacQueryInformation( IN NDIS_HANDLE MacBindingHandle, IN NDIS_HANDLE RequestHandle, IN NDIS_INFORMATION_CLASS InformationClass, OUT PVOID Buffer, IN UINT BufferLength ); static NDIS_STATUS TestMacSetInformation( IN NDIS_HANDLE MacBindingHandle, IN NDIS_HANDLE RequestHandle, IN NDIS_INFORMATION_CLASS InformationClass, IN PVOID Buffer, IN UINT BufferLength ); static NDIS_STATUS TestMacReset( IN NDIS_HANDLE MacBindingHandle, IN NDIS_HANDLE RequestHandle ); static NDIS_STATUS TestMacTest( IN NDIS_HANDLE MacBindingHandle, IN NDIS_HANDLE RequestHandle ); static VOID TestMacIndicateDpc( IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 );