From e611b132f9b8abe35b362e5870b74bce94a1e58e Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 16 May 2020 20:51:50 -0700 Subject: initial commit --- private/ntos/ndis/ndis30/afilter.h | 339 +++++++++++++++++++++++++++++++++++++ 1 file changed, 339 insertions(+) create mode 100644 private/ntos/ndis/ndis30/afilter.h (limited to 'private/ntos/ndis/ndis30/afilter.h') diff --git a/private/ntos/ndis/ndis30/afilter.h b/private/ntos/ndis/ndis30/afilter.h new file mode 100644 index 000000000..1bfa9e97f --- /dev/null +++ b/private/ntos/ndis/ndis30/afilter.h @@ -0,0 +1,339 @@ +/*++ + +Copyright (c) 1993 Microsoft Corporation + +Module Name: + + afilter.h + +Abstract: + + Header file for the address filtering library for NDIS MAC's. + +Author: + + Alireza Dabagh creation-date 3-22-1993, mostly borrowed from efilter.h + +Revision History: + +--*/ + +#ifndef _ARC_FILTER_DEFS_ +#define _ARC_FILTER_DEFS_ + +// +// Number of Ndis buffers in the buffer pool +// +#define ARC_RECEIVE_BUFFERS 64 + +// +// Linked list Structure for keeping track of allocated memory so we can free them later +// +typedef struct _ARC_BUFFER_LIST{ + PVOID Buffer; + UINT Size; + UINT BytesLeft; + struct _ARC_BUFFER_LIST *Next; +} ARC_BUFFER_LIST, *PARC_BUFFER_LIST; + +// +// This is the structure that is passed to the protocol as the packet +// header during receive indication. It is also the header expected from the protocol. +// This header is NOT the same as the header passed to the mac driver +// + +#define ARCNET_ADDRESS_LEN 1 + +typedef struct _ARC_PROTOCOL_HEADER { + UCHAR SourceId[ARCNET_ADDRESS_LEN]; // Source Address + UCHAR DestId[ARCNET_ADDRESS_LEN]; // Destination Address + UCHAR ProtId; // Protocol ID +} ARC_PROTOCOL_HEADER, *PARC_PROTOCOL_HEADER; + +// +// This structure keeps track of information about a received packet +// +typedef struct _ARC_PACKET_HEADER { + ARC_PROTOCOL_HEADER ProtHeader; // Protocol header + USHORT FrameSequence; // Frame sequence Number + UCHAR SplitFlag; // Split flag + UCHAR LastSplitFlag; // Split Flag for the last frame + UCHAR FramesReceived; // Frames in This Packet +} ARC_PACKET_HEADER, * PARC_PACKET_HEADER; + +// +// Arcnet specific packet header +// +typedef struct _ARC_PACKET { + ARC_PACKET_HEADER Header; // Information about the packet + struct _ARC_PACKET * Next; // Next packet in use by filter + ULONG TotalLength; + BOOLEAN LastFrame; + PARC_BUFFER_LIST FirstBuffer; + PARC_BUFFER_LIST LastBuffer; + NDIS_PACKET TmpNdisPacket; +} ARC_PACKET, * PARC_PACKET; + + +#define ARC_PROTOCOL_HEADER_SIZE (sizeof(ARC_PROTOCOL_HEADER)) +#define ARC_MAX_FRAME_SIZE 504 +#define ARC_MAX_ADDRESS_IDS 256 +#define ARC_MAX_FRAME_HEADER_SIZE 6 +#define ARC_MAX_PACKET_SIZE 576 + + +// +// Check whether an address is broadcast. +// + +#define ARC_IS_BROADCAST(Address) \ + (BOOLEAN)(!(Address)) + + +// +// An action routine type. The routines are called +// when a filter type is set for the first time or +// no more bindings require a particular type of filter. +// +// NOTE: THIS ROUTINE SHOULD ASSUME THAT THE LOCK IS ACQUIRED. +// +typedef +NDIS_STATUS +(*ARC_FILTER_CHANGE)( + IN UINT OldFilterClasses, + IN UINT NewFilterClasses, + IN NDIS_HANDLE MacBindingHandle, + IN PNDIS_REQUEST NdisRequest, + IN BOOLEAN Set + ); + + +// +// This action routine is called when the mac requests a close for +// a particular binding *WHILE THE BINDING IS BEING INDICATED TO +// THE PROTOCOL*. The filtering package can't get rid of the open +// right away. So this routine will be called as soon as the +// NdisIndicateReceive returns. +// +// NOTE: THIS ROUTINE SHOULD ASSUME THAT THE LOCK IS ACQUIRED. +// +typedef +VOID +(*ARC_DEFERRED_CLOSE)( + IN NDIS_HANDLE MacBindingHandle + ); + +typedef ULONG MASK,*PMASK; + +// +// Maximum number of opens the filter package will support. This is +// the max so that bit masks can be used instead of a spaghetti of +// pointers. +// +#define ARC_FILTER_MAX_OPENS (sizeof(ULONG) * 8) + + +// +// The binding info is threaded on two lists. When +// the binding is free it is on a single freelist. +// +// When the binding is being used it is on a doubly linked +// index list. +// +typedef struct _ARC_BINDING_INFO { + NDIS_HANDLE MacBindingHandle; + NDIS_HANDLE NdisBindingContext; + UINT PacketFilters; + ULONG References; + struct _ARC_BINDING_INFO *NextOpen; + struct _ARC_BINDING_INFO *PrevOpen; + BOOLEAN ReceivedAPacket; + UCHAR FilterIndex; +} ARC_BINDING_INFO,*PARC_BINDING_INFO; + +// +// An opaque type that contains a filter database. +// The MAC need not know how it is structured. +// +typedef struct _ARC_FILTER { + + // + // For accessing the mini-port. + // + struct _NDIS_MINIPORT_BLOCK *Miniport; + + // + // Spin lock used to protect the filter from multiple accesses. + // + PNDIS_SPIN_LOCK Lock; + + // + // Combination of all the filters of all the open bindings. + // + UINT CombinedPacketFilter; + + // + // Pointer for traversing the open list. + // + PARC_BINDING_INFO OpenList; + + // + // Action routines to be invoked on notable changes in the filter. + // + + ARC_FILTER_CHANGE FilterChangeAction; + ARC_DEFERRED_CLOSE CloseAction; + + // + // Bit mask of opens that are available. + // + ULONG FreeBindingMask; + + NDIS_HANDLE ReceiveBufferPool; + + PARC_BUFFER_LIST FreeBufferList; + PARC_PACKET FreePackets; + + PARC_PACKET OutstandingPackets; + + // + // Address of the adapter. + // + UCHAR AdapterAddress; + +} ARC_FILTER,*PARC_FILTER; + + + + +// +//UINT +//ARC_QUERY_FILTER_CLASSES( +// IN PARC_FILTER Filter +// ) +// +// This macro returns the currently enabled filter classes. +// +// NOTE: THIS MACRO ASSUMES THAT THE FILTER LOCK IS HELD. +// +#define ARC_QUERY_FILTER_CLASSES(Filter) ((Filter)->CombinedPacketFilter) + + +// +//UINT +//ARC_QUERY_PACKET_FILTER( +// IN ARC_FILTER Filter, +// IN NDIS_HANDLE NdisFilterHandle +// ) +// +// This macro returns the currently enabled filter classes for a specific +// open instance. +// +// NOTE: THIS MACRO ASSUMES THAT THE FILTER LOCK IS HELD. +// +#define ARC_QUERY_PACKET_FILTER(Filter, NdisFilterHandle) \ + (((PARC_BINDING_INFO)(NdisFilterHandle))->PacketFilters) + +// +// Only for internal wrapper use. +// +VOID +ArcInitializePackage( + VOID + ); + +VOID +ArcReferencePackage( + VOID + ); + +VOID +ArcDereferencePackage( + VOID + ); + + +// +// Exported routines +// + +BOOLEAN +ArcCreateFilter( + IN struct _NDIS_MINIPORT_BLOCK *Miniport, + IN ARC_FILTER_CHANGE FilterChangeAction, + IN ARC_DEFERRED_CLOSE CloseAction, + IN UCHAR AdapterAddress, + IN PNDIS_SPIN_LOCK Lock, + OUT PARC_FILTER *Filter + ); + +VOID +ArcDeleteFilter( + IN PARC_FILTER Filter + ); + +BOOLEAN +ArcNoteFilterOpenAdapter( + IN PARC_FILTER Filter, + IN NDIS_HANDLE MacBindingHandle, + IN NDIS_HANDLE NdisBindingContext, + OUT PNDIS_HANDLE NdisFilterHandle + ); + +NDIS_STATUS +ArcDeleteFilterOpenAdapter( + IN PARC_FILTER Filter, + IN NDIS_HANDLE NdisFilterHandle, + IN PNDIS_REQUEST NdisRequest + ); + +NDIS_STATUS +ArcFilterAdjust( + IN PARC_FILTER Filter, + IN NDIS_HANDLE NdisFilterHandle, + IN PNDIS_REQUEST NdisRequest, + IN UINT FilterClasses, + IN BOOLEAN Set + ); + +VOID +ArcFilterDprIndicateReceiveComplete( + IN PARC_FILTER Filter + ); + +VOID +ArcFilterDprIndicateReceive( + IN PARC_FILTER Filter, // Pointer to filter database + IN PUCHAR pRawHeader, // Pointer to Arcnet frame header + IN PUCHAR pData, // Pointer to data portion of Arcnet frame + IN UINT Length // Data Length + ); + +NDIS_STATUS +ArcFilterTransferData( + IN PARC_FILTER Filter, + IN NDIS_HANDLE MacReceiveContext, + IN UINT ByteOffset, + IN UINT BytesToTransfer, + OUT PNDIS_PACKET Packet, + OUT PUINT BytesTransfered + ); + +VOID +ArcFreeNdisPacket( + IN PARC_PACKET Packet + ); + +VOID +ArcFilterDoIndication( + IN PARC_FILTER Filter, + IN PARC_PACKET Packet + ); + +VOID +ArcDestroyPacket( + IN PARC_FILTER Filter, + IN PARC_PACKET Packet + ); + +#endif // _ARC_FILTER_DEFS_ -- cgit v1.2.3