/*++

Copyright (c) 1991  Microsoft Corporation

Module Name:

    dlext.h

Abstract:

    This module includes all internal function prototypes
    and external global variables.

Author:

    Antti Saarenheimo (o-anttis) 17-MAY-1991

Revision History:

--*/

//
// External variables:
//

extern DLC_LINK_PARAMETERS DefaultParameters;
extern UCHAR auchLlcCommands[];
extern UCHAR Swap[];
extern LLC_TICKS TimerTicks;
extern ULONG AbsoluteTime;
extern BOOLEAN TraceEnabled;
extern LLC_XID_INFORMATION Ieee802Xid;
extern PMDL pXidMdl;
extern KSPIN_LOCK LlcSpinLock;
extern PVOID LlcProtocolHandle;
extern NDIS_PROTOCOL_CHARACTERISTICS LlcCharacteristics;
extern KMUTEX NdisAccessMutex;
extern KSEMAPHORE OpenAdapterSemaphore;
extern UINT NdisSendCount;
extern PADAPTER_CONTEXT pAdapters;
extern UCHAR PrimaryStates[];
extern UCHAR SecondaryStates[];
#ifdef NDIS40
extern NDIS_EVENT PnPBindsComplete;
#endif // NDIS40

UINT
CopyReceivedLanHeader(
    IN UINT TransltionCase,
    IN PUCHAR DestinationAddress,
    IN PUCHAR SourceAddress
    );

UCHAR
CopyLanHeader(
    IN UINT AddressTranslationMode,
    IN PUCHAR pSrcLanHeader,
    IN PUCHAR pNodeAddress,
    OUT PUCHAR pDestLanHeader,
    IN BOOLEAN SwapAddressBits
    );

VOID
SwappingMemCpy(
    IN PUCHAR pDest,
    IN PUCHAR pSrc,
    IN UINT Len
    );

UINT
RunStateMachine(
    IN OUT PDATA_LINK pLink,
    IN USHORT usInput,
    IN BOOLEAN boolPollFinal,
    IN BOOLEAN boolResponse
    );

UINT
RunInterlockedStateMachineCommand(
    PDATA_LINK pStation,
    USHORT Command
    );

VOID
SaveStatusChangeEvent(
    IN PDATA_LINK pLink,
    IN PUCHAR puchLlcHdr,
    IN BOOLEAN boolResponse
    );

VOID
ResendPackets(
    IN OUT PDATA_LINK pLink    // data link strcuture
    );

VOID
UpdateVa(
    IN OUT PDATA_LINK pLink    // data link station strcuture
    );

VOID
UpdateVaChkpt(
    IN OUT PDATA_LINK pLink     // data link station strcuture
    );

VOID
AdjustWw(
    IN OUT PDATA_LINK pLink    // data link strcuture
    );

VOID
SendAck(
    IN OUT PDATA_LINK pLink
    );

UINT
RunStateMachineCommand(
    IN OUT PVOID hLink,
    IN UINT uiInput
    );

PDATA_LINK
SearchLink(
    IN PADAPTER_CONTEXT pAdapterContext,
    IN LAN802_ADDRESS LanAddr
    );

PDATA_LINK *
SearchLinkAddress(
    IN PADAPTER_CONTEXT pAdapterContext,
    IN LAN802_ADDRESS LanAddr
    );

DLC_STATUS
SetLinkParameters(
    IN OUT PDATA_LINK pLink,
    IN PUCHAR pNewParameters
    );

DLC_STATUS
CheckLinkParameters(
    PDLC_LINK_PARAMETERS pParms
    );

VOID
CopyLinkParameters(
    OUT PUCHAR pOldParameters,
    IN PUCHAR pNewParameters,
    IN PUCHAR pDefaultParameters
    );

VOID
CompleteClose(
    IN PLLC_OBJECT pLlcObject,
    IN UINT Status
    );

NDIS_STATUS
InitNdisPackets(
    OUT PLLC_NDIS_PACKET * ppLlcPacketPool,
    IN NDIS_HANDLE hNdisPool
    );

