/*++

Copyright (c) 1996  Microsoft Corporation

Module Name:

    macros.h

Abstract:

	Macros for the ATMARP module

Author:


Revision History:

    Who         When        What
    --------    --------    ----
    arvindm     05-20-96    created

Notes:


--*/
#ifndef __ATMARP_MACROS_H_INCLUDED
#define __ATMARP_MACROS_H_INCLUDED

#include "atmarp.h"

#define INCR_STAT(_x)	NdisInterlockedIncrement(&(_x))

#ifndef MAX

/*++
OPAQUE
MAX(
	IN	OPAQUE		Fred,
	IN	OPAQUE		Shred
)
--*/
#define MAX(Fred, Shred)		(((Fred) > (Shred)) ? (Fred) : (Shred))

#endif // MAX


#ifndef MIN

/*++
OPAQUE
MIN(
	IN	OPAQUE		Fred,
	IN	OPAQUE		Shred
)
--*/
#define MIN(Fred, Shred)		(((Fred) < (Shred)) ? (Fred) : (Shred))

#endif // MIN


/*++
ULONG
ATMARP_HASH(
	IN	IP_ADDRESS	IpAddress
)
--*/
#define ATMARP_HASH(IpAddress)	\
			(((ULONG)(IpAddress)) % ATMARP_TABLE_SIZE)


/*++
VOID
AA_SET_FLAG(
	IN	ULONG		Flags,
	IN	ULONG		Mask,
	IN	ULONG		Val
)
--*/
#define AA_SET_FLAG(Flags, Mask, Val)	\
			(Flags) = ((Flags) & ~(Mask)) | (Val)


/*++
BOOLEAN
AA_IS_FLAG_SET(
	IN	ULONG		Flags,
	IN	ULONG		Mask,
	IN	ULONG		Val
)
--*/
#define AA_IS_FLAG_SET(Flags, Mask, Val)	\
			(((Flags) & (Mask)) == (Val))

#ifdef IPMCAST

/*++
VOID
AAMC_SET_IF_STATE(
	IN	PATMARP_INTERFACE	_pIf,
	IN	ULONG				_NewState
)
Set the Multicast state for the specified Interface to the given value.
--*/
#define AAMC_SET_IF_STATE(_pIf, _NewState)	\
			AA_SET_FLAG((_pIf)->Flags, AAMC_IF_STATE_MASK, (_NewState))


/*++
ULONG
AAMC_IF_STATE(
	IN	PATMARP_INTERFACE	_pIf
)
Get the Multicast state for the specified Interface.
--*/
#define AAMC_IF_STATE(_pIf)	((_pIf)->Flags & AAMC_IF_STATE_MASK)



#endif // IPMCAST

/*++
VOID
AA_INIT_BLOCK_STRUCT(
	IN	ATMARP_BLOCK	*pBlock
)
--*/
#define AA_INIT_BLOCK_STRUCT(pBlock)		NdisInitializeEvent(&((pBlock)->Event))


/*++
NDIS_STATUS
AA_WAIT_ON_BLOCK_STRUCT(
	IN	ATMARP_BLOCK	*pBlock
)
--*/
#define AA_WAIT_ON_BLOCK_STRUCT(pBlock)		\
			(NdisWaitEvent(&((pBlock)->Event), 0), (pBlock)->Status)


/*++
VOID
AA_SIGNAL_BLOCK_STRUCT(
	IN	ATMARP_BLOCK	*pBlock,
	IN	UINT			Status
)
--*/
#define AA_SIGNAL_BLOCK_STRUCT(pBlock, _Status)	\
			{ (pBlock)->Status = _Status; NdisSetEvent(&((pBlock)->Event)); }


/*++
VOID
AA_FREE_BLOCK_STRUCT(
	IN	ATMARP_BLOCK	*pBlock
)
--*/
#define AA_FREE_BLOCK_STRUCT(pBlock)		// Nothing to be done here


/*++
VOID
AA_INIT_LOCK(
	IN	PNDIS_SPIN_LOCK		pLock
)
--*/
#if DBG_SPIN_LOCK
#define AA_INIT_LOCK(pLock)	\
				AtmArpAllocateSpinLock(pLock, _FILENUMBER, __LINE__)
#else
#define AA_INIT_LOCK(pLock)	\
				NdisAllocateSpinLock(pLock)
#endif // DBG_SPIN_LOCK


/*++
VOID
AA_ACQUIRE_LOCK(
	IN	PNDIS_SPIN_LOCK		pLock
)
--*/
#if DBG_SPIN_LOCK
#define AA_ACQUIRE_LOCK(pLock)	\
				AtmArpAcquireSpinLock(pLock, _FILENUMBER, __LINE__)
