460 lines
11 KiB
C
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
|
|
|