static tEplKernel VEthRecvFrame(tEplFrameInfo * pFrameInfo_p) { tEplKernel Ret = kEplSuccessful; struct net_device *pNetDevice = pVEthNetDevice_g; struct net_device_stats *pStats = netdev_priv(pNetDevice); struct sk_buff *pSkb; EPL_DBGLVL_VETH_TRACE1("VEthRecvFrame: FrameSize=%u\n", pFrameInfo_p->m_uiFrameSize); pSkb = dev_alloc_skb(pFrameInfo_p->m_uiFrameSize + 2); if (pSkb == NULL) { pStats->rx_dropped++; goto Exit; } pSkb->dev = pNetDevice; skb_reserve(pSkb, 2); memcpy((void *)skb_put(pSkb, pFrameInfo_p->m_uiFrameSize), pFrameInfo_p->m_pFrame, pFrameInfo_p->m_uiFrameSize); pSkb->protocol = eth_type_trans(pSkb, pNetDevice); pSkb->ip_summed = CHECKSUM_UNNECESSARY; // call netif_rx with skb netif_rx(pSkb); EPL_DBGLVL_VETH_TRACE1("VEthRecvFrame: SrcMAC=0x%llx\n", AmiGetQword48FromBe(pFrameInfo_p->m_pFrame-> m_be_abSrcMac)); // update receive statistics pStats->rx_packets++; pStats->rx_bytes += pFrameInfo_p->m_uiFrameSize; Exit: return Ret; }
//--------------------------------------------------------------------------- // // Function: VEthRecvFrame // // Description: Receive function from EplDllk module // // Parameters: pFrameInfo_p = point to packet buffer // pReleaseRxBuffer_p = release for the buffer // // Returns: kEplSuccessful // kEplNoResource = no buffer is available // // State: // //--------------------------------------------------------------------------- static tEplKernel VEthRecvFrame(tEplFrameInfo * pFrameInfo_p, tEdrvReleaseRxBuffer* pReleaseRxBuffer_p) { tEplKernel Ret = kEplSuccessful; //BENCHMARK_MOD_03_SET(8); EPL_DBGLVL_VETH_TRACE("VEthRecvFrame: FrameSize=%u\n", pFrameInfo_p->m_uiFrameSize); EPL_DBGLVL_VETH_TRACE("VEthRecvFrame: SrcMAC=0x%llx\n", AmiGetQword48FromBe(pFrameInfo_p->m_pFrame->m_be_abSrcMac)); if( (VEthInstance_g.m_aVEthRxBuffer[VEthInstance_g.m_bVethRxBuffWritePos].m_pbBuffer != NULL) || (VEthInstance_g.m_aVEthRxBuffer[VEthInstance_g.m_bVethRxBuffWritePos].m_uiRxMsgLen != 0) ) { EPL_DBGLVL_VETH_TRACE("VEthRecvFrame: No free buffer available!\n"); Ret = kEplNoResource; goto Exit; } VEthInstance_g.m_aVEthRxBuffer[VEthInstance_g.m_bVethRxBuffWritePos].m_BufferInFrame = kEdrvBufferLastInFrame; VEthInstance_g.m_aVEthRxBuffer[VEthInstance_g.m_bVethRxBuffWritePos].m_pbBuffer = (BYTE *)pFrameInfo_p->m_pFrame; VEthInstance_g.m_aVEthRxBuffer[VEthInstance_g.m_bVethRxBuffWritePos].m_uiRxMsgLen = pFrameInfo_p->m_uiFrameSize; VEthInstance_g.m_bVethRxBuffWritePos++; if (VEthInstance_g.m_bVethRxBuffWritePos == EPL_VETH_NUM_RX_BUFFERS) { VEthInstance_g.m_bVethRxBuffWritePos = 0; } // set receive stats VEthInstance_g.m_Statistics.m_dwMsgrcv++; *pReleaseRxBuffer_p = kEdrvReleaseRxBufferLater; //BENCHMARK_MOD_03_RESET(8); Exit: return Ret; }