VOID CParaNdisRX::ProcessRxRing(CCHAR nCurrCpuReceiveQueue) { pRxNetDescriptor pBufferDescriptor; unsigned int nFullLength; #ifndef PARANDIS_SUPPORT_RSS UNREFERENCED_PARAMETER(nCurrCpuReceiveQueue); #endif CLockedContext<CNdisSpinLock> autoLock(m_Lock); while (NULL != (pBufferDescriptor = (pRxNetDescriptor)m_VirtQueue.GetBuf(&nFullLength))) { /* The counter m_rxPacketsOutsideRing is increased when the packet is removed from ring; it is decreased in CParaNdisRX::ReuseReceiveBuffer either in case of error or when NDIS calls ParaNdis6_ReturnNetBufferLists indicating the return of a receive buffer under miniport driver ownership */ m_Context->m_rxPacketsOutsideRing.AddRef(); RemoveEntryList(&pBufferDescriptor->listEntry); m_NetNofReceiveBuffers--; BOOLEAN packetAnalyzisRC; packetAnalyzisRC = ParaNdis_PerformPacketAnalyzis( #if PARANDIS_SUPPORT_RSS &m_Context->RSSParameters, #endif &pBufferDescriptor->PacketInfo, pBufferDescriptor->PhysicalPages[PARANDIS_FIRST_RX_DATA_PAGE].Virtual, nFullLength - m_Context->nVirtioHeaderSize); if (!packetAnalyzisRC) { pBufferDescriptor->Queue->ReuseReceiveBufferNoLock(pBufferDescriptor); m_Context->Statistics.ifInErrors++; m_Context->Statistics.ifInDiscards++; continue; } #ifdef PARANDIS_SUPPORT_RSS CCHAR nTargetReceiveQueueNum; GROUP_AFFINITY TargetAffinity; PROCESSOR_NUMBER TargetProcessor; nTargetReceiveQueueNum = ParaNdis_GetScalingDataForPacket( m_Context, &pBufferDescriptor->PacketInfo, &TargetProcessor); if (nTargetReceiveQueueNum == PARANDIS_RECEIVE_UNCLASSIFIED_PACKET) { ParaNdis_ReceiveQueueAddBuffer(&m_UnclassifiedPacketsQueue, pBufferDescriptor); } else { ParaNdis_ReceiveQueueAddBuffer(&m_Context->ReceiveQueues[nTargetReceiveQueueNum], pBufferDescriptor); if (nTargetReceiveQueueNum != nCurrCpuReceiveQueue) { ParaNdis_ProcessorNumberToGroupAffinity(&TargetAffinity, &TargetProcessor); ParaNdis_QueueRSSDpc(m_Context, m_messageIndex, &TargetAffinity); } } #else ParaNdis_ReceiveQueueAddBuffer(&m_UnclassifiedPacketsQueue, pBufferDescriptor); #endif } }
VOID CParaNdisRX::ProcessRxRing(CCHAR nCurrCpuReceiveQueue) { pRxNetDescriptor pBufferDescriptor; unsigned int nFullLength; #ifndef PARANDIS_SUPPORT_RSS UNREFERENCED_PARAMETER(nCurrCpuReceiveQueue); #endif TDPCSpinLocker autoLock(m_Lock); while (NULL != (pBufferDescriptor = (pRxNetDescriptor)m_VirtQueue.GetBuf(&nFullLength))) { RemoveEntryList(&pBufferDescriptor->listEntry); m_NetNofReceiveBuffers--; BOOLEAN packetAnalysisRC; packetAnalysisRC = ParaNdis_PerformPacketAnalysis( #if PARANDIS_SUPPORT_RSS &m_Context->RSSParameters, #endif &pBufferDescriptor->PacketInfo, pBufferDescriptor->PhysicalPages[PARANDIS_FIRST_RX_DATA_PAGE].Virtual, nFullLength - m_Context->nVirtioHeaderSize); if (!packetAnalysisRC) { pBufferDescriptor->Queue->ReuseReceiveBufferNoLock(pBufferDescriptor); m_Context->Statistics.ifInErrors++; m_Context->Statistics.ifInDiscards++; continue; } #ifdef PARANDIS_SUPPORT_RSS CCHAR nTargetReceiveQueueNum; GROUP_AFFINITY TargetAffinity; PROCESSOR_NUMBER TargetProcessor; nTargetReceiveQueueNum = ParaNdis_GetScalingDataForPacket( m_Context, &pBufferDescriptor->PacketInfo, &TargetProcessor); if (nTargetReceiveQueueNum == PARANDIS_RECEIVE_UNCLASSIFIED_PACKET) { ParaNdis_ReceiveQueueAddBuffer(&m_UnclassifiedPacketsQueue, pBufferDescriptor); } else { ParaNdis_ReceiveQueueAddBuffer(&m_Context->ReceiveQueues[nTargetReceiveQueueNum], pBufferDescriptor); if (nTargetReceiveQueueNum != nCurrCpuReceiveQueue) { ParaNdis_ProcessorNumberToGroupAffinity(&TargetAffinity, &TargetProcessor); ParaNdis_QueueRSSDpc(m_Context, m_messageIndex, &TargetAffinity); } } #else ParaNdis_ReceiveQueueAddBuffer(&m_UnclassifiedPacketsQueue, pBufferDescriptor); #endif } }