|
|
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
dlmacro.h
Abstract:
This module all c- macros of 802.2 data link driver.
Author:
Antti Saarenheimo (o-anttis) 17-MAY-1991
Revision History:
--*/
//
// This routine just swaps the bits within bytes of
// a network address, used only for a fast address
// swapping to ethernet frame
//
#define SwapCopy6( a, b ) (a)[0]=Swap[(b)[0]];\
(a)[1]=Swap[(b)[1]];\ (a)[2]=Swap[(b)[2]];\ (a)[3]=Swap[(b)[3]];\ (a)[4]=Swap[(b)[4]];\ (a)[5]=Swap[(b)[5]]
//
// Copies and swaps the memory unconditionally
//
//VOID
//SwappingMemCpy(
// IN PUCHAR pDest,
// IN PUCHAR pSrc,
// IN UINT Len
// )
//
#define SwappingMemCpy( pDest, pSrc, Len ) {\
UINT i; \ for (i = 0; i < Len; i++) \ ((PUCHAR)pDest)[i] = Swap[ ((PUCHAR)pSrc)[i] ]; \ }
/*++
VOID LlcResetPacket( IN OUT PLLC_NDIS_PACKET pNdisPacket )
Routine Description:
Function rets the private partion of a NDIS packet.
Arguments:
pNdisPacket - Return Value:
None
--*/ #define ResetNdisPacket( pNdisPacket ) { \
(pNdisPacket)->private.PhysicalCount = 0;\ (pNdisPacket)->private.TotalLength = 0;\ (pNdisPacket)->private.Head = 0;\ (pNdisPacket)->private.Tail = 0;\ (pNdisPacket)->private.Count = 0;\ }
/*++
AllocateCompletionPacket( IN PLLC_OBJECT pLlcObject, IN UINT CompletionCode, IN PLLC_PACKET pPacket )
Routine Description:
The function inserts and initializes a command completion packet of an asynchronous command.
Arguments:
pLlcObject - LLC object (link, sap or direct)
CompletionCode - command completion code returned to upper protocol
Return Value: STATUS_SUCCESS DLC_STATUS_NO_MEMORY
--*/ #define AllocateCompletionPacket( pLlcObject, CompletionCode, pPacket ) {\
pPacket->pBinding = pLlcObject->Gen.pLlcBinding; \ pPacket->Data.Completion.CompletedCommand = (UCHAR)CompletionCode; \ pPacket->Data.Completion.hClientHandle = pLlcObject->Gen.hClientHandle; \ pPacket->pNext = pLlcObject->Gen.pCompletionPackets; \ pLlcObject->Gen.pCompletionPackets = pPacket; \ }
#define RunStateMachineCommand( pLink, uiInput ) \
RunStateMachine( (PDATA_LINK)pLink, (USHORT)uiInput, 0, 0 )
//
// VOID
// ScheduleQueue(
// IN PLIST_ENTRY ListHead
// );
//
// The macro swaps the list element from the head to the tail
// if there are more than one element in the list.
//
#define ScheduleQueue( ListHead ) \
if ((ListHead)->Blink != (ListHead)->Flink) \ { \ PLIST_ENTRY pListEntry; \ pListEntry = LlcRemoveHeadList( (ListHead) ); \ LlcInsertTailList( (ListHead), pListEntry ); \ }
#define ReferenceObject( pStation ) (pStation)->Gen.ReferenceCount++
//
// We have made the most common functions macroes to
// make the main code path as fast as possible.
// With the debug switch we use their local versions.
//
#if LLC_DBG >= 2
#define SEARCH_LINK( pAdapterContext, LanAddr, pLink ) \
pLink = SearchLink( pAdapterContext, LanAddr )
#else
/*++
SEARCH_LINK( IN PADAPTER_CONTEXT pAdapterContext, IN LAN802_ADDRESS LanAddr, IN PDATA_LINK pLink ) Routine Description:
The routine searches a link from the hash table. All links in the same hash node has been saved to a simple link list. Note: the full link address is actually 61 bits long = 7 (SSAP) + 7 (DSAP) + 47 (any non-broadcast source address). We save the address information into two ULONGs, that are used in the actual search. The hash key will be calculated by xoring all 8 bytes in the address. Arguments:
pAdapterContext - MAC adapter context of data link driver
LanAddr - the complete 64 bit address of link (48 bit source addr + saps)
Return Value: PDATA_LINK - pointer to LLC link object or NULL if not found
--*/ #define SEARCH_LINK( pAdapterContext, LanAddr, pLink )\
{ \ USHORT usHash; \ usHash = \ LanAddr.aus.Raw[0] ^ LanAddr.aus.Raw[1] ^ \ LanAddr.aus.Raw[2] ^ LanAddr.aus.Raw[3]; \ pLink = \ pAdapterContext->aLinkHash[ \ ((((PUCHAR)&usHash)[0] ^ ((PUCHAR)&usHash)[1]) % LINK_HASH_SIZE)]; \ while (pLink != NULL && \ (pLink->LinkAddr.ul.Low != LanAddr.ul.Low || \ pLink->LinkAddr.ul.High != LanAddr.ul.High)) \ { \ pLink = pLink->pNextNode; \ } \ } #endif
|