⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ixethacccodeletloopbacks.c

📁 有关ARM开发板上的IXP400网络驱动程序的源码以。
💻 C
📖 第 1 页 / 共 2 页
字号:
	!= IX_ETH_ACC_SUCCESS)    {	printf("Loopbacks: Failed to start the Tx-Gen Rx-Sink Operation port %u\n",	       (UINT32)portId);	return IX_FAIL;    }    /* Disable MAC learning and filtering at the port that sinks the frame.        With learning enabled at both ports, TxGenRxSink will report buffer underrun and overruns        as this mode generates a heavy load of MAC address migrations in the learning/filtering        database.      */    status = ixEthDBFeatureEnable (portId, IX_ETH_DB_FILTERING, FALSE);    if (IX_ETH_DB_SUCCESS == status)    {        status = ixEthDBFeatureEnable (portId, IX_ETH_DB_LEARNING, FALSE);     }    if (IX_ETH_DB_SUCCESS == status)    {        printf("\nMAC learning & filtering are disabled at port %d\n", portId);        printf("This is to prohibit the MAC address from being migrated back and forth\n");        printf("between two connected ports in the learning/filtering database.\n\n");    }    else    {        printf("\nFailed to disable MAC learning & filtering at port %d.\n", portId);        printf("TxGenRxSink will report buffer underrun and overruns as this mode generates \n");        printf("a heavy load of MAC address migrations in the learning/filtering database. \n");        printf("With learning enabled at both ports, buffer underrun and overruns are expected.\n");    }    /* Generate our random data for the payload */    IX_ETHACC_CODELET_DATAGEN(compData);	    /* Now start the loopback by transmitting the first few frames */    for (numBufs=0; numBufs<IX_ETHACC_CODELET_TXGEN_PCKS; numBufs++)    {	IX_ETHACC_CODELET_REMOVE_MBUF_FROM_Q_HEAD(ixEthAccCodeletFreeBufQ,						  mBufPtr);		if (mBufPtr == NULL)	{	    printf("Loopbacks: Buffer queue empty. Not enough free buffers to transmit in TxGen-RxSink Loopback!\n");	    return (IX_FAIL);	}		IX_OSAL_MBUF_MLEN(mBufPtr) = IX_ETHACC_CODELET_TXGEN_PCK_LEN;	IX_OSAL_MBUF_PKT_LEN(mBufPtr) = IX_ETHACC_CODELET_TXGEN_PCK_LEN;		memcpy(IX_OSAL_MBUF_MDATA(mBufPtr), 	       &compData[0], 	       IX_ETHACC_CODELET_TXGEN_PCK_LEN);		IX_OSAL_CACHE_FLUSH(IX_OSAL_MBUF_MDATA(mBufPtr), 				IX_OSAL_MBUF_MLEN(mBufPtr));		if(ixEthAccPortTxFrameSubmit(portId, 				     mBufPtr,				     IX_ETH_ACC_TX_DEFAULT_PRIORITY)	   != IX_ETH_ACC_SUCCESS)	{	    printf("Loopbacks: Error Submitting frame for transmission on port %u\n",		   portId);	    return (IX_FAIL);	}    }    printf("Port %d Tx pool has %d buffers\n", portId, numBufs);    /* enable traffic */    if(ixEthAccPortEnable(portId)        != IX_ETH_ACC_SUCCESS)    {	printf("Loopbacks: Error Enabling port %u\n",	       (UINT32)portId);	return (IX_FAIL);    }    return (IX_SUCCESS);}/* * Function definition: ixEthAccCodeletStop() * * Stop datapath traffic for the demo. This works assuming nobody will * continue to transmit or replenish for this port. This function * will first change the registered callbacks to callbacks which will  * drop all traffic. After this portDisable is called to flush all  * pending traffic inside the NPEs. */PRIVATE IX_STATUS ixEthAccCodeletPortLoopbackStop(IxEthAccPortId portId){        if (ixEthAccCodeletPortMultiBufferUnconfigure(portId) 	!= IX_ETH_ACC_SUCCESS)    {	printf("Loopbacks: Failed to unconfigure the port %u\n",	       (UINT32)portId);	return IX_FAIL;    }    /* disable traffic */    if(ixEthAccPortDisable(portId)        != IX_ETH_ACC_SUCCESS)    {	printf("Loopbacks: Error Disabling port %u\n",	       (UINT32)portId);	return (IX_FAIL);    }    return (IX_SUCCESS);}/* * Function definition: ixEthAccCodeletSwLoopbackStart() * * Start datapath traffic for Sw Loopback demo. */IX_STATUS ixEthAccCodeletSwLoopbackStart(IxEthAccPortId portId){    if (ixEthAccCodeletPortConfigure(portId,				     NULL,				     ixEthAccCodeletLoopbackRxCB,				     ixEthAccCodeletLoopbackTxCB, 				     portId) 	!= IX_ETH_ACC_SUCCESS)    {	printf("Loopbacks: Failed to configure the port %u\n",	       (UINT32)portId);	return IX_FAIL;    }    /* enable traffic */    if(ixEthAccPortEnable(portId)        != IX_ETH_ACC_SUCCESS)    {	printf("Loopbacks: Error enabling port %u\n",	       (UINT32)portId);	return (IX_FAIL);    }    return (IX_SUCCESS);}/* * Function definition: ixEthAccCodeletSwLoopbackStop() * * Stop datapath traffic for Sw Loopback demo. */IX_STATUS ixEthAccCodeletSwLoopbackStop(IxEthAccPortId portId){    return ixEthAccCodeletPortLoopbackStop(portId);}/* * Function definition: ixEthAccCodeletTxGenRxSinkLoopbackStart() * * Start datapath traffic for TxGen-RxSink  *   - port 1 : txGen + rxSink *   - port 2 : sw loopback * This setup is compatible with a crossover cable. However, the same  * traffic is seen on both ports and a huge amount of MAC address  * migrations is expected. * */IX_STATUS ixEthAccCodeletTxGenRxSinkLoopbackStart(IxEthAccPortId sinkPortId,					IxEthAccPortId loopPortId){    IX_STATUS ret = IX_SUCCESS;    if (sinkPortId == loopPortId)    {	printf("TxGenRxSinkLoopback: Cannot configure a Port %u in both txGenRxSink and Loopback (Ports must be different)\n", sinkPortId);	return (IX_FAIL);    }    ret = ixEthAccCodeletTxGenRxSinkStart(sinkPortId);    if (ret != IX_SUCCESS)	return ret;    else	return ixEthAccCodeletSwLoopbackStart(loopPortId);}/* * Function definition:  ixEthAccCodeletTxGenRxSinkLoopbackStop() * * Stop datapath traffic for TxGen-RxSink demo. */IX_STATUS ixEthAccCodeletTxGenRxSinkLoopbackStop(IxEthAccPortId sinkPortId, IxEthAccPortId loopPortId){    IX_STATUS ret = IX_SUCCESS;    ret = ixEthAccCodeletPortLoopbackStop(sinkPortId);    if (ret != IX_SUCCESS)	return ret;    else        return ixEthAccCodeletPortLoopbackStop(loopPortId);}/* * Function definition: ixEthAccCodeletRxSinkStart() * * Start datapath traffic for RX Sink demo. */IX_STATUS ixEthAccCodeletRxSinkStart(IxEthAccPortId portId){        if (ixEthAccCodeletPortConfigure(portId,				     NULL,				     ixEthAccCodeletRxSinkRxCB,				     ixEthAccCodeletMemPoolFreeTxCB, 				     portId) 	!= IX_ETH_ACC_SUCCESS)    {	printf("Loopbacks: Failed to configure the port %u\n",	       (UINT32)portId);	return IX_FAIL;    }    /* ready to get traffic */    if(ixEthAccPortEnable(portId)        != IX_ETH_ACC_SUCCESS)    {	printf("Loopbacks: Error enabling port %u\n",	       (UINT32)portId);	return (IX_FAIL);    }    return (IX_SUCCESS);}/* * Function definition: ixEthAccCodeletRxSinkStop() * * Stop datapath traffic for RX Sink demo. */IX_STATUS ixEthAccCodeletRxSinkStop(IxEthAccPortId portId){    return ixEthAccCodeletPortLoopbackStop(portId);}/* * Function definition:  ixEthAccCodeletPhyLoopbackStart() * * Start datapath traffic for PHY loopback demo. */IX_STATUS ixEthAccCodeletPhyLoopbackStart(IxEthAccPortId portId){    if (ixEthAccCodeletLinkLoopbackEnable(portId)	!= IX_SUCCESS)    {	printf("Loopbacks: Failed to enable a phy loopback on port %u\n",	       (UINT32)portId);	return IX_FAIL;    }        return ixEthAccCodeletTxGenRxSinkStart(portId);}/* * Function definition:  ixEthAccCodeletPhyLoopbackStop() * * Stop datapath traffic for PHY loopback demo. */IX_STATUS ixEthAccCodeletPhyLoopbackStop(IxEthAccPortId portId){    if (ixEthAccCodeletLinkLoopbackDisable(portId)	!= IX_SUCCESS)    {	printf("Loopbacks: Failed to disable a phy loopback on port %u\n",	       (UINT32)portId);	return IX_FAIL;    }    return ixEthAccCodeletPortLoopbackStop(portId);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -