258 lines
5 KiB
C
258 lines
5 KiB
C
|
/*++
|
||
|
|
||
|
Copyright(c) 1999-2000 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
brdgbuf.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Ethernet MAC level bridge.
|
||
|
Buffer management section
|
||
|
PUBLIC header
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Mark Aiken
|
||
|
(original bridge by Jameel Hyder)
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
Kernel mode driver
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
Feb 2000 - Original version
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "brdgpkt.h"
|
||
|
|
||
|
// ===========================================================================
|
||
|
//
|
||
|
// DECLARATIONS
|
||
|
//
|
||
|
// ===========================================================================
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
BrdgOwnCopyPacket,
|
||
|
BrdgOwnWrapperPacket,
|
||
|
BrdgNotOwned
|
||
|
} PACKET_OWNERSHIP;
|
||
|
|
||
|
// ===========================================================================
|
||
|
//
|
||
|
// PROTOTYPES
|
||
|
//
|
||
|
// ===========================================================================
|
||
|
|
||
|
NTSTATUS
|
||
|
BrdgBufDriverInit();
|
||
|
|
||
|
VOID
|
||
|
BrdgBufCleanup();
|
||
|
|
||
|
PNDIS_PACKET
|
||
|
BrdgBufGetBaseCopyPacket(
|
||
|
OUT PPACKET_INFO *pppi
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
BrdgBufFreeWrapperPacket(
|
||
|
IN PNDIS_PACKET pPacket,
|
||
|
IN PPACKET_INFO ppi,
|
||
|
IN PADAPT pQuotaOwner
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
BrdgBufFreeBaseCopyPacket(
|
||
|
IN PNDIS_PACKET pPacket,
|
||
|
IN PPACKET_INFO ppi
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
BrdgBufFreeBaseWrapperPacket(
|
||
|
IN PNDIS_PACKET pPacket,
|
||
|
IN PPACKET_INFO ppi
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
BrdgBufAssignBasePacketQuota(
|
||
|
IN PNDIS_PACKET pPacket,
|
||
|
IN PADAPT pAdapt
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
BrdgBufReleaseBasePacketQuota(
|
||
|
IN PNDIS_PACKET pPacket,
|
||
|
IN PADAPT pAdapt
|
||
|
);
|
||
|
|
||
|
PNDIS_PACKET
|
||
|
BrdgBufGetWrapperPacket(
|
||
|
OUT PPACKET_INFO *pppi,
|
||
|
IN PADAPT pAdapt
|
||
|
);
|
||
|
|
||
|
NDIS_STATUS
|
||
|
BrdgBufChainCopyBuffers(
|
||
|
IN PNDIS_PACKET pTargetPacket,
|
||
|
IN PNDIS_PACKET pSourcePacket
|
||
|
);
|
||
|
|
||
|
PACKET_OWNERSHIP
|
||
|
BrdgBufGetPacketOwnership(
|
||
|
IN PNDIS_PACKET pPacket
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
BrdgBufGetStatistics(
|
||
|
PBRIDGE_BUFFER_STATISTICS pStats
|
||
|
);
|
||
|
|
||
|
|
||
|
// ===========================================================================
|
||
|
//
|
||
|
// INLINES
|
||
|
//
|
||
|
// ===========================================================================
|
||
|
|
||
|
//
|
||
|
// Retrieves the first NDIS_BUFFER chained to a given packet (NULL if none)
|
||
|
//
|
||
|
__forceinline
|
||
|
PNDIS_BUFFER
|
||
|
BrdgBufPacketHeadBuffer(
|
||
|
IN PNDIS_PACKET pPacket
|
||
|
)
|
||
|
{
|
||
|
PNDIS_BUFFER pBuffer;
|
||
|
SAFEASSERT( pPacket != NULL );
|
||
|
NdisQueryPacket( pPacket, NULL, NULL, &pBuffer, NULL );
|
||
|
return pBuffer;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Retrieves the total size of all buffers chained to a packet
|
||
|
//
|
||
|
__forceinline
|
||
|
UINT
|
||
|
BrdgBufTotalPacketSize(
|
||
|
IN PNDIS_PACKET pPacket
|
||
|
)
|
||
|
{
|
||
|
UINT size;
|
||
|
SAFEASSERT( pPacket != NULL );
|
||
|
NdisQueryPacket( pPacket, NULL, NULL, NULL, &size );
|
||
|
return size;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Retrieves the virtual address of the data in the first buffer chained
|
||
|
// to a packet (holds the Ethernet header)
|
||
|
//
|
||
|
__forceinline
|
||
|
PVOID
|
||
|
BrdgBufGetPacketHeader(
|
||
|
IN PNDIS_PACKET pPacket
|
||
|
)
|
||
|
{
|
||
|
PNDIS_BUFFER pBuffer;
|
||
|
PVOID pHeader;
|
||
|
UINT Length;
|
||
|
|
||
|
SAFEASSERT( pPacket != NULL );
|
||
|
pBuffer = BrdgBufPacketHeadBuffer( pPacket );
|
||
|
SAFEASSERT( pBuffer != NULL );
|
||
|
NdisQueryBufferSafe( pBuffer, &pHeader, &Length, NormalPagePriority );
|
||
|
SAFEASSERT( pHeader != NULL );
|
||
|
return pHeader;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Unchains and frees all buffers chained to a given packet
|
||
|
//
|
||
|
__forceinline
|
||
|
VOID
|
||
|
BrdgBufUnchainCopyBuffers(
|
||
|
IN PNDIS_PACKET pPacket
|
||
|
)
|
||
|
{
|
||
|
PNDIS_BUFFER pCurBuf;
|
||
|
|
||
|
NdisUnchainBufferAtFront( pPacket, &pCurBuf );
|
||
|
|
||
|
while( pCurBuf != NULL )
|
||
|
{
|
||
|
NdisFreeBuffer( pCurBuf );
|
||
|
NdisUnchainBufferAtFront( pPacket, &pCurBuf );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Determines whether this packet was allocated from our copy pool
|
||
|
//
|
||
|
__forceinline
|
||
|
BOOLEAN
|
||
|
BrdgBufIsCopyPacket(
|
||
|
IN PNDIS_PACKET pPacket
|
||
|
)
|
||
|
{
|
||
|
PACKET_OWNERSHIP Own = BrdgBufGetPacketOwnership(pPacket);
|
||
|
return (BOOLEAN)(Own == BrdgOwnCopyPacket);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Determines whether this packet was allocated from our wrapper pool
|
||
|
//
|
||
|
__forceinline
|
||
|
BOOLEAN
|
||
|
BrdgBufIsWrapperPacket(
|
||
|
IN PNDIS_PACKET pPacket
|
||
|
)
|
||
|
{
|
||
|
PACKET_OWNERSHIP Own = BrdgBufGetPacketOwnership(pPacket);
|
||
|
return (BOOLEAN)(Own == BrdgOwnWrapperPacket);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Initializes an ADAPTER_QUOTA structure
|
||
|
//
|
||
|
__forceinline
|
||
|
VOID
|
||
|
BrdgBufInitializeQuota(
|
||
|
IN PADAPTER_QUOTA pQuota
|
||
|
)
|
||
|
{
|
||
|
pQuota->UsedPackets[0] = pQuota->UsedPackets[1] = 0L;
|
||
|
}
|
||
|
|
||
|
// DO NOT use this variable directly outside of BrdgBuf.c
|
||
|
extern NDIS_HANDLE gWrapperBufferPoolHandle;
|
||
|
|
||
|
//
|
||
|
// Allocates an NDIS_BUFFER from our pool
|
||
|
//
|
||
|
__forceinline
|
||
|
PNDIS_BUFFER
|
||
|
BrdgBufAllocateBuffer(
|
||
|
IN PVOID p,
|
||
|
IN UINT len
|
||
|
)
|
||
|
{
|
||
|
PNDIS_BUFFER pBuf;
|
||
|
NDIS_STATUS Status;
|
||
|
|
||
|
NdisAllocateBuffer( &Status, &pBuf, gWrapperBufferPoolHandle, p, len );
|
||
|
|
||
|
if( Status != NDIS_STATUS_SUCCESS )
|
||
|
{
|
||
|
THROTTLED_DBGPRINT(BUF, ("Failed to allocate a MDL in BrdgBufAllocateBuffer: %08x\n", Status));
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
return pBuf;
|
||
|
}
|