VOID
LlcResetPacket(
    IN OUT PLLC_NDIS_PACKET pNdisPacket
    );

NDIS_STATUS
GetNdisParameter(
    IN PADAPTER_CONTEXT pAdapterContext,
    IN NDIS_OID NdisOid,
    IN PVOID pDataAddress,
    IN UINT DataSize
    );

DLC_STATUS
SyncNdisRequest(
    IN PADAPTER_CONTEXT pAdapterContext,
    IN PLLC_NDIS_REQUEST pRequest
    );

NDIS_STATUS
WaitAsyncOperation(
    IN PKEVENT pEvent,
    IN PNDIS_STATUS pAsyncStatus,
    IN NDIS_STATUS Status
    );

#ifdef LLC_PRIVATE_NDIS_PROTOTYPES

NDIS_STATUS
LlcNdisReceiveIndication (
    IN PADAPTER_CONTEXT pAdapterContext,
    IN NDIS_HANDLE MacReceiveContext,
    IN PVOID pHeadBuf,
    IN UINT cbHeadBuf,
    IN PVOID pLookBuf,
    IN UINT cbLookBuf,
    IN UINT cbPacketSize
    );

VOID
LlcNdisSendComplete(
    IN PADAPTER_CONTEXT pAdapterContext,
    IN PNDIS_PACKET pNdisPacket,
    IN NDIS_STATUS NdisStatus
    );

VOID
LlcNdisReceiveComplete(
    IN PADAPTER_CONTEXT pAdapterContext
    );

VOID
LlcNdisTransferDataComplete(
    IN PADAPTER_CONTEXT pAdapterContext,
    IN PNDIS_PACKET pPacket,
    IN NDIS_STATUS NdisStatus,
    IN UINT uiBytesTransferred
    );

VOID
LlcNdisOpenAdapterComplete(
    IN PVOID hAdapterContext,
    IN NDIS_STATUS NdisStatus,
    IN NDIS_STATUS OpenErrorStatus
    );

VOID
LlcNdisCloseComplete(
    IN PADAPTER_CONTEXT pAdapterContext,
    IN NDIS_STATUS NdisStatus
    );

VOID
LlcNdisRequestComplete(
    IN PADAPTER_CONTEXT pAdapterContext,
    IN PNDIS_REQUEST RequestHandle,
    IN NDIS_STATUS NdisStatus
    );

VOID
LlcNdisResetComplete(
    PADAPTER_CONTEXT pAdapterContext,
    NDIS_STATUS NdisStatus
    );

VOID
NdisStatusHandler(
    IN PADAPTER_CONTEXT pAdapterContext,
    IN NDIS_STATUS NdisStatus,
    IN PVOID StatusBuffer,
    IN UINT StatusBufferSize
    );

#else

VOID
NdisStatusHandler(
    IN PVOID hAdapterContext,
    IN NDIS_STATUS NdisStatus,
    IN PVOID StatusBuffer,
    IN UINT StatusBufferSize
    );

VOID
LlcNdisTransferDataComplete(
    IN PVOID hAdapterContext,
    IN PNDIS_PACKET Packet,
    IN NDIS_STATUS NdisStatus,
    IN UINT uiBytesTransferred
    );

VOID
LlcNdisRequestComplete(
    IN PVOID hAdapterContext,
    IN PNDIS_REQUEST RequestHandle,
    IN NDIS_STATUS NdisStatus
    );

VOID
LlcNdisOpenAdapterComplete(
    PVOID hAdapterContext,
    NDIS_STATUS NdisStatus,
    NDIS_STATUS OpenErrorStatus
    );

VOID
LlcNdisStatus(
    IN PVOID hAdapterContext,
    IN NDIS_STATUS Status,
    IN UINT SpecificStatus
    );

VOID
LlcNdisStatusComplete(
    IN PVOID hAdapterContext
    );

