int CParaNdisRX::PrepareReceiveBuffers() { UINT i; DEBUG_ENTRY(4); NdisZeroMemory(m_ReservedRxBufferMemory, sizeof(m_ReservedRxBufferMemory)); m_RxBufferIndex = 0; m_RxBufferOffset = 0; for (i = 0; i < m_Context->NetMaxReceiveBuffers; ++i) { pRxNetDescriptor pBuffersDescriptor = CreateRxDescriptorOnInit(); if (!pBuffersDescriptor) break; pBuffersDescriptor->Queue = this; if (!AddRxBufferToQueue(pBuffersDescriptor)) { ParaNdis_FreeRxBufferDescriptor(m_Context, pBuffersDescriptor); break; } InsertTailList(&m_NetReceiveBuffers, &pBuffersDescriptor->listEntry); m_NetNofReceiveBuffers++; } /* TODO - NetMaxReceiveBuffers should take into account all queues */ m_Context->NetMaxReceiveBuffers = m_NetNofReceiveBuffers; DPrintf(0, ("[%s] MaxReceiveBuffers %d\n", __FUNCTION__, m_Context->NetMaxReceiveBuffers)); m_Reinsert = true; m_VirtQueue.Kick(); return m_NetNofReceiveBuffers; }
int CParaNdisRX::PrepareReceiveBuffers() { int nRet = 0; UINT i; DEBUG_ENTRY(4); for (i = 0; i < m_Context->NetMaxReceiveBuffers; ++i) { pRxNetDescriptor pBuffersDescriptor = CreateRxDescriptorOnInit(); if (!pBuffersDescriptor) break; pBuffersDescriptor->Queue = this; if (!AddRxBufferToQueue(pBuffersDescriptor)) { ParaNdis_FreeRxBufferDescriptor(m_Context, pBuffersDescriptor); break; } InsertTailList(&m_NetReceiveBuffers, &pBuffersDescriptor->listEntry); m_NetNofReceiveBuffers++; } /* TODO - NetMaxReceiveBuffers should take into account all queues */ m_Context->NetMaxReceiveBuffers = m_NetNofReceiveBuffers; DPrintf(0, "[%s] MaxReceiveBuffers %d\n", __FUNCTION__, m_Context->NetMaxReceiveBuffers); m_Reinsert = true; return nRet; }
void CParaNdisRX::PopulateQueue() { LIST_ENTRY TempList; TPassiveSpinLocker autoLock(m_Lock); InitializeListHead(&TempList); while (!IsListEmpty(&m_NetReceiveBuffers)) { pRxNetDescriptor pBufferDescriptor = (pRxNetDescriptor)RemoveHeadList(&m_NetReceiveBuffers); InsertTailList(&TempList, &pBufferDescriptor->listEntry); } m_NetNofReceiveBuffers = 0; while (!IsListEmpty(&TempList)) { pRxNetDescriptor pBufferDescriptor = (pRxNetDescriptor)RemoveHeadList(&TempList); if (AddRxBufferToQueue(pBufferDescriptor)) { InsertTailList(&m_NetReceiveBuffers, &pBufferDescriptor->listEntry); m_NetNofReceiveBuffers++; } else { /* TODO - NetMaxReceiveBuffers should take into account all queues */ DPrintf(0, "FAILED TO REUSE THE BUFFER!!!!\n"); ParaNdis_FreeRxBufferDescriptor(m_Context, pBufferDescriptor); m_Context->NetMaxReceiveBuffers--; } } m_Reinsert = true; }
void CParaNdisRX::ReuseReceiveBufferNoLock(pRxNetDescriptor pBuffersDescriptor) { DEBUG_ENTRY(4); m_Context->m_rxPacketsOutsideRing.Release(); if (!m_Reinsert) { InsertTailList(&m_NetReceiveBuffers, &pBuffersDescriptor->listEntry); m_NetNofReceiveBuffers++; return; } else if (AddRxBufferToQueue(pBuffersDescriptor)) { InsertTailList(&m_NetReceiveBuffers, &pBuffersDescriptor->listEntry); m_NetNofReceiveBuffers++; if (m_NetNofReceiveBuffers > m_Context->NetMaxReceiveBuffers) { DPrintf(0, (" Error: NetNofReceiveBuffers > NetMaxReceiveBuffers(%d>%d)\n", m_NetNofReceiveBuffers, m_Context->NetMaxReceiveBuffers)); } /* TODO - nReusedRXBuffes per queue or per context ?*/ if (++m_nReusedRxBuffersCounter >= m_nReusedRxBuffersLimit) { m_nReusedRxBuffersCounter = 0; m_VirtQueue.KickAlways(); } } else { /* TODO - NetMaxReceiveBuffers per queue or per context ?*/ DPrintf(0, ("FAILED TO REUSE THE BUFFER!!!!\n")); ParaNdis_FreeRxBufferDescriptor(m_Context, pBuffersDescriptor); m_Context->NetMaxReceiveBuffers--; } }