#else
#define AA_ACQUIRE_LOCK(pLock)	\
				NdisAcquireSpinLock(pLock)
#endif // DBG_SPIN_LOCK


/*++
VOID
AA_ACQUIRE_LOCK_DPC(
	IN	PNDIS_SPIN_LOCK		pLock
)
--*/
#if DBG_SPIN_LOCK
#define AA_ACQUIRE_LOCK_DPC(pLock)	\
				AtmArpAcquireSpinLock(pLock, _FILENUMBER, __LINE__)
#else
#define AA_ACQUIRE_LOCK_DPC(pLock)	\
				NdisDprAcquireSpinLock(pLock)
#endif // DBG_SPIN_LOCK


/*++
VOID
AA_RELEASE_LOCK(
	IN	PNDIS_SPIN_LOCK		pLock
)
--*/
#if DBG_SPIN_LOCK
#define AA_RELEASE_LOCK(pLock)		\
				AtmArpReleaseSpinLock(pLock, _FILENUMBER, __LINE__)
#else
#define AA_RELEASE_LOCK(pLock)		\
				NdisReleaseSpinLock(pLock)
#endif // DBG_SPIN_LOCK


/*++
VOID
AA_RELEASE_LOCK_DPC(
	IN	PNDIS_SPIN_LOCK		pLock
)
--*/
#if DBG_SPIN_LOCK
#define AA_RELEASE_LOCK_DPC(pLock)		\
				AtmArpReleaseSpinLock(pLock, _FILENUMBER, __LINE__)
#else
#define AA_RELEASE_LOCK_DPC(pLock)		\
				NdisDprReleaseSpinLock(pLock)
#endif // DBG_SPIN_LOCK


/*++
VOID
AA_FREE_LOCK(
	IN	PNDIS_SPIN_LOCK		pLock
)
--*/
#define AA_FREE_LOCK(pLock)			\
				NdisFreeSpinLock(pLock)


/*++
VOID
AA_INIT_IF_LOCK(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_INIT_IF_LOCK(pIf)		\
				AA_INIT_LOCK(&((pIf)->InterfaceLock))

/*++
VOID
AA_ACQUIRE_IF_LOCK(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_ACQUIRE_IF_LOCK(pIf)		\
				AA_ACQUIRE_LOCK(&((pIf)->InterfaceLock))


/*++
VOID
AA_ACQUIRE_IF_LOCK_DPC(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_ACQUIRE_IF_LOCK_DPC(pIf)		\
				AA_ACQUIRE_LOCK_DPC(&((pIf)->InterfaceLock))


/*++
VOID
AA_RELEASE_IF_LOCK(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_RELEASE_IF_LOCK(pIf)		\
				AA_RELEASE_LOCK(&((pIf)->InterfaceLock))


/*++
VOID
AA_RELEASE_IF_LOCK_DPC(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_RELEASE_IF_LOCK_DPC(pIf)		\
				AA_RELEASE_LOCK_DPC(&((pIf)->InterfaceLock))


/*++
VOID
AA_FREE_IF_LOCK(
	IN	PATMARP_INTERFACE	pIf
)
--*/
#define AA_FREE_IF_LOCK(pIf)	\
				AA_FREE_LOCK(&((pIf)->InterfaceLock))


/*++
VOID
AA_INIT_IF_TABLE_LOCK(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_INIT_IF_TABLE_LOCK(pIf)		\
				AA_INIT_LOCK(&((pIf)->ArpTableLock))

/*++
VOID
AA_ACQUIRE_IF_TABLE_LOCK(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_ACQUIRE_IF_TABLE_LOCK(pIf)		\
				AA_ACQUIRE_LOCK(&((pIf)->ArpTableLock))

/*++
VOID
AA_ACQUIRE_IF_TABLE_LOCK_DPC(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_ACQUIRE_IF_TABLE_LOCK_DPC(pIf)		\
				AA_ACQUIRE_LOCK_DPC(&((pIf)->ArpTableLock))


/*++
VOID
AA_RELEASE_IF_TABLE_LOCK(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_RELEASE_IF_TABLE_LOCK(pIf)		\
				AA_RELEASE_LOCK(&((pIf)->ArpTableLock))

/*++
VOID
AA_RELEASE_IF_TABLE_LOCK_DPC(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_RELEASE_IF_TABLE_LOCK_DPC(pIf)		\
				AA_RELEASE_LOCK_DPC(&((pIf)->ArpTableLock))


/*++
VOID
AA_FREE_IF_TABLE_LOCK(
	IN	PATMARP_INTERFACE	pIf
)
--*/
#define AA_FREE_IF_TABLE_LOCK(pIf)	\
				AA_FREE_LOCK(&((pIf)->ArpTableLock))


