Files
yttrium-virtio-gpu/NetKVM/Common/ParaNdis-RX.h
T
Sameeh Jubran 6976f63c92 NetKVM: Use Ndis DPC level spinlock functions
The NdisDprAcquireSpinLock and NdisDprReleaseSpinLock are an optimized
version of the Ndis Acquire and Release functions that should be called
only at Dispatch level.

Signed-off-by: Sameeh Jubran <[email protected]>
2017-12-03 10:30:44 +02:00

57 lines
1.4 KiB
C++

#pragma once
#include "ParaNdis-VirtQueue.h"
#include "ParaNdis-AbstractPath.h"
class CParaNdisRX : public CParaNdisTemplatePath<CVirtQueue>, public CNdisAllocatable < CParaNdisRX, 'XRHR' > {
public:
CParaNdisRX();
~CParaNdisRX();
bool Create(PPARANDIS_ADAPTER Context, UINT DeviceQueueIndex);
BOOLEAN AddRxBufferToQueue(pRxNetDescriptor pBufferDescriptor);
void PopulateQueue();
void FreeRxDescriptorsFromList();
void ReuseReceiveBuffer(pRxNetDescriptor pBuffersDescriptor)
{
TPassiveSpinLocker autoLock(m_Lock);
ReuseReceiveBufferNoLock(pBuffersDescriptor);
}
VOID ProcessRxRing(CCHAR nCurrCpuReceiveQueue);
BOOLEAN RestartQueue();
void Shutdown()
{
TPassiveSpinLocker autoLock(m_Lock);
m_VirtQueue.Shutdown();
m_Reinsert = false;
}
void KickRXRing();
PARANDIS_RECEIVE_QUEUE &UnclassifiedPacketsQueue() { return m_UnclassifiedPacketsQueue; }
private:
/* list of Rx buffers available for data (under VIRTIO management) */
LIST_ENTRY m_NetReceiveBuffers;
UINT m_NetNofReceiveBuffers;
UINT m_nReusedRxBuffersCounter, m_nReusedRxBuffersLimit;
bool m_Reinsert = true;
PARANDIS_RECEIVE_QUEUE m_UnclassifiedPacketsQueue;
void ReuseReceiveBufferNoLock(pRxNetDescriptor pBuffersDescriptor);
private:
int PrepareReceiveBuffers();
pRxNetDescriptor CreateRxDescriptorOnInit();
};