Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

1657 lines
39 KiB

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
priv.h
Abstract:
Common header file for ATM Epvc IM miniport.
Author:
ADube 03/23/2000
Environment:
Revision History:
--*/
#ifndef _PRIV_H
#define _PRIV_H
//advance declaration
typedef struct _EPVC_I_MINIPORT _ADAPT, ADAPT, *PADAPT;
typedef struct _EPVC_I_MINIPORT EPVC_I_MINIPORT, *PEPVC_I_MINIPORT ;
typedef struct _EPVC_GLOBALS EPVC_GLOBALS, *PEPVC_GLOBALS;
typedef struct _EPVC_ARP_PACKET EPVC_ARP_PACKET, *PEPVC_ARP_PACKET ;
typedef struct _EPVC_NDIS_REQUEST EPVC_NDIS_REQUEST, *PEPVC_NDIS_REQUEST;
extern LIST_ENTRY g_ProtocolList;
//
// Temp declarations
//
extern NDIS_HANDLE ProtHandle, DriverHandle;
extern EPVC_GLOBALS EpvcGlobals;
//--------------------------------------------------------------------------------
// //
// Driver Functions - Prototypes //
// //
// //
//--------------------------------------------------------------------------------
extern
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
extern
VOID
EpvcUnload(
IN PDRIVER_OBJECT pDriverObject
);
//--------------------------------------------------------------------------------
// //
// Protocol Functions - Prototypes //
// //
// //
//--------------------------------------------------------------------------------
extern
VOID
EpvcResetComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status
);
extern
VOID
PtStatus(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS GeneralStatus,
IN PVOID StatusBuffer,
IN UINT StatusBufferSize
);
extern
VOID
PtStatusComplete(
IN NDIS_HANDLE ProtocolBindingContext
);
extern
VOID
PtTransferDataComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_PACKET Packet,
IN NDIS_STATUS Status,
IN UINT BytesTransferred
);
extern
NDIS_STATUS
PtReceive(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE MacReceiveContext,
IN PVOID HeaderBuffer,
IN UINT HeaderBufferSize,
IN PVOID LookAheadBuffer,
IN UINT LookaheadBufferSize,
IN UINT PacketSize
);
extern
VOID
PtReceiveComplete(
IN NDIS_HANDLE ProtocolBindingContext
);
extern
INT
PtReceivePacket(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_PACKET Packet
);
VOID
EpvcUnload(
IN PDRIVER_OBJECT DriverObject
);
extern
VOID
EpvcAfRegisterNotify(
IN NDIS_HANDLE ProtocolBindingContext,
IN PCO_ADDRESS_FAMILY AddressFamily
);
VOID
epvcOidCloseAfWorkItem(
IN PRM_OBJECT_HEADER pObj,
IN NDIS_STATUS Status,
IN PRM_STACK_RECORD pSR
);
//--------------------------------------------------------------------------------
// //
// Miniport Functions - Prototypes //
// //
// //
//--------------------------------------------------------------------------------
NDIS_STATUS
MPTransferData(
OUT PNDIS_PACKET Packet,
OUT PUINT BytesTransferred,
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_HANDLE MiniportReceiveContext,
IN UINT ByteOffset,
IN UINT BytesToTransfer
);
NDIS_STATUS
MPReset(
OUT PBOOLEAN AddressingReset,
IN NDIS_HANDLE MiniportAdapterContext
);
#define DBGPRINT(Fmt) \
{ \
DbgPrint("*** %s (%d) *** ", __FILE__, __LINE__); \
DbgPrint (Fmt); \
}
#define NUM_PKTS_IN_POOL 256
extern NDIS_PHYSICAL_ADDRESS HighestAcceptableMax;
extern NDIS_HANDLE ProtHandle, DriverHandle;
extern NDIS_MEDIUM MediumArray[1];
//
// Custom Macros to be used by the passthru driver
//
/*
bool
IsIMDeviceStateOn(
PADAPT
)
*/
#define IsIMDeviceStateOn(_pP) ((_pP)->MPDeviceState == NdisDeviceStateD0 && (_pP)->PTDeviceState == NdisDeviceStateD0 )
//--------------------------------------------------------------------------------
// //
// New stuff for atmepvc starts here //
// //
// //
//--------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
// //
// Arp Packet Parsing structs //
// //
//-----------------------------------------------------------------------------------
//
// Len of an Ethernet Header.
//
#define ARP_802_ADDR_LENGTH 6
//
// HwType should be one of the two below.
//
#define ARP_HW_ENET 1
#define ARP_HW_802 6
//
// Ip Address
//
typedef ULONG IP_ADDR;
#define ARP_ETYPE_ARP 0x806
#define ARP_REQUEST 1
#define ARP_RESPONSE 2
#define ARP_HW_ENET 1
#define IP_PROT_TYPE 0x800
//
// As these data structs are used to parse data off the wire.
// make sure it is packed at 1
//
#pragma pack( push, enter_include1, 1 )
//
// The following object is a convenient way to
// store and access an IEEE 48-bit MAC address.
//
typedef struct _MAC_ADDRESS
{
UCHAR Byte[ARP_802_ADDR_LENGTH];
} MAC_ADDRESS, *PMAC_ADDRESS;
//
// Structure of the Ethernet Arp packet. The 14 byte ethernet header is not here.
//
typedef struct _EPVC_ETH_HEADER{
MAC_ADDRESS eh_daddr;
MAC_ADDRESS eh_saddr;
USHORT eh_type;
} EPVC_ETH_HEADER, *PEPVC_ETH_HEADER;
// Structure of an ARP header.
typedef struct _EPVC_ARP_BODY {
USHORT hw; // Hardware address space. = 00 01
USHORT pro; // Protocol address space. = 08 00
UCHAR hlen; // Hardware address length. = 06
UCHAR plen; // Protocol address length. = 04
USHORT opcode; // Opcode.
MAC_ADDRESS SenderHwAddr; // Source HW address.
IP_ADDR SenderIpAddr; // Source protocol address.
MAC_ADDRESS DestHwAddr; // Destination HW address.
IP_ADDR DestIPAddr; // Destination protocol address.
} EPVC_ARP_BODY, *PEPVC_ARP_BODY;
//
// Complete Arp Packet
//
typedef struct _EPVC_ARP_PACKET
{
//
// The first fourteen bytes
//
EPVC_ETH_HEADER Header;
//
// The body of the Arp packets
//
EPVC_ARP_BODY Body;
} EPVC_ARP_PACKET, *PEPVC_ARP_PACKET;
//
// This is the struct that is allocated
// by the Rcv Code path if The Rcv packet
// is to be copied into a local buffer
//
typedef struct _EPVC_IP_RCV_BUFFER
{
//
// The Old Head in the Packet that was indicated
// to our Rcv Handler
//
PNDIS_BUFFER pOldHead;
//
// The Old Tail in the Packet that was indiacated to
// our Rcv Hnadler
//
PNDIS_BUFFER pOldTail;
//
// The actual Ethernet packet is copied into the
// memory below
//
union
{
UCHAR Byte[MAX_ETHERNET_FRAME ];
struct
{
EPVC_ETH_HEADER Eth;
//
// the ip portion of the packet begins here.
//
UCHAR ip[1];
}Pkt;
} u;
} EPVC_IP_RCV_BUFFER, *PEPVC_IP_RCV_BUFFER;
//* IP Header format.
typedef struct IPHeader {
UCHAR iph_verlen; // Version and length.
UCHAR iph_tos; // Type of service.
USHORT iph_length; // Total length of datagram.
USHORT iph_id; // Identification.
USHORT iph_offset; // Flags and fragment offset.
UCHAR iph_ttl; // Time to live.
UCHAR iph_protocol; // Protocol.
USHORT iph_xsum; // Header checksum.
IPAddr iph_src; // Source address.
IPAddr iph_dest; // Destination address.
} IPHeader;
//
// Restore the Pack value to the original
//
#pragma pack( pop, enter_include1 )
//
// The structure all the info required to process
// an arp.
//
typedef struct _EPVC_ARP_CONTEXT
{
//
// Data about the Ndis Packet
//
BOOLEAN fIsThisAnArp ;
BOOLEAN Pad[3];
PNDIS_BUFFER pFirstBuffer ;
//
// Data about the Current Ndis Buffer
//
UINT BufferLength ;
//
// Virtual Addresses'. Pointers to
// the Header and the Body of the
// Arp Pkt
//
PEPVC_ARP_PACKET pArpPkt;
PEPVC_ETH_HEADER pEthHeader ;
PEPVC_ARP_BODY pBody;
}EPVC_ARP_CONTEXT, *PEPVC_ARP_CONTEXT;
//
// This is stored in the Packet Stack and should be of the
// size of 2 Ulong_Ptrs
//
typedef union _EPVC_STACK_CONTEXT
{
struct
{
//
// 1st containing the Buffer
//
PNDIS_BUFFER pOldHeadNdisBuffer;
} ipv4Send;
struct
{
PEPVC_IP_RCV_BUFFER pIpBuffer;
} ipv4Recv;
struct
{
//
// Head and tail of the original packet . Used in recv
//
PNDIS_BUFFER pOldHead;
PNDIS_BUFFER pOldTail;
}EthLLC;
struct
{
//
// Keep track of the last NDIS buffer in original
// chain of buffers in a sent packet, when we pad
// the end of a runt packet.
//
PNDIS_BUFFER pOldLastNdisBuffer;
}EthernetSend;
} EPVC_STACK_CONTEXT, *PEPVC_STACK_CONTEXT;
//
// Protocol reserved part of the packet, only in case the
// packet is allocated by us
//
typedef struct _EPVC_PKT_CONTEXT
{
//
// Contains the miniport and the old ndis buffer
//
EPVC_STACK_CONTEXT Stack;
//
// Original packet which is being repackaged
//
PNDIS_PACKET pOriginalPacket;
}EPVC_PKT_CONTEXT, *PEPVC_PKT_CONTEXT;
//
// This a struct that tracks a send packets
// as it is sent down to physical miniport
//
typedef struct _EPVC_SEND_STRUCT
{
//
// Old Ndis PAcket
//
PNDIS_PACKET pOldPacket;
//
// New Ndis Packet
//
PNDIS_PACKET pNewPacket;
PNDIS_PACKET_STACK pPktStack;
//
// Are we using the Packet Stack
//
BOOLEAN fUsingStacks;
//
// is this an arp packet
//
BOOLEAN fIsThisAnArp;
BOOLEAN fNonUnicastPacket;
BOOLEAN fNotIPv4Pkt;
//
// Old Packet's first NdisBuffer (Head)
//
PNDIS_BUFFER pHeadOldNdisBuffer;
//
// Context to be set up in the packet
//
EPVC_PKT_CONTEXT Context;
//
// EpvcMiniport
//
PEPVC_I_MINIPORT pMiniport;
} EPVC_SEND_STRUCT , *PEPVC_SEND_STRUCT ;
typedef struct _EPVC_SEND_COMPLETE
{
PNDIS_PACKET_STACK pStack;
PNDIS_PACKET pOrigPkt;
PNDIS_PACKET pPacket;
PEPVC_PKT_CONTEXT pPktContext;
BOOLEAN fUsedPktStack ;
PEPVC_STACK_CONTEXT pContext;
} EPVC_SEND_COMPLETE, *PEPVC_SEND_COMPLETE;
typedef struct _EPVC_RCV_STRUCT
{
//
// pPacket that was indicated to us
//
PNDIS_PACKET pPacket;
//
// Packet that was allocated by us
//
PNDIS_PACKET pNewPacket;
//
// Packet STack, if stacks were used
//
PNDIS_PACKET_STACK pStack;
//
// This points to the context for the
// Rcv Indication
//
PEPVC_PKT_CONTEXT pPktContext;
//
// Tells me if stacks were used
//
BOOLEAN fUsedPktStacks;
//
// Tels me if a stack still remains
//
BOOLEAN fRemaining;
//
// Was an LLC header a part of the indicated packet
//
BOOLEAN fLLCHeader;
//
// Old Packet Status
//
NDIS_STATUS OldPacketStatus;
//
// pNew Buffer that is allocated
//
PNDIS_BUFFER pNewBuffer;
//
// Start of valid data within the old packet
//
PUCHAR pStartOfValidData ;
//
// Number of bytes that were copied
//
ULONG BytesCopied;
//
// Contains some ndis buffers and the memory
// where packets will be copied into
//
PEPVC_IP_RCV_BUFFER pIpBuffer;
//
// Local Memory where the rcvd packet
// is copied into . - a part of ip buffer
//
PUCHAR pLocalMemory;
} EPVC_RCV_STRUCT, *PEPVC_RCV_STRUCT;
//--------------------------------------------------------------------------------
// //
// Structures used by the Protocol and miniport //
// These need to declared before the Miniprot and the Protocol Blocks //
// //
//--------------------------------------------------------------------------------
typedef VOID (*REQUEST_COMPLETION)(PEPVC_NDIS_REQUEST, NDIS_STATUS);
// This structure is used when calling NdisRequest.
//
typedef struct _EPVC_NDIS_REQUEST
{
NDIS_REQUEST Request; // The NDIS request structure.
NDIS_EVENT Event; // Event to signal when done.
NDIS_STATUS Status; // Status of completed request.
REQUEST_COMPLETION pFunc; // Completion function
BOOLEAN fPendedRequest ; // Set to true if a pended request caused this request
BOOLEAN fSet; // Was the orig. request a query
USHORT Pad;
PEPVC_I_MINIPORT pMiniport;
} EPVC_NDIS_REQUEST, *PEPVC_NDIS_REQUEST;
//------------------------------------------------------------------------------//
// Structures used to wrap Ndis Wrapper structures //
// //
//------------------------------------------------------------------------------//
//
// The Ndis miniport's wrapper around the Packet Pool
//
typedef struct _EPVC_PACKET_POOL
{
ULONG AllocatedPackets;
NDIS_HANDLE Handle;
} EPVC_PACKET_POOL, *PEPVC_PACKET_POOL;
//
// The structure that defines the lookaside list used by this miniport
//
typedef struct _EPVC_NPAGED_LOOKASIDE_LIST
{
//
// The lookaside list structure
//
NPAGED_LOOKASIDE_LIST List;
//
// The size of an individual buffer
//
ULONG Size;
//
// Outstanding Fragments - Interlocked access only
//
ULONG OutstandingPackets;
//
// Verifies if this lookaside list has been allocated
//
BOOLEAN bIsAllocated;
UCHAR Pad[3];
} EPVC_NPAGED_LOOKASIDE_LIST , *PEPVC_NPAGED_LOOKASIDE_LIST ;
typedef
VOID
(*PEVPC_WORK_ITEM_FUNC)(
PRM_OBJECT_HEADER,
NDIS_STATUS,
PRM_STACK_RECORD
);
typedef union _EPVC_WORK_ITEM_CONTEXT
{
struct
{
//
// Oid for the request
//
NDIS_OID Oid;
//
// Currently the only data is 1 Dword long
//
ULONG Data;
}Request;
}EPVC_WORK_ITEM_CONTEXT, *PEPVC_WORK_ITEM_CONTEXT;
typedef struct _EPVC_WORK_ITEM
{
//
// Normal NdisWork Item - Do not move from
// the top of this structure
//
NDIS_WORK_ITEM WorkItem;
//
// Miniport or Adapter to whom this adapter belongs
//
PRM_OBJECT_HEADER pParentObj;
PEVPC_WORK_ITEM_FUNC pFn;
//
// Status of async task that was completed
//
NDIS_STATUS ReturnStatus;
} EPVC_WORK_ITEM, *PEPVC_WORK_ITEM;
//--------------------------------------------------------------------------------
// //
// Tasks used in the Atmepvc driver //
// //
// //
//--------------------------------------------------------------------------------
typedef enum _TASK_CAUSE
{
TaskCause_Invalid=0,
TaskCause_NdisRequest,
TaskCause_MediaConnect,
TaskCause_MediaDisconnect,
TaskCause_MiniportHalt,
TaskCause_AfNotify,
TaskCause_ProtocolUnbind,
TaskCause_AfCloseRequest,
TaskCause_ProtocolBind,
TaskCause_IncomingClose
} TASK_CAUSE, *PTASK_CAUSE;
typedef struct
{
RM_TASK TskHdr;
// Used to save the true return status (typically a failure status,
// which we don't want to forget during async cleanup).
//
NDIS_STATUS ReturnStatus;
} TASK_ADAPTERINIT, *PTASK_ADAPTERINIT;
typedef struct
{
RM_TASK TskHdr;
} TASK_ADAPTERACTIVATE, *PTASK_ADAPTERACTIVATE;
typedef struct
{
RM_TASK TskHdr;
NDIS_HANDLE pUnbindContext;
TASK_CAUSE Cause;
} TASK_ADAPTERSHUTDOWN, *PTASK_ADAPTERSHUTDOWN;
typedef struct
{
RM_TASK TskHdr;
NDIS_STATUS ReturnStatus;
TASK_CAUSE Cause;
PCO_ADDRESS_FAMILY pAf;
union
{
PNDIS_REQUEST pRequest;
NDIS_EVENT CompleteEvent;
};
} TASK_AF, *PTASK_AF;
typedef struct _TASK_VC
{
RM_TASK TskHdr;
NDIS_STATUS ReturnStatus;
ULONG FailureState;
TASK_CAUSE Cause;
ULONG PacketFilter;
} TASK_VC, *PTASK_VC;
typedef struct _TASK_HALT
{
RM_TASK TskHdr;
NDIS_EVENT CompleteEvent;
}TASK_HALT, *PTASK_HALT;
typedef struct _TASK_ARP
{
//
// Rm Task associated with the Arp
//
RM_TASK TskHdr;
//
// Back pointer to the miniport
//
PEPVC_I_MINIPORT pMiniport;
//
// Timer to fire - this does the receive indication
//
NDIS_MINIPORT_TIMER Timer;
//
// Arp Packet that will be indicated up.
//
EPVC_ARP_PACKET Pkt;
//
// NdisPacket to wrap the ArpPkt
//
PNDIS_PACKET pNdisPacket;
} TASK_ARP, *PTASK_ARP;
//
// EPVC_TASK is the union of all tasks structures used in atmepvc.
// arpAllocateTask allocates memory of sizeof(EPVC_TASK), which is
// guaranteed to be large enough to hold any task.
//
typedef union
{
RM_TASK TskHdr;
TASK_ADAPTERINIT AdapterInit;
TASK_ADAPTERACTIVATE AdapterActivate;
TASK_ADAPTERSHUTDOWN AdapterShutdown;
TASK_AF OpenAf;
TASK_HALT MiniportHalt;
TASK_ARP Arp;
} EPVC_TASK, *PEPVC_TASK;
//--------------------------------------------------------------------------------
// //
// Epvc Adapter block. //
// There is one epvc_adapter per underlying adapter //
// //
//--------------------------------------------------------------------------------
//
// PRIMARY_STATE flags (in Hdr.State)
//
// PRIMARY_STATE is the primary state of the adapter.
//
#define EPVC_AD_PS_MASK 0x00f
#define EPVC_AD_PS_DEINITED 0x000
#define EPVC_AD_PS_INITED 0x001
#define EPVC_AD_PS_FAILEDINIT 0x002
#define EPVC_AD_PS_INITING 0x003
#define EPVC_AD_PS_REINITING 0x004
#define EPVC_AD_PS_DEINITING 0x005
#define SET_AD_PRIMARY_STATE(_pAD, _IfState) \
RM_SET_STATE(_pAD, EPVC_AD_PS_MASK, _IfState)
#define CHECK_AD_PRIMARY_STATE(_pAD, _IfState) \
RM_CHECK_STATE(_pAD, EPVC_AD_PS_MASK, _IfState)
#define GET_AD_PRIMARY_STATE(_pAD) \
RM_GET_STATE(_pAD, EPVC_AD_PS_MASK)
//
// ACTIVE_STATE flags (in Hdr.State)
//
// ACTIVE_STATE is a secondary state of the adapter.
// Primary state takes precedence over secondary sate. For example,
// the interface is REINITING and ACTIVE, one should not actively use the
// interface.
//
// NOTE: When the primary state is INITED, the secondary state WILL be
// ACTIVATED. It is thus usually only necessary to look at the primary state.
//
#define EPVC_AD_AS_MASK 0x0f0
#define EPVC_AD_AS_DEACTIVATED 0x000
#define EPVC_AD_AS_ACTIVATED 0x010
#define EPVC_AD_AS_FAILEDACTIVATE 0x020
#define EPVC_AD_AS_DEACTIVATING 0x030
#define EPVC_AD_AS_ACTIVATING 0x040
#define SET_AD_ACTIVE_STATE(_pAD, _IfState) \
RM_SET_STATE(_pAD, EPVC_AD_AS_MASK, _IfState)
#define CHECK_AD_ACTIVE_STATE(_pAD, _IfState) \
RM_CHECK_STATE(_pAD, EPVC_AD_AS_MASK, _IfState)
#define GET_AD_ACTIVE_STATE(_pAD) \
RM_GET_STATE(_pAD, EPVC_AD_AS_MASK)
#define EPVC_AD_INFO_AD_CLOSED 0X10000000
typedef struct _EPVC_ADAPTER
{
RM_OBJECT_HEADER Hdr; // RM Object header
RM_LOCK Lock; // RM Lock
//
// Flags
//
ULONG Flags;
//
// List of instantiated protocols
//
LIST_ENTRY PtListEntry;
//
// NDIS bind info.
//
struct
{
// Init/Deinit/Reinit task
//
PRM_TASK pPrimaryTask;
// Activate/Deactivate task
//
PRM_TASK pSecondaryTask;
//
// Device Name of the adapter
//
NDIS_STRING DeviceName;
NDIS_HANDLE BindingHandle; // To the lower miniport
//
// Bind Context - used in async completion of
// the bind adapter routine
//
NDIS_HANDLE BindContext;
//
// pConfig Name - Only to be used in the context of the Bind adapter call.
//
PNDIS_STRING pEpvcConfigName;
//
// Copy of the ConfigName
//
NDIS_STRING EpvcConfigName;
//
// Device Name - Name of the underlying adapter
//
PNDIS_STRING pAdapterDeviceName;
} bind;
struct
{
CO_ADDRESS_FAMILY AddressFamily;
}af;
struct
{
//
// Mac Address of the underlying adapter
//
MAC_ADDRESS MacAddress;
//
// Max AAL5 PAcket Size - used in determining Lookahead
//
ULONG MaxAAL5PacketSize;
//
// Link speed of the ATM adapter. We'll use the same link speed
// for the miniport
//
NDIS_CO_LINK_SPEED LinkSpeed;
//
// Number of miniports instatiated by this adapter
//
ULONG NumberOfMiniports;
//
// MEdia State // default disconnected
//
NDIS_MEDIA_STATE MediaState;
}info;
// Group containing local ip addresses, of type EPVC_I_MINIPORT
//
RM_GROUP MiniportsGroup;
}EPVC_ADAPTER, *PEPVC_ADAPTER;
//------------------------------------------------------------------------------------
// //
// The Epvc ADapter Params is used as a constructor for the adapter block //
// It contains all the parameters that are to be initialized in the adapter block //
// //
//------------------------------------------------------------------------------------
typedef struct _EPVC_ADAPTER_PARAMS
{
PNDIS_STRING pDeviceName;
PNDIS_STRING pEpvcConfigName;
NDIS_HANDLE BindContext;
}EPVC_ADAPTER_PARAMS, *PEPVC_ADAPTER_PARAMS;
//------------------------------------------------------------------------------------
// //
// The Epvc Miniports Params is used as a constructor for the miniport block //
// It contains all the parameters that are to be initialized in the miniport block //
// //
//------------------------------------------------------------------------------------
typedef struct _EPVC_I_MINIPORT_PARAMS
{
PNDIS_STRING pDeviceName;
PEPVC_ADAPTER pAdapter;
ULONG CurLookAhead ;
ULONG NumberOfMiniports;
NDIS_CO_LINK_SPEED LinkSpeed;
MAC_ADDRESS MacAddress;
NDIS_MEDIA_STATE MediaState;
}EPVC_I_MINIPORT_PARAMS, *PEPVC_I_MINIPORT_PARAMS ;
//--------------------------------------------------------------------------------
// //
// Epvc Miniport block. //
// //
// There is one Miniport structure for each address family //
// //
//--------------------------------------------------------------------------------
#define fMP_AddressFamilyOpened 0x00000001
#define fMP_DevInstanceInitialized 0x00000010
#define fMP_MiniportInitialized 0x00000020
#define fMP_MiniportCancelInstance 0x00000080
#define fMP_MiniportVcSetup 0x00000100
#define fMP_MakeCallSucceeded 0x00000200
#define fMP_WaitingForHalt 0x00000400
//
// Informational flags
//
#define fMP_InfoClosingCall 0x10000000
#define fMP_InfoCallClosed 0x20000000
#define fMP_InfoMakingCall 0x40000000
#define fMP_InfoHalting 0x80000000
#define fMP_InfoAfClosed 0x01000000
typedef struct _EPVC_I_MINIPORT
{
RM_OBJECT_HEADER Hdr; // RM Object header
RM_LOCK Lock; // RM Lock
PEPVC_ADAPTER pAdapter;
struct
{
//
// Flags of the address family
//
ULONG AfFlags;
//
// Af Handle
//
NDIS_HANDLE AfHandle;
//
// Open/Close Miniport Task
//
PTASK_AF pAfTask;
//
// Close Address Family Workitem
//
EPVC_WORK_ITEM CloseAfWorkItem;
//
// CloseAF RequestTask
//
PTASK_AF pCloseAfTask;
}af;
struct
{
//
// Task used in creating/deleting Vcs and Open/Close Make Calls
//
PTASK_VC pTaskVc;
//
// Vc Handle
//
NDIS_HANDLE VcHandle;
//
// Close Address Family Workitem
//
NDIS_WORK_ITEM PacketFilterWorkItem;
//
// New filter
//
ULONG NewFilter;
//
// Work item for CloseCall and Delete VC
//
EPVC_WORK_ITEM CallVcWorkItem;
} vc;
struct
{
//
// Device Name
//
NDIS_STRING DeviceName;
//
// Ndis' context
//
NDIS_HANDLE MiniportAdapterHandle;
//
// Lookahead size
//
ULONG CurLookAhead;
}ndis;
struct
{
//
// Task to Halt the miniport
//
PTASK_HALT pTaskHalt;
//
// Task to Init the miniport
//
PTASK_HALT pTaskInit;
//
// Halt Complete Event
//
NDIS_EVENT HaltCompleteEvent;
//
// DeInitialize Event used to wait for
// InitializeHandler to compelte in
// the CancelDevInst code path
//
NDIS_EVENT DeInitEvent;
} pnp;
//
// Information used to keep state in the miniport
//
struct
{
//
// Current Packet filter on this miniport instance
//
ULONG PacketFilter;
//
// Media State - Connected or disconnected
//
NDIS_MEDIA_STATE MediaState;
//
// Mac Address of the miniport
//
MAC_ADDRESS MacAddressEth;
//
// Fake Mac Address used in IP encapsulation
//
MAC_ADDRESS MacAddressDummy;
//
// Mac Address destination - used in indicating packets
//
MAC_ADDRESS MacAddressDest;
//
// Size of the header that will be attached to packets that are sent out
// by the miniport
//
ULONG MaxHeaderLength;
//
// # of this miniport
//
ULONG NumberOfMiniports;
//
// Lookahead length
//
ULONG CurLookAhead;
//
// Muticast Info
//
MAC_ADDRESS McastAddrs[MCAST_LIST_SIZE];
//
// Number of MCast addresses present
//
ULONG McastAddrCount;
//
// Link Speed of the ATM adapter. We'll use it for our speed as well
//
ULONG LinkSpeed;
//
// Indicating Receives
//
BOOLEAN IndicateRcvComplete;
}info;
//
// Mac Address of the miniport
//
MAC_ADDRESS MacAddressEth;
//
// Ethernet Header for incoming packets
//
EPVC_ETH_HEADER RcvEnetHeader;
//
// LLC Header, address and length
//
PUCHAR pLllcHeader;
ULONG LlcHeaderLength;
// Minimum length of an incoming packet
//
ULONG MinAcceptablePkt;
// Maximum length of an incoming packet
//
ULONG MaxAcceptablePkt;
struct
{
ULONG vpi;
ULONG vci;
ULONG MaxPacketSize;
USHORT Gap;
} config;
ULONG Encap;
BOOLEAN fAddLLCHeader;
BOOLEAN fDoIpEncapsulation;
struct
{
ULONG FramesXmitOk;
ULONG FramesRecvOk;
ULONG RecvDropped;
}count;
struct
{
//
// Send and Recv Packet Pools
//
EPVC_PACKET_POOL Send;
EPVC_PACKET_POOL Recv;
} PktPool;
struct
{
EPVC_NPAGED_LOOKASIDE_LIST LookasideList;
PTASK_ARP pTask;
} arps;
struct
{
EPVC_NPAGED_LOOKASIDE_LIST LookasideList;
} rcv;
// This maintains miniport-wide information relevant to the send path.
//
struct
{
// Lock used exclusively for sending.
// Protects the following:
// ??? this->sendinfo.listPktsWaitingForHeaders
// ??? this->sendinfo.NumSendPacketsWaiting
// pLocalIp->sendinfo
// pDest->sendinfo
//
//
RM_LOCK Lock;
// List of send packets waiting for header buffers to become available.
//
LIST_ENTRY listPktsWaitingForHeaders;
// Length of the above list
//
UINT NumSendPacketsWaiting;
} sendinfo;
#if 0
//
// Temporary stuff
//
NDIS_HANDLE SendPacketPoolHandle;
NDIS_HANDLE RecvPacketPoolHandle;
NDIS_STATUS Status; // Open Status
NDIS_EVENT Event; // Used by bind/halt for Open/Close Adapter synch.
NDIS_MEDIUM Medium;
NDIS_REQUEST Request; // This is used to wrap a request coming down
// to us. This exploits the fact that requests
// are serialized down to us.
PULONG BytesNeeded;
PULONG BytesReadOrWritten;
BOOLEAN IndicateRcvComplete;
BOOLEAN OutstandingRequests; //True - if a request has been passed to the miniport below the IM protocol
BOOLEAN QueuedRequest; //True - if a request is queued with the IM miniport and needs to be either
// failed or sent to the miniport below the IM Protocol
BOOLEAN StandingBy; // True - When the miniport or protocol is transitioning from a D0 to Standby (>D0) State
// False - At all other times, - Flag is cleared after a transition to D0
NDIS_DEVICE_POWER_STATE MPDeviceState; // Miniport's Device State
NDIS_DEVICE_POWER_STATE PTDeviceState; // Protocol's Device State
BOOLEAN isSecondary; // Set if miniport is secondary of a bundle
NDIS_STRING BundleUniString; // Strores the bundleid
PADAPT pPrimaryAdapt; // Pointer to the primary
PADAPT pSecondaryAdapt; // Pointer to Secondary's structure
KSPIN_LOCK SpinLock; // Spin Lock to protect the global list
PADAPT Next;
#endif
}EPVC_I_MINIPORT, *PEPVC_I_MINIPORT;
//--------------------------------------------------------------------------------
// //
// Epvc Global Block. //
// //
// //
//--------------------------------------------------------------------------------
typedef struct _EPVC_GLOBALS
{
RM_OBJECT_HEADER Hdr;
RM_LOCK Lock;
// Driver global state
//
struct
{
// Handle to Driver Object for ATMEPVC
//
PVOID pDriverObject;
// Handle to the single device object representing this driver.
//
PVOID pDeviceObject;
//
// Registry path
//
PUNICODE_STRING pRegistryPath;
//
// Wrapper Handle
//
NDIS_HANDLE WrapperHandle;
//
// Protocol Handle
//
NDIS_HANDLE ProtocolHandle;
//
// Driver Handle
//
NDIS_HANDLE DriverHandle;
} driver;
struct
{
RM_GROUP Group;
} adapters;
struct
{
NDIS_CLIENT_CHARACTERISTICS CC;
}ndis;
} EPVC_GLOBALS, *PEPVC_GLOBALS;
//--------------------------------------------------------------------------------
// //
// Enumerated types . //
// //
// //
//--------------------------------------------------------------------------------
//
// This is an enumeration that is used in acquiring locks in a particular order.
// If lock A needs to be acquired before lock B, this enumeration will enforce the
// order
//
enum
{
LOCKLEVEL_GLOBAL=1, // Must start > 0.
LOCKLEVEL_ADAPTER,
LOCKLEVEL_MINIPORT,
LOCKLEVEL_SEND
};
// (debug only) Enumeration of types of associations.
//
enum
{
EPVC_ASSOC_AD_PRIMARY_TASK,
EPVC_ASSOC_ACTDEACT_AD_TASK,
EPVC_ASSOC_MINIPORT_OPEN_VC,
EPVC_ASSOC_MINIPORT_OPEN_AF,
EPVC_ASSOC_MINIPORT_ADAPTER_HANDLE,
EPVC_ASSOC_ADAPTER_MEDIA_WORKITEM,
EPVC_ASSOC_EXTLINK_PKT_TO_SEND,
EPVC_ASSOC_CLOSE_AF_WORKITEM,
EPVC_ASSOC_SET_FILTER_WORKITEM,
EPVC_ASSOC_EXTLINK_INDICATED_PKT,
EPVC_ASSOC_WORKITEM,
EPVC_ASSOC_MINIPORT_REQUEST
};
enum
{
IPV4_ENCAP_TYPE,
IPV4_LLC_SNAP_ENCAP_TYPE,
ETHERNET_ENCAP_TYPE,
ETHERNET_LLC_SNAP_ENCAP_TYPE
};
//--------------------------------------------------------------------------------
// //
// WorkItems //
// //
// //
//--------------------------------------------------------------------------------
typedef struct _EPVC_WORKITEM_MEDIA_EVENT
{
NDIS_WORK_ITEM WorkItem;
NDIS_STATUS State;
PEPVC_ADAPTER pAdapter;
}EPVC_WORKITEM_MEDIA_EVENT, *PEPVC_WORKITEM_MEDIA_EVENT;
typedef union
{
NDIS_WORK_ITEM WorkItem;
EPVC_WORKITEM_MEDIA_EVENT Media;
} EPVC_WORKITEM, *PEPVC_WORKITEM;
//
// Local declarations for reading the registry
//
typedef struct _MP_REG_ENTRY
{
NDIS_STRING RegName; // variable name text
BOOLEAN bRequired; // 1 -> required, 0 -> optional
UINT FieldOffset; // offset to MP_ADAPTER field
UINT FieldSize; // size (in bytes) of the field
UINT Default; // default value to use
UINT Min; // minimum value allowed
UINT Max; // maximum value allowed
} MP_REG_ENTRY, *PMP_REG_ENTRY;
#define NIC_NUM_REG_PARAMS (sizeof (NICRegTable) / sizeof(MP_REG_ENTRY))
#endif // _PRIV_H