/*++
VOID
AA_INIT_IF_ATM_LIST_LOCK(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_INIT_IF_ATM_LIST_LOCK(pIf)		\
				AA_INIT_LOCK(&((pIf)->AtmEntryListLock))

/*++
VOID
AA_ACQUIRE_IF_ATM_LIST_LOCK(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_ACQUIRE_IF_ATM_LIST_LOCK(pIf)		\
				AA_ACQUIRE_LOCK(&((pIf)->AtmEntryListLock))

/*++
VOID
AA_ACQUIRE_IF_ATM_LIST_LOCK_DPC(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_ACQUIRE_IF_ATM_LIST_LOCK_DPC(pIf)		\
				AA_ACQUIRE_LOCK_DPC(&((pIf)->AtmEntryListLock))


/*++
VOID
AA_RELEASE_IF_ATM_LIST_LOCK(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_RELEASE_IF_ATM_LIST_LOCK(pIf)		\
				AA_RELEASE_LOCK(&((pIf)->AtmEntryListLock))

/*++
VOID
AA_RELEASE_IF_ATM_LIST_LOCK_DPC(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_RELEASE_IF_ATM_LIST_LOCK_DPC(pIf)		\
				AA_RELEASE_LOCK_DPC(&((pIf)->AtmEntryListLock))


/*++
VOID
AA_FREE_IF_ATM_LIST_LOCK(
	IN	PATMARP_INTERFACE	pIf
)
--*/
#define AA_FREE_IF_ATM_LIST_LOCK(pIf)	\
				AA_FREE_LOCK(&((pIf)->AtmEntryListLock))

/*++
VOID
AA_INIT_IF_TIMER_LOCK(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_INIT_IF_TIMER_LOCK(pIf)		\
				AA_INIT_LOCK(&((pIf)->TimerLock))

/*++
VOID
AA_ACQUIRE_IF_TIMER_LOCK(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_ACQUIRE_IF_TIMER_LOCK(pIf)		\
				AA_ACQUIRE_LOCK(&((pIf)->TimerLock))

/*++
VOID
AA_ACQUIRE_IF_TIMER_LOCK_DPC(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_ACQUIRE_IF_TIMER_LOCK_DPC(pIf)		\
				AA_ACQUIRE_LOCK_DPC(&((pIf)->TimerLock))

/*++
VOID
AA_RELEASE_IF_TIMER_LOCK(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_RELEASE_IF_TIMER_LOCK(pIf)		\
				AA_RELEASE_LOCK(&((pIf)->TimerLock))

/*++
VOID
AA_RELEASE_IF_TIMER_LOCK_DPC(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_RELEASE_IF_TIMER_LOCK_DPC(pIf)		\
				AA_RELEASE_LOCK_DPC(&((pIf)->TimerLock))


/*++
VOID
AA_FREE_IF_TIMER_LOCK(
	IN	PATMARP_INTERFACE	pIf
)
--*/
#define AA_FREE_IF_TIMER_LOCK(pIf)	\
				AA_FREE_LOCK(&((pIf)->TimerLock))


/*++
VOID
AA_INIT_VC_LOCK(
	IN PATMARP_VC	pVc
)
--*/
#define AA_INIT_VC_LOCK(pVc)		\
				AA_INIT_LOCK(&((pVc)->Lock))

/*++
VOID
AA_ACQUIRE_VC_LOCK(
	IN PATMARP_VC	pVc
)
--*/
#define AA_ACQUIRE_VC_LOCK(pVc)		\
				AA_ACQUIRE_LOCK(&((pVc)->Lock))

/*++
VOID
AA_ACQUIRE_VC_LOCK_DPC(
	IN PATMARP_VC	pVc
)
--*/
#define AA_ACQUIRE_VC_LOCK_DPC(pVc)		\
				AA_ACQUIRE_LOCK_DPC(&((pVc)->Lock))

/*++
VOID
AA_RELEASE_VC_LOCK(
	IN PATMARP_VC	pVc
)
--*/
#define AA_RELEASE_VC_LOCK(pVc)		\
				AA_RELEASE_LOCK(&((pVc)->Lock))


/*++
VOID
AA_RELEASE_VC_LOCK_DPC(
	IN PATMARP_VC	pVc
)
--*/
#define AA_RELEASE_VC_LOCK_DPC(pVc)		\
				AA_RELEASE_LOCK_DPC(&((pVc)->Lock))

/*++
VOID
AA_FREE_VC_LOCK(
	IN PATMARP_VC	pVc
)
--*/
#define AA_FREE_VC_LOCK(pVc)		\
				AA_FREE_LOCK(&((pVc)->Lock))