NDIS_STATUS
LlcNdisReceiveIndication (
    IN PVOID pAdapterContext,
    IN NDIS_HANDLE MacReceiveContext,
    IN PVOID pHeadBuf,
    IN UINT cbHeadBuf,
    IN PVOID pLookBuf,
    IN UINT cbLookBuf,
    IN UINT cbPacketSize
    );

VOID
LlcNdisSendComplete(
    IN PVOID hAdapter,
    IN PNDIS_PACKET Packet,
    IN NDIS_STATUS NdisStatus
    );

VOID
LlcNdisResetComplete(
    PVOID hAdapterContext,
    NDIS_STATUS NdisStatus
    );

VOID
LlcNdisCloseComplete(
    PVOID hAdapterContext,
    NDIS_STATUS NdisStatus
    );

VOID
LlcNdisReceiveComplete(
    IN PVOID hAdapter
    );

#ifdef NDIS40
VOID
LlcBindAdapterHandler(
    OUT PNDIS_STATUS  pStatus,
    IN  NDIS_HANDLE   BindContext,
    IN  PNDIS_STRING  pDeviceName,
    IN  PVOID         SystemSpecific1,
    IN  PVOID         SystemSpecific2
    );

VOID
LlcUnbindAdapterHandler(
    OUT PNDIS_STATUS pStatus,
    IN  NDIS_HANDLE  ProtocolBindingContext,
    IN  NDIS_HANDLE  UnbindContext
    );

NDIS_STATUS
LlcPnPEventHandler(
    IN  NDIS_HANDLE             ProtocolBindingContext,
    IN  PNET_PNP_EVENT          pNetPnPEvent
    );

VOID
CloseAllAdapters();

#endif // NDIS40


#endif

VOID
ProcessType1_Frames(
    IN PADAPTER_CONTEXT pAdapterContext,
	IN NDIS_HANDLE MacReceiveContext,
    IN PLLC_SAP pSap,
    IN LLC_HEADER LlcHeader
    );

VOID
MakeRcvIndication(
    IN PADAPTER_CONTEXT pAdapterContext,
	IN NDIS_HANDLE MacReceiveContext,
    IN PLLC_OBJECT pStation
    );

VOID
ProcessType2_Frames(
    IN PADAPTER_CONTEXT pAdapterContext,
	IN NDIS_HANDLE MacReceiveContext,
    IN OUT PDATA_LINK pLink,
    IN LLC_HEADER LlcHeader
    );

VOID
ProcessNewSabme(
    IN PADAPTER_CONTEXT pAdapterContext,
    IN PLLC_SAP pSap,
    IN LLC_HEADER LlcHeader
    );

VOID
SaveReceiveEvent(
    IN PADAPTER_CONTEXT pAdapterContext,
    IN PLLC_TRANSFER_PACKET pTransferPacket
    );

VOID
RunSendTaskAndUnlock(
    IN PADAPTER_CONTEXT pAdapterContext
    );

VOID
BackgroundProcessAndUnlock(
    IN PADAPTER_CONTEXT pAdapter
    );

VOID
BackgroundProcess(
    IN PADAPTER_CONTEXT pAdapter
    );

PLLC_PACKET
GetI_Packet(
    IN PADAPTER_CONTEXT pAdapter
    );

VOID
StartSendProcess(
    IN PADAPTER_CONTEXT pAdapter,
    IN PDATA_LINK pLink
    );

VOID
EnableSendProcess(
    IN PDATA_LINK pLink
    );

VOID
StopSendProcess(
    IN PADAPTER_CONTEXT pAdapter,
    IN PDATA_LINK pLink
    );

VOID DisableSendProcess(
    IN PDATA_LINK pLink
    );

PLLC_PACKET
BuildDirOrU_Packet(
    PADAPTER_CONTEXT pAdapter
    );

DLC_STATUS
SendLlcFrame(
    IN PDATA_LINK pLink,
    IN UCHAR LlcCommandId
    );

