Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

629 lines
13 KiB

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
D:\nt\private\ntos\tdi\rawwan\core\macros.h
Abstract:
Macros for the NullTrans module. Adapted from ATMARP Client.
Revision History:
Who When What
-------- -------- ----
arvindm 05-07-97 created
Notes:
--*/
#ifndef __RWAN_MACROS_H_INCLUDED
#define __RWAN_MACROS_H_INCLUDED
#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
/*++
VOID
RWAN_SET_FLAG(
IN ULONG Flags,
IN ULONG Mask,
IN ULONG Val
)
--*/
#define RWAN_SET_FLAG(Flags, Mask, Val) \
(Flags) = ((Flags) & ~(Mask)) | (Val)
/*++
BOOLEAN
RWAN_IS_FLAG_SET(
IN ULONG Flags,
IN ULONG Mask,
IN ULONG Val
)
--*/
#define RWAN_IS_FLAG_SET(Flags, Mask, Val) \
(((Flags) & (Mask)) == (Val))
#define RWAN_SET_BIT(_Flags, _Bit) \
(_Flags) = (_Flags) | (_Bit);
#define RWAN_RESET_BIT(_Flags, _Bit) \
(_Flags) &= ~(_Bit);
#define RWAN_IS_BIT_SET(_Flags, _Bit) \
(((_Flags) & (_Bit)) != 0)
/*++
VOID
RWAN_INIT_EVENT_STRUCT(
IN RWAN_EVENT *pEvent
)
--*/
#define RWAN_INIT_EVENT_STRUCT(pEvent) NdisInitializeEvent(&((pEvent)->Event))
/*++
NDIS_STATUS
RWAN_WAIT_ON_EVENT_STRUCT(
IN RWAN_EVENT *pEvent
)
--*/
#define RWAN_WAIT_ON_EVENT_STRUCT(pEvent) \
(NdisWaitEvent(&((pEvent)->Event), 0), (pEvent)->Status)
/*++
VOID
RWAN_SIGNAL_EVENT_STRUCT(
IN RWAN_EVENT *pEvent,
IN UINT Status
)
--*/
#define RWAN_SIGNAL_EVENT_STRUCT(pEvent, _Status) \
{ (pEvent)->Status = _Status; NdisSetEvent(&((pEvent)->Event)); }
/*++
VOID
RWAN_FREE_EVENT_STRUCT(
IN RWAN_EVENT *pEvent
)
--*/
#define RWAN_FREE_EVENT_STRUCT(pEvent) // Nothing to be done here
/*++
VOID
RWAN_INIT_LOCK(
IN PNDIS_SPIN_LOCK pLock
)
--*/
#if DBG_SPIN_LOCK
#define RWAN_INIT_LOCK(pLock) \
RWanAllocateSpinLock(pLock, _FILENUMBER, __LINE__)
#else
#define RWAN_INIT_LOCK(pLock) \
NdisAllocateSpinLock(pLock)
#endif // DBG_SPIN_LOCK
/*++
VOID
RWAN_ACQUIRE_LOCK(
IN PNDIS_SPIN_LOCK pLock
)
--*/
#if DBG_SPIN_LOCK
#define RWAN_ACQUIRE_LOCK(pLock) \
RWanAcquireSpinLock(pLock, _FILENUMBER, __LINE__)
#else
#define RWAN_ACQUIRE_LOCK(pLock) \
NdisAcquireSpinLock(pLock)
#endif // DBG_SPIN_LOCK
/*++
VOID
RWAN_ACQUIRE_LOCK_DPC(
IN PNDIS_SPIN_LOCK pLock
)
--*/
#if DBG_SPIN_LOCK
#define RWAN_ACQUIRE_LOCK_DPC(pLock) \
RWanAcquireSpinLock(pLock, _FILENUMBER, __LINE__)
#else
#define RWAN_ACQUIRE_LOCK_DPC(pLock) \
NdisDprAcquireSpinLock(pLock)
#endif // DBG_SPIN_LOCK
/*++
VOID
RWAN_RELEASE_LOCK(
IN PNDIS_SPIN_LOCK pLock
)
--*/
#if DBG_SPIN_LOCK
#define RWAN_RELEASE_LOCK(pLock) \
RWanReleaseSpinLock(pLock, _FILENUMBER, __LINE__)
#else
#define RWAN_RELEASE_LOCK(pLock) \
NdisReleaseSpinLock(pLock)
#endif // DBG_SPIN_LOCK
/*++
VOID
RWAN_RELEASE_LOCK_DPC(
IN PNDIS_SPIN_LOCK pLock
)
--*/
#if DBG_SPIN_LOCK
#define RWAN_RELEASE_LOCK_DPC(pLock) \
RWanReleaseSpinLock(pLock, _FILENUMBER, __LINE__)
#else
#define RWAN_RELEASE_LOCK_DPC(pLock) \
NdisDprReleaseSpinLock(pLock)
#endif // DBG_SPIN_LOCK
/*++
VOID
RWAN_FREE_LOCK(
IN PNDIS_SPIN_LOCK pLock
)
--*/
#define RWAN_FREE_LOCK(pLock) \
NdisFreeSpinLock(pLock)
//
// Macros for operating the Global lock:
//
#define RWAN_INIT_GLOBAL_LOCK() \
RWAN_INIT_LOCK(&((pRWanGlobal)->GlobalLock))
#define RWAN_ACQUIRE_GLOBAL_LOCK() \
RWAN_ACQUIRE_LOCK(&((pRWanGlobal)->GlobalLock))
#define RWAN_RELEASE_GLOBAL_LOCK() \
RWAN_RELEASE_LOCK(&((pRWanGlobal)->GlobalLock))
#define RWAN_FREE_GLOBAL_LOCK() \
RWAN_FREE_LOCK(&((pRWanGlobal)->GlobalLock))
//
// Macros for operating the Address List lock:
//
#define RWAN_INIT_ADDRESS_LIST_LOCK() \
RWAN_INIT_LOCK(&((pRWanGlobal)->AddressListLock))
#define RWAN_ACQUIRE_ADDRESS_LIST_LOCK() \
RWAN_ACQUIRE_LOCK(&((pRWanGlobal)->AddressListLock))
#define RWAN_RELEASE_ADDRESS_LIST_LOCK() \
RWAN_RELEASE_LOCK(&((pRWanGlobal)->AddressListLock))
#define RWAN_FREE_ADDRESS_LIST_LOCK() \
RWAN_FREE_LOCK(&((pRWanGlobal)->AddressListLock))
//
// Macros for operating the Connection Table lock:
//
#define RWAN_INIT_CONN_TABLE_LOCK() \
RWAN_INIT_LOCK(&((pRWanGlobal)->ConnTableLock))
#define RWAN_ACQUIRE_CONN_TABLE_LOCK() \
RWAN_ACQUIRE_LOCK(&((pRWanGlobal)->ConnTableLock))
#define RWAN_RELEASE_CONN_TABLE_LOCK() \
RWAN_RELEASE_LOCK(&((pRWanGlobal)->ConnTableLock))
#define RWAN_FREE_CONN_TABLE_LOCK() \
RWAN_FREE_LOCK(&((pRWanGlobal)->ConnTableLock))
//
// Macros for operating Connection object locks:
//
#define RWAN_INIT_CONN_LOCK(pConnObj) \
RWAN_INIT_LOCK(&(pConnObj)->Lock)
#define RWAN_ACQUIRE_CONN_LOCK(pConnObj) \
RWAN_ACQUIRE_LOCK(&(pConnObj)->Lock)
#define RWAN_ACQUIRE_CONN_LOCK_DPC(pConnObj) \
RWAN_ACQUIRE_LOCK_DPC(&(pConnObj)->Lock)
#define RWAN_RELEASE_CONN_LOCK(pConnObj) \
RWAN_RELEASE_LOCK(&(pConnObj)->Lock)
#define RWAN_RELEASE_CONN_LOCK_DPC(pConnObj) \
RWAN_RELEASE_LOCK_DPC(&(pConnObj)->Lock)
#define RWAN_FREE_CONN_LOCK(pConnObj) \
RWAN_FREE_CONN_LOCK(&(pConnObj)->Lock)
//
// Macros for operating Address object locks:
//
#define RWAN_INIT_ADDRESS_LOCK(pAddrObj) \
RWAN_INIT_LOCK(&(pAddrObj)->Lock)
#define RWAN_ACQUIRE_ADDRESS_LOCK(pAddrObj) \
RWAN_ACQUIRE_LOCK(&(pAddrObj)->Lock)
#define RWAN_ACQUIRE_ADDRESS_LOCK_DPC(pAddrObj) \
RWAN_ACQUIRE_LOCK_DPC(&(pAddrObj)->Lock)
#define RWAN_RELEASE_ADDRESS_LOCK(pAddrObj) \
RWAN_RELEASE_LOCK(&(pAddrObj)->Lock)
#define RWAN_RELEASE_ADDRESS_LOCK_DPC(pAddrObj) \
RWAN_RELEASE_LOCK_DPC(&(pAddrObj)->Lock)
#define RWAN_FREE_ADDRESS_LOCK(pAddrObj) \
RWAN_FREE_ADDRESS_LOCK(&(pAddrObj)->Lock)
//
// Macros for operating AF locks:
//
#define RWAN_INIT_AF_LOCK(pAfBlk) \
RWAN_INIT_LOCK(&(pAfBlk)->Lock)
#define RWAN_ACQUIRE_AF_LOCK(pAfBlk) \
RWAN_ACQUIRE_LOCK(&(pAfBlk)->Lock)
#define RWAN_ACQUIRE_AF_LOCK_DPC(pAfBlk) \
RWAN_ACQUIRE_LOCK_DPC(&(pAfBlk)->Lock)
#define RWAN_RELEASE_AF_LOCK(pAfBlk) \
RWAN_RELEASE_LOCK(&(pAfBlk)->Lock)
#define RWAN_RELEASE_AF_LOCK_DPC(pAfBlk) \
RWAN_RELEASE_LOCK_DPC(&(pAfBlk)->Lock)
#define RWAN_FREE_AF_LOCK(pAfBlk) \
RWAN_FREE_AF_LOCK(&(pAfBlk)->Lock)
//
// Macros for operating Adapter locks:
//
#define RWAN_INIT_ADAPTER_LOCK(pAdptr) \
RWAN_INIT_LOCK(&(pAdptr)->Lock)
#define RWAN_ACQUIRE_ADAPTER_LOCK(pAdptr) \
RWAN_ACQUIRE_LOCK(&(pAdptr)->Lock)
#define RWAN_ACQUIRE_ADAPTER_LOCK_DPC(pAdptr) \
RWAN_ACQUIRE_LOCK_DPC(&(pAdptr)->Lock)
#define RWAN_RELEASE_ADAPTER_LOCK(pAdptr) \
RWAN_RELEASE_LOCK(&(pAdptr)->Lock)
#define RWAN_RELEASE_ADAPTER_LOCK_DPC(pAdptr) \
RWAN_RELEASE_LOCK_DPC(&(pAdptr)->Lock)
#define RWAN_FREE_ADAPTER_LOCK(pAdptr) \
RWAN_FREE_ADAPTER_LOCK(&(pAdptr)->Lock)
/*++
VOID
RWAN_ALLOC_MEM(
IN POPAQUE pVar,
IN OPAQUE StructureType,
IN ULONG SizeOfStructure
)
--*/
#if DBG
#define RWAN_ALLOC_MEM(pVar, StructureType, SizeOfStructure) \
pVar = (StructureType *)RWanAuditAllocMem( \
(PVOID)(&(pVar)), \
(ULONG)(SizeOfStructure), \
_FILENUMBER, \
__LINE__ \
);
#else
#define RWAN_ALLOC_MEM(pVar, StructureType, SizeOfStructure) \
NdisAllocateMemoryWithTag((PVOID *)(&pVar), (ULONG)(SizeOfStructure), (ULONG)'naWR');
#endif // DBG
/*++
VOID
RWAN_FREE_MEM(
IN POPAQUE pMem
)
--*/
#if DBG
#define RWAN_FREE_MEM(pMem) RWanAuditFreeMem((PVOID)(pMem));
#else
#define RWAN_FREE_MEM(pMem) NdisFreeMemory((PVOID)(pMem), 0, 0);
#endif // DBG
/*++
VOID
RWAN_SET_MEM(
IN POPAQUE pMem,
IN UCHAR bValue,
IN ULONG NumberOfBytes
)
--*/
#define RWAN_SET_MEM(pMem, bValue, NumberOfBytes) \
RtlFillMemory((PVOID)(pMem), (ULONG)(NumberOfBytes), (UCHAR)(bValue));
/*++
VOID
RWAN_ZERO_MEM(
IN POPAQUE pMem,
IN ULONG NumberOfBytes
)
--*/
#define RWAN_ZERO_MEM(pMem, NumberOfBytes) \
RtlZeroMemory((PVOID)pMem, (ULONG)(NumberOfBytes));
/*++
VOID
RWAN_COPY_MEM(
IN POPAQUE pDst,
IN POPAQUE pSrc,
IN ULONG NumberOfBytes
)
--*/
#define RWAN_COPY_MEM(pDst, pSrc, NumberOfBytes) \
NdisMoveMemory((PVOID)(pDst), (PVOID)(pSrc), NumberOfBytes);
/*++
BOOLEAN
RWAN_EQUAL_MEM(
IN POPAQUE pMem1,
IN POPAQUE pMem2,
IN ULONG Length
)
--*/
#define RWAN_EQUAL_MEM(_pMem1, _pMem2, _Length) \
(RtlCompareMemory((PVOID)(_pMem1), (PVOID)(_pMem2), (ULONG)(_Length)) == (_Length))
/*++
VOID
RWAN_SET_NEXT_PACKET(
IN PNDIS_PACKET pNdisPacket,
IN PNDIS_PACKET pNextPacket
)
--*/
#define RWAN_SET_NEXT_PACKET(pPkt, pNext) \
*((PNDIS_PACKET *)((pPkt)->MiniportReserved)) = (pNext);
/*++
PNDIS_PACKET
RWAN_GET_NEXT_PACKET(
IN PNDIS_PACKET pNdisPacket
)
--*/
#define RWAN_GET_NEXT_PACKET(pPkt) \
(*((PNDIS_PACKET *)((pPkt)->MiniportReserved)))
//
// Doubly linked list manipulation definitions and macros.
//
#define RWAN_INIT_LIST(_pListHead) \
InitializeListHead(_pListHead)
#define RWAN_IS_LIST_EMPTY(_pListHead) \
IsListEmpty(_pListHead)
#define RWAN_INSERT_HEAD_LIST(_pListHead, _pEntry) \
InsertHeadList((_pListHead), (_pEntry))
#define RWAN_INSERT_TAIL_LIST(_pListHead, _pEntry) \
InsertTailList((_pListHead), (_pEntry))
#define RWAN_DELETE_FROM_LIST(_pEntry) \
RemoveEntryList(_pEntry)
/*++
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)
/*++
VOID
RWAN_ADVANCE_RCV_REQ_BUFFER(
IN PRWAN_RECEIVE_REQUEST pRcvReq
)
--*/
#define RWAN_ADVANCE_RCV_REQ_BUFFER(_pRcvReq) \
{ \
PNDIS_BUFFER _pNextBuffer; \
NdisGetNextBuffer((_pRcvReq)->pBuffer, &(_pNextBuffer)); \
(_pRcvReq)->pBuffer = _pNextBuffer; \
if (_pNextBuffer != NULL) \
{ \
NdisQueryBuffer( \
(_pNextBuffer), \
&(_pRcvReq)->pWriteData, \
&(_pRcvReq)->BytesLeftInBuffer \
); \
\
if (((_pRcvReq)->BytesLeftInBuffer > (_pRcvReq)->AvailableBufferLength)) \
{ \
(_pRcvReq)->BytesLeftInBuffer = (_pRcvReq)->AvailableBufferLength; \
} \
} \
else \
{ \
(_pRcvReq)->BytesLeftInBuffer = 0; \
(_pRcvReq)->pWriteData = NULL; \
} \
}
/*++
VOID
RWAN_ADVANCE_RCV_IND_BUFFER(
IN PRWAN_RECEIVE_INDICATION pRcvInd
)
--*/
#define RWAN_ADVANCE_RCV_IND_BUFFER(_pRcvInd) \
{ \
PNDIS_BUFFER _pNextBuffer; \
NdisGetNextBuffer((_pRcvInd)->pBuffer, &(_pNextBuffer)); \
(_pRcvInd)->pBuffer = _pNextBuffer; \
if (_pNextBuffer != NULL) \
{ \
NdisQueryBuffer( \
(_pNextBuffer), \
&(_pRcvInd)->pReadData, \
&(_pRcvInd)->BytesLeftInBuffer \
); \
} \
else \
{ \
(_pRcvInd)->BytesLeftInBuffer = 0; \
(_pRcvInd)->pReadData = NULL; \
} \
}
/*++
VOID
RWAN_SET_DELETE_NOTIFY(
IN PRWAN_DELETE_NOTIFY pNotifyObject,
IN PCOMPLETE_RTN pDeleteRtn,
IN PVOID DeleteContext
)
--*/
#define RWAN_SET_DELETE_NOTIFY(_pNotifyObj, _pDeleteRtn, _DeleteContext) \
{ \
(_pNotifyObj)->pDeleteRtn = (_pDeleteRtn); \
(_pNotifyObj)->DeleteContext = (_DeleteContext); \
}
/*++
PRWAN_SEND_REQUEST
RWAN_SEND_REQUEST_FROM_PACKET(
IN PNDIS_PACKET pNdisPacket
)
--*/
#define RWAN_SEND_REQUEST_FROM_PACKET(_pNdisPacket) \
(PRWAN_SEND_REQUEST)((_pNdisPacket)->ProtocolReserved)
#if DBG
#define RWAN_LINK_CONNECTION_TO_VC(_pConn, _pVc) \
{ \
(_pConn)->NdisConnection.pNdisVc = _pVc; \
(_pConn)->pNdisVcSave = _pVc; \
(_pVc)->pConnObject = (_pConn); \
}
#else
#define RWAN_LINK_CONNECTION_TO_VC(_pConn, _pVc) \
{ \
(_pConn)->NdisConnection.pNdisVc = _pVc; \
(_pConn)->pNdisVcSave = _pVc; \
(_pVc)->pConnObject = (_pConn); \
}
#endif // DBG
#define RWAN_UNLINK_CONNECTION_AND_VC(_pConn, _pVc) \
{ \
(_pConn)->NdisConnection.pNdisVc = NULL_PRWAN_NDIS_VC;\
(_pVc)->pConnObject = NULL_PRWAN_TDI_CONNECTION; \
}
/*++
VOID
RWAN_SET_VC_CALL_PARAMS(
IN PRWAN_NDIS_VC pVc,
IN PCO_CALL_PARAMETERS pCallParameters
)
--*/
#define RWAN_SET_VC_CALL_PARAMS(_pVc, _pCallParameters) \
{ \
if ((_pCallParameters != NULL) && \
(_pCallParameters->CallMgrParameters != NULL)) \
{ \
_pVc->MaxSendSize = _pCallParameters->CallMgrParameters->Transmit.MaxSduSize; \
} \
if (gHackSendSize) \
{ \
_pVc->MaxSendSize = gHackSendSize; \
} \
/* DbgPrint("RWan: set vc %x: maxsendsize to %d\n", _pVc, _pVc->MaxSendSize); */ \
}
#define RWAN_SET_VC_EVENT(_pVc, _Flags) ((_pVc)->Flags) |= (_Flags);
#if STATS
#define INCR_STAT(_pSt) InterlockedIncrement(_pSt);
#define ADD_STAT(_pSt, Incr) *(_pSt) += Incr;
#endif // STATS
#endif // __RWAN_MACROS_H_INCLUDED