/*++
VOID
AA_INIT_AE_LOCK(
	IN PATMARP_ATM_ENTRY	pAtmEntry
)
--*/
#define AA_INIT_AE_LOCK(pAtmEntry)		\
				AA_INIT_LOCK(&((pAtmEntry)->Lock))

/*++
VOID
AA_ACQUIRE_AE_LOCK(
	IN PATMARP_ATM_ENTRY	pAtmEntry
)
--*/
#define AA_ACQUIRE_AE_LOCK(pAtmEntry)		\
				AA_ACQUIRE_LOCK(&((pAtmEntry)->Lock))

/*++
VOID
AA_ACQUIRE_AE_LOCK_DPC(
	IN PATMARP_ATM_ENTRY	pAtmEntry
)
--*/
#define AA_ACQUIRE_AE_LOCK_DPC(pAtmEntry)		\
				AA_ACQUIRE_LOCK_DPC(&((pAtmEntry)->Lock))

/*++
VOID
AA_RELEASE_AE_LOCK(
	IN PATMARP_ATM_ENTRY	pAtmEntry
)
--*/
#define AA_RELEASE_AE_LOCK(pAtmEntry)		\
				AA_RELEASE_LOCK(&((pAtmEntry)->Lock))

/*++
VOID
AA_RELEASE_AE_LOCK_DPC(
	IN PATMARP_ATM_ENTRY	pAtmEntry
)
--*/
#define AA_RELEASE_AE_LOCK_DPC(pAtmEntry)		\
				AA_RELEASE_LOCK_DPC(&((pAtmEntry)->Lock))

/*++
VOID
AA_FREE_AE_LOCK(
	IN PATMARP_ATM_ENTRY	pAtmEntry
)
--*/
#define AA_FREE_AE_LOCK(pAtmEntry)		\
				AA_FREE_LOCK(&((pAtmEntry)->Lock))

/*++
VOID
AA_INIT_IE_LOCK(
	IN PATMARP_IP_ENTRY	pIpEntry
)
--*/
#define AA_INIT_IE_LOCK(pIpEntry)		\
				AA_INIT_LOCK(&((pIpEntry)->Lock))


/*++
VOID
AA_ACQUIRE_IE_LOCK(
	IN PATMARP_IP_ENTRY	pIpEntry
)
--*/
#define AA_ACQUIRE_IE_LOCK(pIpEntry)		\
				AA_ACQUIRE_LOCK(&((pIpEntry)->Lock))


/*++
VOID
AA_ACQUIRE_IE_LOCK_DPC(
	IN PATMARP_IP_ENTRY	pIpEntry
)
--*/
#define AA_ACQUIRE_IE_LOCK_DPC(pIpEntry)		\
				AA_ACQUIRE_LOCK_DPC(&((pIpEntry)->Lock))

/*++
VOID
AA_RELEASE_IE_LOCK(
	IN PATMARP_IP_ENTRY	pIpEntry
)
--*/
#define AA_RELEASE_IE_LOCK(pIpEntry)		\
				AA_RELEASE_LOCK(&((pIpEntry)->Lock))


/*++
VOID
AA_RELEASE_IE_LOCK_DPC(
	IN PATMARP_IP_ENTRY	pIpEntry
)
--*/
#define AA_RELEASE_IE_LOCK_DPC(pIpEntry)		\
				AA_RELEASE_LOCK_DPC(&((pIpEntry)->Lock))

/*++
VOID
AA_FREE_IE_LOCK(
	IN PATMARP_IP_ENTRY	pIpEntry
)
--*/
#define AA_FREE_IE_LOCK(pIpEntry)		\
				AA_FREE_LOCK(&((pIpEntry)->Lock))


/*++
VOID
AA_INIT_GLOBAL_LOCK(
	IN PATMARP_GLOBALS	pGlob
)
--*/
#define AA_INIT_GLOBAL_LOCK(pGlob)		\
				AA_INIT_LOCK(&((pGlob)->Lock))


/*++
VOID
AA_ACQUIRE_GLOBAL_LOCK(
	IN PATMARP_GLOBALS	pGlob
)
--*/
#define AA_ACQUIRE_GLOBAL_LOCK(pGlob)		\
				AA_ACQUIRE_LOCK(&((pGlob)->Lock))


/*++
VOID
AA_RELEASE_GLOBAL_LOCK(
	IN PATMARP_GLOBALS	pGlob
)
--*/
#define AA_RELEASE_GLOBAL_LOCK(pGlob)		\
				AA_RELEASE_LOCK(&((pGlob)->Lock))