PLLC_PACKET
GetLlcCommandPacket(
    PADAPTER_CONTEXT pAdapter
    );

VOID
SendNdisPacket(
    IN PADAPTER_CONTEXT pAdapterContext,
    IN PLLC_PACKET pPacket
    );

VOID
CompleteSendAndLock(
    IN PADAPTER_CONTEXT pAdapterContext,
    IN PLLC_NDIS_PACKET NdisPacket,
    IN NDIS_STATUS NdisStatus
    );

VOID
RespondTestOrXid(
    IN PADAPTER_CONTEXT pAdapterContext,
	IN NDIS_HANDLE MacReceiveContext,
    IN LLC_HEADER LlcHeader,
    IN UINT SourceSap
    );

VOID
CopyNonZeroBytes(
    OUT PUCHAR pOldParameters,
    IN PUCHAR pNewParameters,
    IN PUCHAR pDefaultParameters,
    IN UINT Length
    );

VOID
ScanTimersDpc(
    IN PKDPC Dpc,
    IN PVOID DeferredContext,
    IN PVOID SystemArgument1,
    IN PVOID SystemArgument2
    );

BOOLEAN
TerminateTimer(
    IN PADAPTER_CONTEXT pAdapterContext,
    IN PLLC_TIMER pTimer
    );

DLC_STATUS
InitializeLinkTimers(
    IN OUT PDATA_LINK pLink
    );

DLC_STATUS
InitializeTimer(
    IN PADAPTER_CONTEXT pAdapterContext,
    PLLC_TIMER pTimer,
    UCHAR TickCount,
    UCHAR TickOne,
    UCHAR TickTwo,
    UINT Input,
    PVOID hContextHandle,
    UINT DefaultDelay,
    IN BOOLEAN StartNewTimer
    );

VOID
StartTimer(
    IN PLLC_TIMER pTimer
    );

BOOLEAN
StopTimer(
    IN PLLC_TIMER pTimer
    );

VOID
SwapMemCpy(
    IN BOOLEAN SwapBytes,
    IN PUCHAR pDest,
    IN PUCHAR pSrc,
    IN UINT Len
    );

VOID
LlcSleep(
    IN LONG lMicroSeconds
    );

DLC_STATUS
LlcInitUnicodeString(
    IN PUNICODE_STRING pStringDest,
    IN PUNICODE_STRING pStringSrc
    );

VOID
LlcFreeUnicodeString(
    IN PUNICODE_STRING UnicodeString
    );

VOID
InitiateAsyncLinkCommand(
    IN PDATA_LINK pLink,
    IN PLLC_PACKET pPacket,
    UINT StateMachineCommand,
    UINT CompletionCode
    );

VOID
AllocateCompletionPacket(
    IN PLLC_OBJECT pLlcObject,
    IN UINT CompletionCode,
    IN PVOID pPacket
    );

VOID
QueueCommandCompletion(
    IN PLLC_OBJECT pLlcObject,
    IN UINT CompletionCode,
    IN UINT Status
    );

DLC_STATUS
LinkFlowControl(
    IN PDATA_LINK pLink,
    IN UCHAR FlowControlState
    );

VOID
LlcInitializeTimerSystem(
    VOID
    );

VOID
LlcTerminateTimerSystem(
    VOID
    );

VOID
ExecuteAllBackroundProcesses(
    VOID
    );

DLC_STATUS
UpdateFunctionalAddress(
    IN PADAPTER_CONTEXT pAdapter
    );

DLC_STATUS
UpdateGroupAddress(
    IN PADAPTER_CONTEXT pAdapter,
    IN PBINDING_CONTEXT pBindingContext
    );

NDIS_STATUS
SetNdisParameter(
    IN PADAPTER_CONTEXT pAdapterContext,
    IN NDIS_OID Oid,
    IN PVOID pRequestInfo,
    IN UINT RequestLength
    );

VOID
CancelTransmitCommands(
    IN PLLC_OBJECT pLlcObject,
    IN UINT Status
    );

