windows-nt/Source/XPSP1/NT/net/rras/ndis/raspppoe/protocol.h
2020-09-26 16:20:57 +08:00

460 lines
11 KiB
C

#ifndef _PROTOCOL_H_
#define _PROTOCOL_H_
#define PR_NDIS_MajorVersion 4
#define PR_NDIS_MinorVersion 0
#define PR_CHARACTERISTIC_NAME "RasPppoe"
typedef struct _CALL* PCALL;
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Functional Description:
These macros will be called by PacketCreateForReceived() and DereferencePacket()
functions when a PPPOE_PACKET with references to a packet owned by NDIS is
created and freed, respectively.
---------------------------------------------------------------------------*/
#define PrPacketOwnedByNdisReceived( pB ) \
NdisInterlockedIncrement( &(pB)->NumPacketsOwnedByNdis )
#define PrPacketOwnedByNdisReturned( pB ) \
NdisInterlockedDecrement( &(pB)->NumPacketsOwnedByNdis )
//
// Constants
//
#define BN_SetFiltersForMediaDetection 0x00000001
#define BN_SetFiltersForMakeCall 0x00000002
#define BN_ResetFiltersForCloseLine 0x00000003
//
// These are the states that a binding can be in.
// They are pretty self explanatory.
//
typedef enum
_BINDING_STATE
{
BN_stateIdle = 0,
BN_stateBindPending,
BN_stateBound,
BN_stateSleepPending,
BN_stateSleeping,
BN_stateUnbindPending,
BN_stateUnbound
}
BINDING_STATE;
//
// These are the schedulable work items for the bindings:
//
// - BWT_workPrSend: This work item is scheduled by PrBroadcast() with a copy of a
// packet given to broadcast. When it runs, it sends the clone packet.
//
// - BWT_PrReceiveComplete: This work item is scheduled by PrReceivePacket() if a packet is received
// and there is no PrReceiveComplete() running to drain the receive queue.
//
typedef enum
_BINDING_WORKTYPE
{
BWT_workUnknown = 0,
BWT_workPrStartBinds,
BWT_workPrSend,
BWT_workPrReceiveComplete
}
BINDING_WORKTYPE;
//
// This is the binding context.
// All information pertinent to our bindings are kept here.
//
typedef struct
_BINDING
{
//
// Link to other bindings in the protocols binding list
//
LIST_ENTRY linkBindings;
//
// Tag that identifies the binding (used for debugging)
//
ULONG tagBinding;
//
// Keeps reference count on the binding.
// References are added and deleted for the following operations:
//
// (a) A reference is added in AddBindingToProtocol and removed in RemoveBindingFromProtocol
//
// (b) A reference is added when a call is added, and removed when call is removed.
//
// (c) A reference is added when a BWT_workPrSend item is scheduled and removed when
// work item is executed.
//
// (d) A reference must be added before sending a packet, and must be removed if NdisSend()
// completes synchronously. Otherwise it will be removed by PrSendComplete() function
// when Ndis calls it to notify the completion of the send.
//
LONG lRef;
//
// (a) BNBF_OpenAdapterCompleted: This flag will be set by PrOpenAdapterComplete().
//
// (b) BNBF_CurrentAddressQueryCompleted: This flag will be set by PrRequestComplete().
//
// (c) BNBF_LinkSpeedQueryCompleted: This flag will be set by PrRequestComplete().
//
// (d) BNBF_MaxFrameSizeQueryCompleted: This flag will be set by PrRequestComplete().
//
// (e) BNBF_BindAdapterCompleted: This flag will be set by PrBindAdapter().
//
// (f) BNBF_CloseAdapterCompleted: This flag will be set by PrCloseAdapterComplete().
//
// (g) BNBF_PacketFilterSet: This flag indicates that the packet filter for the binding is set.
// It will be set and reset in ChangePacketFiltersForBindings().
//
// (h) BNBF_PacketFilterChangeInProgress: This flag indicates that the binding is referenced for
// packet filter change.
//
ULONG ulBindingFlags;
#define BNBF_OpenAdapterCompleted 0x00000001
#define BNBF_CurrentAddressQueryCompleted 0x00000002
#define BNBF_LinkSpeedQueryCompleted 0x00000004
#define BNBF_MaxFrameSizeQueryCompleted 0x00000008
#define BNBF_BindAdapterCompleted 0x00000010
#define BNBF_CloseAdapterCompleted 0x00000020
#define BNBF_PacketFilterSet 0x00000040
#define BNBF_PacketFilterChangeInProgress 0x00000080
//
// Shows the status of the bind adapter operation.
// Valid only if BNBF_BindAdapterCompleted is set.
//
NDIS_STATUS BindAdapterStatus;
//
// Shows the status of the open adapter operation.
// Valid only if BNBF_OpenAdapterCompleted is set.
//
NDIS_STATUS OpenAdapterStatus;
//
// Shows the status of the latest request made to NDIS.
//
NDIS_STATUS RequestStatus;
//
// Ndis Request structure passed to the underlying NIC cards
//
NDIS_REQUEST Request;
//
// Event to be signaled when requests are completed.
//
NDIS_EVENT RequestCompleted;
//
// Keeps the MAC address of the NIC card represented by this binding.
// This information is obtained from the underlying by passing it a set of OID queries
//
CHAR LocalAddress[6];
//
// Keeps the speed of the NIC cards represented by this binding.
// This information is obtained from the underlying by passing it a set of OID queries
//
ULONG ulSpeed;
//
// Max frame size of the underlying NIC
//
ULONG ulMaxFrameSize;
//
// Keeps the filter information for this binding.
//
ULONG ulPacketFilter;
//
// This is the handle returned to us by NdisOpenAdapter().
// It is the handle for accessing the underlying NIC card represented by this binding.
//
NDIS_HANDLE NdisBindingHandle;
//
// This is the index of the supported medium by the underlying NIC card.
//
UINT uintSelectedMediumIndex;
//
// This is the event that we wait on in PrUnbindAdapter().
// It will be signaled from DereferenceBinding() when ref count of the binding reaches 0.
//
NDIS_EVENT eventFreeBinding;
//
// Spin lock to synchronize access to shared members
//
NDIS_SPIN_LOCK lockBinding;
//
// Indicates state information about the binding
//
BINDING_STATE stateBinding;
//
// Flag that indicates that the receive loop is running.
// To make sure the serialization of PPP packets, we can not let more than 1 threads
// making receive indications to NDISWAN
//
BOOLEAN fRecvLoopRunning;
//
// List of received packets waiting to be processed by ProtocolReceiveComplete()
//
LIST_ENTRY linkPackets;
//
// This is the number of packets that are received that are owned by NDIS and must
// be returned back to NDIS.
//
LONG NumPacketsOwnedByNdis;
}
BINDING, *PBINDING;
/////////////////////////////////////////////////////////////////////////////
//
//
// Local macros
//
/////////////////////////////////////////////////////////////////////////////
#define ALLOC_BINDING( ppB ) NdisAllocateMemoryWithTag( ppB, sizeof( BINDING ), MTAG_BINDING )
#define FREE_BINDING( pB ) NdisFreeMemory( pB, sizeof( BINDING ), 0 )
#define VALIDATE_BINDING( pB ) ( ( pB ) && ( pB->tagBinding == MTAG_BINDING ) )
NDIS_STATUS
InitializeProtocol(
IN NDIS_HANDLE NdisProtocolHandle,
IN PUNICODE_STRING RegistryPath
);
VOID
PrLoad(
VOID
);
BINDING*
AllocBinding();
VOID
ReferenceBinding(
IN BINDING* pBinding,
IN BOOLEAN fAcquireLock
);
VOID
DereferenceBinding(
IN BINDING* pBinding
);
VOID
BindingCleanup(
IN BINDING* pBinding
);
VOID
DetermineMaxFrameSize();
VOID
ChangePacketFiltersForAdapters(
BOOLEAN fSet
);
VOID
AddBindingToProtocol(
IN BINDING* pBinding
);
VOID
RemoveBindingFromProtocol(
IN BINDING* pBinding
);
VOID
PrUnload(
VOID
);
NDIS_STATUS
PrRegisterProtocol(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath,
OUT NDIS_HANDLE* pNdisProtocolHandle
);
VOID
PrBindAdapter(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE BindContext,
IN PNDIS_STRING DeviceName,
IN PVOID SystemSpecific1,
IN PVOID SystemSpecific2
);
BOOLEAN
PrOpenAdapter(
IN BINDING* pBinding,
IN PNDIS_STRING DeviceName
);
VOID
PrOpenAdapterComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status,
IN NDIS_STATUS OpenErrorStatus
);
BOOLEAN
PrQueryAdapterForCurrentAddress(
IN BINDING* pBinding
);
BOOLEAN
PrQueryAdapterForLinkSpeed(
IN BINDING* pBinding
);
BOOLEAN
PrQueryAdapterForMaxFrameSize(
IN BINDING* pBinding
);
BOOLEAN
PrSetPacketFilterForAdapter(
IN BINDING* pBinding,
IN BOOLEAN fSet
);
VOID
PrRequestComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_REQUEST pRequest,
IN NDIS_STATUS status
);
VOID
PrUnbindAdapter(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE UnbindContext
);
VOID
PrCloseAdapter(
IN BINDING* pBinding
);
VOID
PrCloseAdapterComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status
);
BOOLEAN
PrAddCallToBinding(
IN BINDING* pBinding,
IN PCALL pCall
);
VOID
PrRemoveCallFromBinding(
IN BINDING* pBinding,
IN PCALL pCall
);
VOID
PrSendComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_PACKET pNdisPacket,
IN NDIS_STATUS Status
);
INT
PrReceivePacket(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_PACKET Packet
);
NDIS_STATUS
PrBroadcast(
IN PPPOE_PACKET* pPacket
);
VOID
ExecBindingWorkItem(
PVOID Args[4],
UINT workType
);
NDIS_STATUS
PrReceive(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE MacReceiveContext,
IN PVOID HeaderBuffer,
IN UINT HeaderBufferSize,
IN PVOID LookAheadBuffer,
IN UINT LookaheadBufferSize,
IN UINT PacketSize
);
VOID
PrTransferDataComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_PACKET Packet,
IN NDIS_STATUS Status,
IN UINT BytesTransferred
);
VOID
PrReceiveComplete(
IN NDIS_HANDLE ProtocolBindingContext
);
ULONG
PrQueryMaxFrameSize();
NDIS_STATUS
PrSend(
IN BINDING* pBinding,
IN PPPOE_PACKET* pPacket
);
VOID
PrStatus(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS GeneralStatus,
IN PVOID StatusBuffer,
IN UINT StatusBufferSize
);
NDIS_STATUS
PrPnPEvent(
IN NDIS_HANDLE hProtocolBindingContext,
IN PNET_PNP_EVENT pNetPnPEvent
);
VOID
PrReEnumerateBindings(
VOID
);
#endif