/*++
VOID
AA_FREE_GLOBAL_LOCK(
	IN PATMARP_GLOBALS	pGlob
)
--*/
#define AA_FREE_GLOBAL_LOCK(pGlob)		\
				AA_FREE_LOCK(&((pGlob)->Lock))


#ifdef ATMARP_WMI

/*++
VOID
AA_INIT_IF_WMI_LOCK(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_INIT_IF_WMI_LOCK(pIf)		\
				AA_INIT_LOCK(&((pIf)->WmiLock))

/*++
VOID
AA_ACQUIRE_IF_WMI_LOCK(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_ACQUIRE_IF_WMI_LOCK(pIf)		\
				AA_ACQUIRE_LOCK(&((pIf)->WmiLock))


/*++
VOID
AA_ACQUIRE_IF_WMI_LOCK_DPC(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_ACQUIRE_IF_WMI_LOCK_DPC(pIf)		\
				AA_ACQUIRE_LOCK_DPC(&((pIf)->WmiLock))


/*++
VOID
AA_RELEASE_IF_WMI_LOCK(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_RELEASE_IF_WMI_LOCK(pIf)		\
				AA_RELEASE_LOCK(&((pIf)->WmiLock))


/*++
VOID
AA_RELEASE_IF_WMI_LOCK_DPC(
	IN PATMARP_INTERFACE	pIf
)
--*/
#define AA_RELEASE_IF_WMI_LOCK_DPC(pIf)		\
				AA_RELEASE_LOCK_DPC(&((pIf)->WmiLock))


/*++
VOID
AA_FREE_IF_WMI_LOCK(
	IN	PATMARP_INTERFACE	pIf
)
--*/
#define AA_FREE_IF_WMI_LOCK(pIf)	\
				AA_FREE_LOCK(&((pIf)->WmiLock))

#endif // ATMARP_WMI

/*++
BOOLEAN
AA_IS_VC_GOING_DOWN(
	IN	PATMARP_VC		pVc
)
Is the VC being closed, or marked for closing?
--*/
#define AA_IS_VC_GOING_DOWN(_pVc)		\
				(((_pVc)->Flags & (AA_VC_CLOSE_STATE_CLOSING|AA_VC_CALL_STATE_CLOSE_IN_PROGRESS)) != 0)


#if !BINARY_COMPATIBLE

#define AA_ALLOC_FROM_POOL(_pVar, _StructType, _Size)	\
			(_pVar) = (_StructType *)ExAllocatePoolWithTag(NonPagedPool,	\
														 (_Size),		\
														 'CPRA')

#define AA_FREE_TO_POOL(_pMem)		ExFreePool((PVOID)(_pMem))

#endif
	
/*++
VOID
AA_ALLOC_MEM(
	IN	POPAQUE		pVar,
	IN	OPAQUE		StructureType,
	IN	ULONG		SizeOfStructure
)
--*/
#if DBG
#define AA_ALLOC_MEM(pVar, StructureType, SizeOfStructure)	\
			pVar = (StructureType *)AaAuditAllocMem(				\
										(PVOID)(&(pVar)),			\
										(ULONG)(SizeOfStructure),	\
										_FILENUMBER,				\
										__LINE__					\
									);
#else
#define AA_ALLOC_MEM(pVar, StructureType, SizeOfStructure)	\
			NdisAllocateMemoryWithTag((PVOID *)(&pVar), (ULONG)(SizeOfStructure), (ULONG)'CPRA');
#endif // DBG


/*++
VOID
AA_FREE_MEM(
	IN	POPAQUE		pMem
)
--*/
#if DBG
#define AA_FREE_MEM(pMem)	AaAuditFreeMem((PVOID)(pMem));
#else
#define AA_FREE_MEM(pMem)	NdisFreeMemory((PVOID)(pMem), 0, 0);
#endif // DBG


/*++
VOID
AA_SET_MEM(
	IN	POPAQUE		pMem,
	IN	UCHAR		bValue,
	IN	ULONG		NumberOfBytes
)
--*/
#define AA_SET_MEM(pMem, bValue, NumberOfBytes)	\
			AtmArpSetMemory((PUCHAR)(pMem), (bValue), (NumberOfBytes));



/*++
VOID
AA_COPY_MEM(
	IN	POPAQUE		pDst,
	IN	POPAQUE		pSrc,
	IN	ULONG		NumberOfBytes
)
--*/
#define AA_COPY_MEM(pDst, pSrc, NumberOfBytes)	\
			NdisMoveMemory((PVOID)(pDst), (PVOID)(pSrc), NumberOfBytes);