VOID
CancelTransmitsInQueue(
    IN PLLC_OBJECT pLlcObject,
    IN UINT Status,
    IN PLIST_ENTRY pQueue,
    IN PLLC_QUEUE pLlcQueue
    );

VOID
LlcNdis30RequestComplete(
    IN PVOID hAdapterContext,
    IN PNDIS_REQUEST RequestHandle,
    IN NDIS_REQUEST_TYPE RequestType,
    IN NDIS_STATUS NdisStatus
    );

VOID
LlcNdis30TransferDataComplete(
    IN PVOID pAdapterContext,
    IN PNDIS_REQUEST RequestHandle,
    IN NDIS_STATUS NdisStatus
    );

VOID
CompletePendingLlcCommand(
    PLLC_OBJECT pLlcObject
    );

DLC_STATUS
CheckAndDuplicatePacket(
#if DBG
    IN PADAPTER_CONTEXT pAdapterContext,
#endif
    IN PBINDING_CONTEXT pBinding,
    IN PLLC_PACKET pPacket,
    IN PLLC_QUEUE pQueue
    );

VOID
QueuePacket(
    IN PADAPTER_CONTEXT pAdapterContext,
    IN PLLC_QUEUE pQueue,
    IN PLLC_PACKET pPacket
    );

VOID
PrintLastInputs(
    IN PUCHAR pszMessage,
    IN PDATA_LINK pLink
    );

VOID
BackgroundProcessWithinLock(
    IN PADAPTER_CONTEXT pAdapterContext
    );


#ifdef LLC_PRIVATE_PROTOTYPES

//
// LLCADDR.C...
//

UINT
LlcCopyReceivedLanHeader(
    IN PBINDING_CONTEXT pBinding,
    IN PUCHAR DestinationAddress,
    IN PUCHAR SourceAddress
    );

//
// LLCLINK.C...
//

DLC_STATUS
LlcOpenLinkStation(
    IN PLLC_SAP pSap,
    IN UCHAR DestinationSap,
    IN PUCHAR pDestinationAddress OPTIONAL,
    IN PUCHAR pReceivedLanHeader OPTIONAL,
    IN PVOID hClientStation,
    OUT PVOID *phLlcHandle
    );

VOID
LlcBindLinkStation(
    IN PDATA_LINK pStation,
    IN PVOID hClientHandle
    );

VOID
LlcConnectStation(
    IN PDATA_LINK pStation,
    IN PLLC_PACKET pPacket,
    IN PVOID pSourceRouting OPTIONAL,
    IN PUSHORT pusMaxInformationField
    );

VOID
LlcDisconnectStation(
    IN PDATA_LINK pLink,
    IN PLLC_PACKET pPacket
    );

DLC_STATUS
LlcFlowControl(
    IN PLLC_OBJECT pStation,
    IN UCHAR FlowControlState
    );

DLC_STATUS
LlcResetBroadcastAddresses(
    IN PBINDING_CONTEXT pBindingContext
    );

//
// LLCNDIS.C...
//

VOID
LlcDisableAdapter(
    IN PBINDING_CONTEXT pBindingContext
    );

DLC_STATUS
LlcCloseAdapter(
    IN PBINDING_CONTEXT pBindingContext,
    IN BOOLEAN CloseAtNdisLevel
    );

VOID
LlcNdisReset(
    IN PBINDING_CONTEXT pBindingContext,
    IN PLLC_PACKET pPacket
    );

//
// LLCOBJ.C...
//

DLC_STATUS
LlcOpenStation(
    IN PBINDING_CONTEXT pBindingContext,
    IN PVOID hClientHandle,
    IN USHORT ObjectAddress,
    IN UCHAR ObjectType,
    IN USHORT OpenOptions,
    OUT PVOID* phStation
    );

DLC_STATUS
LlcCloseStation(
    IN PLLC_OBJECT pStation,
    IN PLLC_PACKET pCompletionPacket
    );

