📄 ixethacccodeletloopbacks.c
字号:
!= 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 + -