/*++
ULONG
AA_MEM_CMP(
	IN	PVOID		pString1,
	IN	PVOID		pString2,
	IN	ULONG		Length
)
--*/
#define AA_MEM_CMP(pString1, pString2, Length)	\
			AtmArpMemCmp((PUCHAR)(pString1), (PUCHAR)(pString2), (ULONG)(Length))



/*++
VOID
AA_INIT_SYSTEM_TIMER(
	IN	PNDIS_TIMER			pTimer,
	IN	PNDIS_TIMER_FUNCTON	pFunc,
	IN	PVOID				Context
)
--*/
#define AA_INIT_SYSTEM_TIMER(pTimer, pFunc, Context)	\
			NdisInitializeTimer(pTimer, (PNDIS_TIMER_FUNCTION)(pFunc), (PVOID)Context)



/*++
VOID
AA_START_SYSTEM_TIMER(
	IN	PNDIS_TIMER			pTimer,
	IN	UINT				PeriodInSeconds
)
--*/
#define AA_START_SYSTEM_TIMER(pTimer, PeriodInSeconds)	\
			NdisSetTimer(pTimer, (UINT)(PeriodInSeconds * 1000))


/*++
VOID
AA_STOP_SYSTEM_TIMER(
	IN	PNDIS_TIMER			pTimer
)
--*/
#define AA_STOP_SYSTEM_TIMER(pTimer)						\
			{												\
				BOOLEAN		WasCancelled;					\
				NdisCancelTimer(pTimer, &WasCancelled);		\
			}

/*++
BOOLEAN
AA_IS_TIMER_ACTIVE(
	IN	PATMARP_TIMER		pArpTimer
)
--*/
#define AA_IS_TIMER_ACTIVE(pTmr)	((pTmr)->pTimerList != (PATMARP_TIMER_LIST)NULL)


/*++
ULONG
AA_GET_TIMER_DURATION(
	IN	PATMARP_TIMER		pTimer
)
--*/
#define AA_GET_TIMER_DURATION(pTmr)	((pTmr)->Duration)


#ifndef NO_TIMER_MACRO

/*++
VOID
AtmArpRefreshTimer(
	IN	PATMARP_TIMER		pTimer
)
--*/
#define AtmArpRefreshTimer(_pTmr)												\
{																				\
	PATMARP_TIMER_LIST	_pTimerList;											\
																				\
	if ((_pTimerList = (_pTmr)->pTimerList) != (PATMARP_TIMER_LIST)NULL)		\
	{																			\
		(_pTmr)->LastRefreshTime = _pTimerList->CurrentTick;					\
	}																			\
}

#endif // !NO_TIMER_MACRO

/*++
ULONG
SECONDS_TO_LONG_TICKS(
	IN	ULONG				Seconds
)
Convert from seconds to "long duration timer ticks"
--*/
#define SECONDS_TO_LONG_TICKS(Seconds)		((Seconds)/10)


/*++
ULONG
SECONDS_TO_SHORT_TICKS(
	IN	ULONG				Seconds
)
Convert from seconds to "short duration timer ticks"
--*/
#define SECONDS_TO_SHORT_TICKS(Seconds)		(Seconds)


/*++
ULONG
CELLS_TO_BYTES(
	IN	ULONG				NumberOfCells
)
Convert from cell count to byte count
--*/
#define CELLS_TO_BYTES(NumberOfCells)	((NumberOfCells) * 48)


/*++
ULONG
BYTES_TO_CELLS(
	IN	ULONG				ByteCount
)
Convert from byte count to cell count
--*/
#define BYTES_TO_CELLS(ByteCount)		((ByteCount) / 48)



/*++
VOID
AA_IF_STAT_INCR(
	IN	PATMARP_INTERFACE	pInterface,
	IN	OPAQUE				StatsCounter
)
Increment the specified StatsCounter on an Interface by 1.
--*/
#define AA_IF_STAT_INCR(pInterface, StatsCounter)	\
			NdisInterlockedIncrement(&(pInterface->StatsCounter))


/*++
VOID
AA_IF_STAT_ADD_LOCK(
	IN	PATMARP_INTERFACE	pInterface,
	IN	OPAQUE				StatsCounter,
	IN	ULONG				IncrValue
)
Increment the specified StatsCounter on an Interface by the specified IncrValue.
Take a lock on the interface to do so.
--*/
#if DBG_SPIN_LOCK
#define AA_IF_STAT_ADD_LOCK(pInterface, StatsCounter, IncrValue)	\
			NdisInterlockedAddUlong(&(pInterface->StatsCounter), IncrValue, &(pInterface->InterfaceLock.NdisLock))
#else
#define AA_IF_STAT_ADD_LOCK(pInterface, StatsCounter, IncrValue)	\
			NdisInterlockedAddUlong(&(pInterface->StatsCounter), IncrValue, &(pInterface->InterfaceLock))
