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.
251 lines
6.4 KiB
251 lines
6.4 KiB
/*++
|
|
|
|
Copyright (c) 1990-1995 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
mini.h
|
|
|
|
Abstract:
|
|
|
|
NDIS miniport wrapper definitions
|
|
|
|
Author:
|
|
|
|
|
|
Environment:
|
|
|
|
Kernel mode, FSD
|
|
|
|
Revision History:
|
|
|
|
Jun-95 Jameel Hyder Split up from a monolithic file
|
|
--*/
|
|
|
|
#ifndef __MINI_H
|
|
#define __MINI_H
|
|
|
|
//
|
|
// Macros for setting, clearing, and testing bits in the Miniport Flags.
|
|
//
|
|
#define MINIPORT_SET_FLAG(m, f) ((m)->Flags |= (f))
|
|
#define MINIPORT_CLEAR_FLAG(m, f) ((m)->Flags &= ~(f))
|
|
#define MINIPORT_TEST_FLAG(m, f) (((m)->Flags & (f)) != 0)
|
|
|
|
#define MINIPORT_SET_SEND_FLAG(m, f) ((m)->SendFlags |= (f))
|
|
#define MINIPORT_CLEAR_SEND_FLAG(m, f) ((m)->SendFlags &= ~(f))
|
|
#define MINIPORT_TEST_SEND_FLAG(m, f) (((m)->SendFlags & (f)) != 0)
|
|
|
|
//
|
|
// Flags for packet information.
|
|
//
|
|
#define MINIPORT_SET_PACKET_FLAG(p, f) ((p)->Private.NdisPacketFlags |= (f))
|
|
#define MINIPORT_CLEAR_PACKET_FLAG(p, f) ((p)->Private.NdisPacketFlags &= ~(f))
|
|
#define MINIPORT_TEST_PACKET_FLAG(p, f) (((p)->Private.NdisPacketFlags & (f)) != 0)
|
|
|
|
#define fPACKET_HAS_BEEN_LOOPED_BACK 0x01
|
|
#define fPACKET_HAS_TIMED_OUT 0x02
|
|
#define fPACKET_IS_IN_NDIS 0x04
|
|
|
|
|
|
#define NDIS_STATISTICS_HEADER_SIZE FIELD_OFFSET(NDIS_STATISTICS_VALUE,Data[0])
|
|
|
|
//
|
|
// Timeout values
|
|
//
|
|
#define NDIS_MINIPORT_WAKEUP_TIMEOUT 2000 // Wakeup DPC
|
|
#define NDIS_MINIPORT_DEFERRED_TIMEOUT 15 // Deferred timer
|
|
#define NDIS_MINIPORT_TR_RESET_TIMEOUT 15 // Number of WakeUps per reset attempt
|
|
|
|
//
|
|
// Internal definitions
|
|
//
|
|
typedef struct _NDIS_PACKET_RESERVED
|
|
{
|
|
PNDIS_PACKET Next;
|
|
PNDIS_M_OPEN_BLOCK Open;
|
|
} NDIS_PACKET_RESERVED, *PNDIS_PACKET_RESERVED;
|
|
|
|
|
|
#define PNDIS_RESERVED_FROM_PNDIS_PACKET(_packet) \
|
|
((PNDIS_PACKET_RESERVED)((_packet)->WrapperReserved))
|
|
|
|
//
|
|
// This structure is used by IndicatePacket/ReturnPacket code
|
|
// to keep track of references.
|
|
//
|
|
typedef struct _NDIS_PACKET_REFERENCE
|
|
{
|
|
PNDIS_MINIPORT_BLOCK Miniport;
|
|
union
|
|
{
|
|
UINT RefCount;
|
|
PNDIS_PACKET NextPacket;
|
|
};
|
|
} NDIS_PACKET_REFERENCE, *PNDIS_PACKET_REFERENCE;
|
|
|
|
#define PNDIS_REFERENCE_FROM_PNDIS_PACKET(_packet) \
|
|
((PNDIS_PACKET_REFERENCE)((_packet)->WrapperReserved))
|
|
|
|
//
|
|
// Used by the NdisCoRequest api to keep context information in the Request->NdisReserved
|
|
//
|
|
typedef struct _NDIS_COREQ_RESERVED
|
|
{
|
|
union
|
|
{
|
|
REQUEST_COMPLETE_HANDLER RequestCompleteHandler;
|
|
CO_REQUEST_COMPLETE_HANDLER CoRequestCompleteHandler;
|
|
};
|
|
NDIS_HANDLE VcContext;
|
|
union
|
|
{
|
|
NDIS_HANDLE AfContext;
|
|
PNDIS_M_OPEN_BLOCK Open;
|
|
};
|
|
NDIS_HANDLE PartyContext;
|
|
ULONG Flags;
|
|
PNDIS_REQUEST RealRequest;
|
|
} NDIS_COREQ_RESERVED, *PNDIS_COREQ_RESERVED;
|
|
|
|
#define COREQ_DOWNLEVEL 0x00000001
|
|
#define COREQ_GLOBAL_REQ 0x00000002
|
|
#define COREQ_QUERY_OIDS 0x00000004
|
|
#define COREQ_QUERY_STATS 0x00000008
|
|
#define COREQ_QUERY_SET 0x00000010
|
|
|
|
#define PNDIS_COREQ_RESERVED_FROM_REQUEST(_request) \
|
|
(PNDIS_COREQ_RESERVED)((_request)->NdisReserved)
|
|
|
|
#define MINIPORT_ENABLE_INTERRUPT(_M_) \
|
|
{ \
|
|
if ((_M_)->EnableInterruptHandler != NULL) \
|
|
{ \
|
|
((_M_)->EnableInterruptHandler)((_M_)->MiniportAdapterContext); \
|
|
} \
|
|
}
|
|
|
|
#define MINIPORT_SYNC_ENABLE_INTERRUPT(_M_) \
|
|
{ \
|
|
if ((_M_)->EnableInterruptHandler != NULL) \
|
|
{ \
|
|
SYNC_WITH_ISR(((_M_))->Interrupt->InterruptObject, \
|
|
((_M_)->EnableInterruptHandler), \
|
|
(_M_)->MiniportAdapterContext); \
|
|
} \
|
|
}
|
|
|
|
#define MINIPORT_DISABLE_INTERRUPT(_M_) \
|
|
{ \
|
|
ASSERT((_M_)->DisableInterruptHandler != NULL); \
|
|
((_M_)->DriverHandle->MiniportCharacteristics.DisableInterruptHandler)( \
|
|
(_M_)->MiniportAdapterContext); \
|
|
}
|
|
|
|
#define MINIPORT_SYNC_DISABLE_INTERRUPT(_M_) \
|
|
{ \
|
|
if ((_M_)->DisableInterruptHandler != NULL) \
|
|
{ \
|
|
SYNC_WITH_ISR(((_M_))->Interrupt->InterruptObject, \
|
|
((_M_)->DisableInterruptHandler), \
|
|
(_M_)->MiniportAdapterContext); \
|
|
} \
|
|
}
|
|
|
|
#define CHECK_FOR_NORMAL_INTERRUPTS(_M_) \
|
|
if ((((_M_)->Flags & (fMINIPORT_HALTING | fMINIPORT_IN_INITIALIZE)) == 0)&& \
|
|
((_M_)->Interrupt != NULL) && \
|
|
!(_M_)->Interrupt->IsrRequested && \
|
|
!(_M_)->Interrupt->SharedInterrupt) \
|
|
{ \
|
|
(_M_)->Flags |= fMINIPORT_NORMAL_INTERRUPTS; \
|
|
} \
|
|
else \
|
|
{ \
|
|
(_M_)->Flags &= ~fMINIPORT_NORMAL_INTERRUPTS; \
|
|
}
|
|
|
|
|
|
#define EXPERIMENTAL_SIZE 4
|
|
extern PNDIS_M_DRIVER_BLOCK ndisMiniDriverList;
|
|
extern KSPIN_LOCK ndisDriverListLock;
|
|
extern NDIS_MEDIUM * ndisMediumArray,
|
|
ndisMediumBuffer[NdisMediumMax + EXPERIMENTAL_SIZE];
|
|
extern UINT ndisMediumArraySize, ndisMediumArrayMaxSize;
|
|
|
|
//
|
|
// Filter package callback handlers
|
|
//
|
|
#define PNDIS_M_OPEN_FROM_BINDING_HANDLE(_handle) ((PNDIS_M_OPEN_BLOCK)(_handle))
|
|
|
|
typedef
|
|
NDIS_STATUS
|
|
(*WAN_RECEIVE_HANDLER) (
|
|
IN NDIS_HANDLE NdisLinkContext,
|
|
IN PUCHAR Packet,
|
|
IN ULONG PacketSize
|
|
);
|
|
|
|
typedef
|
|
NDIS_STATUS
|
|
(*PNDIS_M_WAN_SEND)(
|
|
IN NDIS_HANDLE NdisBindingHandle,
|
|
IN NDIS_HANDLE NdisLinkHandle,
|
|
IN PVOID Packet
|
|
);
|
|
|
|
VOID
|
|
ndisLastCountRemovedFunction(
|
|
IN struct _KDPC *Dpc,
|
|
IN PVOID DeferredContext,
|
|
IN PVOID SystemArgument1,
|
|
IN PVOID SystemArgument2
|
|
);
|
|
|
|
typedef struct _AsyncWorkItem
|
|
{
|
|
WORK_QUEUE_ITEM ExWorkItem;
|
|
PNDIS_MINIPORT_BLOCK Miniport;
|
|
ULONG Length;
|
|
BOOLEAN Cached;
|
|
PVOID VAddr;
|
|
PVOID Context;
|
|
NDIS_PHYSICAL_ADDRESS PhyAddr;
|
|
} ASYNC_WORKITEM, *PASYNC_WORKITEM;
|
|
|
|
|
|
VOID
|
|
ndisMQueuedAllocateSharedHandler(
|
|
IN PASYNC_WORKITEM pWorkItem
|
|
);
|
|
|
|
VOID
|
|
ndisMQueuedFreeSharedHandler(
|
|
IN PASYNC_WORKITEM pWorkItem
|
|
);
|
|
|
|
//
|
|
// Macro for the deferred send handler.
|
|
//
|
|
#define NDISM_START_SENDS(_M) (_M)->DeferredSendHandler((_M))
|
|
|
|
#define NDISM_DEFER_PROCESS_DEFERRED(_M) NdisSetTimer((_M)->DeferredTimer, NDIS_MINIPORT_DEFERRED_TIMEOUT);
|
|
|
|
//
|
|
// A list of registered address families are maintained here.
|
|
//
|
|
typedef struct _NDIS_AF_LIST
|
|
{
|
|
struct _NDIS_AF_LIST *NextGlobal; // Global. Head at ndisAfList;
|
|
struct _NDIS_AF_LIST *NextOpen; // For this miniport Head at NDIS_MINIPORT_BLOCK
|
|
|
|
PNDIS_M_OPEN_BLOCK Open; // Back pointer to the open-block
|
|
|
|
NDIS_AF AddressFamily;
|
|
|
|
NDIS_CALL_MANAGER_CHARACTERISTICS CmChars;
|
|
} NDIS_AF_LIST, *PNDIS_AF_LIST;
|
|
|
|
extern PNDIS_AF_LIST ndisAfList;
|
|
|
|
#endif // __MINI_H
|