VOID
CompleteObjectDelete(
    IN PLLC_OBJECT pStation
    );

VOID
LlcSetDirectOpenOptions(
    IN PLLC_OBJECT pDirect,
    IN USHORT OpenOptions
    );

//
// LLCRCV.C...
//

VOID
LlcTransferData(
    IN PBINDING_CONTEXT pBindingContext,
	IN NDIS_HANDLE MacReceiveContext,
    IN PLLC_PACKET pPacket,
    IN PMDL pMdl,
    IN UINT uiCopyOffset,
    IN UINT cbCopyLength
    );

//
// LLCSEND.C...
//

VOID
LlcSendI(
    IN PDATA_LINK pStation,
    IN PLLC_PACKET pPacket
    );

VOID
LlcSendU(
    IN PLLC_OBJECT pStation,
    IN PLLC_PACKET pPacket,
    IN UINT eFrameType,
    IN UINT uDestinationSap
    );

#else

//
// LLCADDR.C...
//

UINT
LlcCopyReceivedLanHeader(
    IN PVOID pBinding,
    IN PUCHAR DestinationAddress,
    IN PUCHAR SourceAddress
    );

//
// LLCLINK.C...
//

DLC_STATUS
LlcOpenLinkStation(
    IN PVOID pSap,
    IN UCHAR DestinationSap,
    IN PUCHAR pDestinationAddress OPTIONAL,
    IN PUCHAR pReceivedLanHeader OPTIONAL,
    IN PVOID hClientStation,
    OUT PVOID *phLlcHandle
    );

VOID
LlcBindLinkStation(
    IN PVOID pStation,
    IN PVOID hClientHandle
    );

VOID
LlcConnectStation(
    IN PVOID pStation,
    IN PLLC_PACKET pPacket,
    IN PVOID pSourceRouting OPTIONAL,
    IN PUSHORT pusMaxInformationField
    );

VOID
LlcDisconnectStation(
    IN PVOID pLink,
    IN PLLC_PACKET pPacket
    );

DLC_STATUS
LlcFlowControl(
    IN PVOID pStation,
    IN UCHAR FlowControlState
    );

DLC_STATUS
LlcResetBroadcastAddresses(
    IN PVOID pBindingContext
    );

//
// LLCNDIS.C...
//

VOID
LlcDisableAdapter(
    IN PVOID pBindingContext
    );


DLC_STATUS
LlcCloseAdapter(
    IN PVOID pBindingContext,
    IN BOOLEAN CloseAtNdisLevel
    );

VOID
LlcNdisReset(
    IN PVOID pBindingContext,
    IN PLLC_PACKET pPacket
    );

//
// LLCOBJ.C...
//

DLC_STATUS
LlcOpenStation(
    IN PVOID pBindingContext,
    IN PVOID hClientHandle,
    IN USHORT ObjectAddress,
    IN UCHAR ObjectType,
    IN USHORT OpenOptions,
    OUT PVOID* phStation
    );

DLC_STATUS
LlcCloseStation(
    IN PVOID pStation,
    IN PLLC_PACKET pCompletionPacket
    );

VOID
CompleteObjectDelete(
    IN PVOID pStation
    );

VOID
LlcSetDirectOpenOptions(
    IN PVOID pDirect,
    IN USHORT OpenOptions
    );

//
// LLCRCV.C...
//
VOID
LlcTransferData(
    IN PBINDING_CONTEXT pBindingContext,
	IN NDIS_HANDLE MacReceiveContext,
    IN PLLC_PACKET pPacket,
    IN PMDL pMdl,
    IN UINT uiCopyOffset,
    IN UINT cbCopyLength
    );

//
// LLCSEND.C...
//

VOID
LlcSendI(
    IN PVOID pStation,
    IN PLLC_PACKET pPacket
    );

VOID
LlcSendU(
    IN PVOID pStation,
    IN PLLC_PACKET pPacket,
    IN UINT eFrameType,
    IN UINT uDestinationSap
    );

#endif