#endif // DBG_SPIN_LOCK

/*++
VOID
AA_IF_STAT_ADD(
	IN	PATMARP_INTERFACE	pInterface,
	IN	OPAQUE				StatsCounter,
	IN	ULONG				IncrValue
)
Add to the specified StatsCounter on an Interface by the specified IncrValue.
Use the more efficient InterlockedEcxhangeAdd instruction.
--*/
#if  BINARY_COMPATIBLE

	#define AA_IF_STAT_ADD(pInterface, StatsCounter, IncrValue)	\
				AA_IF_STAT_ADD_LOCK(pInterface, StatsCounter, IncrValue)

#else // !BINARY_COMPATIBLE

	#define AA_IF_STAT_ADD(pInterface, StatsCounter, IncrValue)	\
				InterlockedExchangeAdd(&(pInterface->StatsCounter), IncrValue)
	
			//((pInterface)->StatsCounter+=(IncrValue))
#endif // !BINARY_COMPATIBLE

/*++
BOOLEAN
AA_IS_BCAST_IP_ADDRESS(
	IN	IP_ADDRESS			Destination,
	IN	PATMARP_INTERFACE	pIf
)
Check if the given Destination is a broadcast IP address on the
given Interface. Currently, we only check if the destination is
the same as the (limited) broadcast address for the interface.

TBD: extend this when we support addition of broadcast addresses
to an interface.
--*/
#define AA_IS_BCAST_IP_ADDRESS(Destn, pIf)	\
		(IP_ADDR_EQUAL((pIf)->BroadcastAddress, Destn))



/*++
BOOLEAN
AA_FILTER_SPEC_MATCH(
	IN	PATMARP_INTERFACE	pInterface,
	IN	PATMARP_FILTER_SPEC	pSrc,
	IN	PATMARP_FILTER_SPEC	pDst
)
Check if the given filter spec matches a target filter spec, for the
specified interface.
--*/
#define AA_FILTER_SPEC_MATCH(pIf, pSrc, pDst)	\
			( ((pIf)->pFilterMatchFunc == NULL_PAA_FILTER_SPEC_MATCH_FUNC) ?	\
					TRUE:													\
					(*((pIf)->pFilterMatchFunc))((PVOID)pIf, pSrc, pDst))


/*++
BOOLEAN
AA_FLOW_SPEC_MATCH(
	IN	PATMARP_INTERFACE	pInterface,
	IN	PATMARP_FLOW_SPEC	pSrc,
	IN	PATMARP_FLOW_SPEC	pDst
)
Check if the given flow spec matches a target flow spec, for the
specified interface.
--*/
#define AA_FLOW_SPEC_MATCH(pIf, pSrc, pDst)	\
			( ((pIf)->pFlowMatchFunc == NULL_PAA_FLOW_SPEC_MATCH_FUNC) ?	\
					TRUE:													\
					(*((pIf)->pFlowMatchFunc))((PVOID)pIf, pSrc, pDst))


/*++
VOID
AA_GET_PACKET_SPECS(
	IN	PATMARP_INTERFACE		pInterface,
	IN	PNDIS_PACKET			pNdisPacket,
	OUT	PATMARP_FLOW_INFO		*ppFlowInfo,
	OUT	PATMARP_FLOW_SPEC		*ppFlowSpec,
	OUT	PATMARP_FILTER_SPEC		*ppFilterSpec
)
Get the flow and filter specs for the given packet
--*/
#define AA_GET_PACKET_SPECS(pIf, pPkt, ppFlowInfo, ppFlow, ppFilt)	\
			{																	\
				if ((pIf)->pGetPacketSpecFunc != NULL_PAA_GET_PACKET_SPEC_FUNC)	\
				{																\
					(*((pIf)->pGetPacketSpecFunc))								\
							((PVOID)(pIf), pPkt, ppFlowInfo, ppFlow, ppFilt);	\
				}																\
				else															\
				{																\
					*(ppFlowInfo) = NULL;										\
					*(ppFlow) = &((pIf)->DefaultFlowSpec);						\
					*(ppFilt) = &((pIf)->DefaultFilterSpec);					\
				}																\
			}																	\



/*++
VOID
AA_GET_CONTROL_PACKET_SPECS(
	IN	PATMARP_INTERFACE		pInterface,
	OUT	PATMARP_FLOW_SPEC		*ppFlowSpec
)
--*/
#define AA_GET_CONTROL_PACKET_SPECS(pIf, ppFlow)	\
			*(ppFlow) = &((pIf)->DefaultFlowSpec);


