コード例 #1
0
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;
}
コード例 #2
0
//---------------------------------------------------------------------------
//
// 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;
}