/*++
BOOLEAN
AA_IS_BEST_EFFORT_FLOW(
	IN	PATMARP_FLOW_SPEC		pFlowSpec
)
--*/
#define AA_IS_BEST_EFFORT_FLOW(pFlowSpec)	\
			(((pFlowSpec)->SendServiceType == SERVICETYPE_BESTEFFORT) &&			\
			 ((pFlowSpec)->SendPeakBandwidth > 0))




/*++
VOID
AA_SET_NEXT_PACKET(
	IN	PNDIS_PACKET		pNdisPacket,
	IN	PNDIS_PACKET		pNextPacket
)
--*/
#define AA_SET_NEXT_PACKET(pPkt, pNext)		\
			*((PNDIS_PACKET *)((pPkt)->MiniportReserved)) = (pNext);



/*++
PNDIS_PACKET
AA_GET_NEXT_PACKET(
	IN	PNDIS_PACKET		pNdisPacket
)
--*/
#define AA_GET_NEXT_PACKET(pPkt)			\
			(*((PNDIS_PACKET *)((pPkt)->MiniportReserved)))



/*++
ULONG
ROUND_UP(
	IN	ULONG	Val
)
Round up a value so that it becomes a multiple of 4.
--*/
#define ROUND_UP(Val)	(((Val) + 3) & ~0x3)


/*++
ULONG
ROUND_TO_8_BYTES(
	IN	ULONG	Val
)
Round up a value so that it becomes a multiple of 8.
--*/
#define ROUND_TO_8_BYTES(_Val)	(((_Val) + 7) & ~7)


#ifndef NET_SHORT

#if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || ((defined(_M_AMD64) || defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))
#define NET_SHORT(_x) _byteswap_ushort((USHORT)(_x))
#else
/*++
USHORT
NET_SHORT(
	IN	USHORT	Val
)
--*/
#define NET_SHORT(Val)	\
				((((Val) & 0xff) << 8) | (((Val) & 0xff00) >> 8))
#endif

#define NET_TO_HOST_SHORT(Val)	NET_SHORT(Val)
#define HOST_TO_NET_SHORT(Val)	NET_SHORT(Val)

#endif // NET_SHORT


#ifndef NET_LONG

#if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || ((defined(_M_AMD64) || defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))
#define NET_LONG(_x) _byteswap_ulong((ULONG)(_x))
#else
/*++
ULONG
NET_LONG(
	IN	ULONG	Val
)
--*/
#define NET_LONG(Val)	\
				((((Val) & 0x000000ff) << 24)	|	\
				 (((Val) & 0x0000ff00) << 8)	|	\
				 (((Val) & 0x00ff0000) >> 8)	|	\
				 (((Val) & 0xff000000) >> 24) )
#endif

#define NET_TO_HOST_LONG(Val)	NET_LONG(Val)
#define HOST_TO_NET_LONG(Val)	NET_LONG(Val)

#endif // NET_LONG


/*++
BOOLEAN
AA_IS_TRANSIENT_FAILURE(
	IN NDIS_STATUS		Status
)
	Return TRUE if the given Status indicates a transient connection
	failure, otherwise return FALSE.
--*/
#define AA_IS_TRANSIENT_FAILURE(_Status)	\
			((_Status == NDIS_STATUS_RESOURCES) ||					\
			 (_Status == NDIS_STATUS_CELLRATE_NOT_AVAILABLE) ||		\
			 (_Status == NDIS_STATUS_INCOMPATABLE_QOS))


/*++
LONG
AA_GET_RANDOM(
	IN LONG			min,
	IN LONG			max
)
--*/
#define AA_GET_RANDOM(min, max)	\
			(((LONG)AtmArpRandomNumber() % (LONG)(((max+1) - (min))) + (min)))


#define AA_LOG_ERROR()		// Nothing

/*++
BOOLEAN
AA_AE_IS_ALIVE(
	IN PATMARP_ATM_ENTRY	pAtmEntry
)
--*/
#define AA_AE_IS_ALIVE(pAtmEntry)				\
				(!AA_IS_FLAG_SET(				\
						(pAtmEntry)->Flags, 	\
						AA_ATM_ENTRY_STATE_MASK, \
						AA_ATM_ENTRY_IDLE))

/*++
BOOLEAN
AA_IE_ALIVE(
	IN PATMARP_IP_ENTRY	pIpEntry
)
--*/
#define AA_IE_IS_ALIVE(pIpEntry)				\
				(!AA_IS_FLAG_SET(				\
						(pIpEntry)->Flags, 		\
						AA_IP_ENTRY_STATE_MASK, \
						AA_IP_ENTRY_IDLE))


#endif // __ATMARP_MACROS_H_INCLUDED