📄 ixethacccodeletmain.c
字号:
* System initialisation done. Now initialise Access components. * ***********************************************************************/ /* Initialise Queue Manager */ printf("Initialising Queue Manager...\n"); if (ixQMgrInit() != IX_SUCCESS) { printf("CodeletMain: Error initialising queue manager!\n"); return (IX_FAIL); } /* Start the Queue Manager dispatcher */ if(ixEthAccCodeletDispatcherStart(IX_ETH_CODELET_QMGR_DISPATCH_MODE) != IX_SUCCESS) { printf("CodeletMain: Error starting queue manager dispatch loop!\n"); return (IX_FAIL); } /* Initialise NPE Message handler */ printf("\nStarting NPE message handler...\n"); if(ixNpeMhInitialize(IX_NPEMH_NPEINTERRUPTS_YES) != IX_SUCCESS) { printf("CodeletMain: Error initialising NPE Message handler!\n"); return (IX_FAIL); } /* Initialise NPEs firmware */ printf ("Initialising NPEs...\n"); if (ixEthAccCodeletHardwareExists[IX_ETH_PORT_1]) { if ((operationType == IX_ETHACC_CODELET_BRIDGE_WIFI) && (inPort == IX_ETH_PORT_1)) { printf("CodeletMain: the 802.3 <=> 802.11 header conversion image is loaded on NPE B\n"); ETH_NPEB_IMAGEID = IX_NPEDL_NPEIMAGE_NPEB_ETH_SPAN_VLAN_QOS_HDR_CONV_EXTMIB; } if (IX_SUCCESS != ixNpeDlNpeInitAndStart(ETH_NPEB_IMAGEID)) { printf ("CodeletMain: Error initialising and starting NPE B!\n"); return (IX_FAIL); } } if (ixEthAccCodeletHardwareExists[IX_ETH_PORT_2]) { if ((operationType == IX_ETHACC_CODELET_BRIDGE_WIFI) && (inPort == IX_ETH_PORT_2)) { printf("CodeletMain: the 802.3 <=> 802.11 header conversion image is loaded on NPE C\n"); ETH_NPEC_IMAGEID = IX_NPEDL_NPEIMAGE_NPEC_ETH_SPAN_VLAN_QOS_HDR_CONV_EXTMIB; } if (IX_SUCCESS != ixNpeDlNpeInitAndStart(ETH_NPEC_IMAGEID)) { printf ("CodeletMain: Error initialising and starting NPE C!\n"); return (IX_FAIL); } }#ifdef __ixp46X if (ixEthAccCodeletHardwareExists[IX_ETH_PORT_3]) { if ((operationType == IX_ETHACC_CODELET_BRIDGE_WIFI) && (inPort == IX_ETH_PORT_3)) { printf("CodeletMain: the 802.3 <=> 802.11 header conversion image is loaded on NPE A\n"); ETH_NPEA_IMAGEID = IX_NPEDL_NPEIMAGE_NPEA_ETH_SPAN_VLAN_QOS_HDR_CONV_EXTMIB; } if (IX_SUCCESS != ixNpeDlNpeInitAndStart(ETH_NPEA_IMAGEID)) { printf ("CodeletMain: Error initialising and starting NPE A!\n"); return (IX_FAIL); } }#endif printf ("Initialising Access Layers\n"); /* Enable QoS on ethDB. This has to be done before ethAcc initialisation */ if (operationType == IX_ETHACC_CODELET_BRIDGE_QOS) { printf("Enabling QoS\n"); if (IX_ETH_DB_SUCCESS != ixEthDBInit()) { printf ("CodeletMain: Error initialising EthDB\n"); return (IX_FAIL); } (void)ixEthDBPortInit(inPort); if (IX_ETH_DB_SUCCESS != ixEthDBFeatureEnable(inPort, IX_ETH_DB_VLAN_QOS, TRUE)) { printf("CodeletMain: Error enabling QoS on port %d\n",inPort); return (IX_FAIL); } } /* initialise ethAcc : QoS, if needed is already configured */ if (ixEthAccInit() != IX_ETH_ACC_SUCCESS) { printf("CodeletMain: Error initialising Ethernet access driver!\n"); return (IX_FAIL); } /*********************************************************************** * * Access components initialisation done. Now initialize the ports * ***********************************************************************/ /* Configure all available ports */ for (portId = 0; portId < IX_ETHACC_CODELET_MAX_PORT; portId++) { if (ixEthAccCodeletHardwareExists[portId]) { if(ixEthAccCodeletPortInit(portId) != IX_ETH_ACC_SUCCESS) { printf("CodeletMain: Error setup port %u\n", portId); return (IX_FAIL); } } } /* Find and initialise all available PHYs */ printf ("Discover and reset the PHYs...\n"); if(ixEthAccCodeletPhyInit() != IX_SUCCESS) { printf("CodeletMain: Error initialising Ethernet phy(s)!\n"); return (IX_FAIL); } /*********************************************************************** * * PortInitialization done. Now start the codelet features * ***********************************************************************/ /* starts ethDB maintenance running from a different task */ if (ixEthAccCodeletDBMaintenanceStart() != IX_SUCCESS) { printf("CodeletMain: Error spawning DB maintenance task\n"); return (IX_FAIL); } /* Starts the traffic display (in a different task) this is initially * set to FALSE in order to allow the traffic stats to start only * once traffic is started to be received */ ixEthAccCodeletTrafficPollEnabled = FALSE; if (ixOsalThreadCreate(&statsPollThread, &threadAttr, (IxOsalVoidFnVoidPtr) ixEthAccCodeletStatsPollTask, NULL) != IX_SUCCESS) { printf("CodeletMain: Error spawning stats task\n"); return (IX_FAIL); } /* Start the thread */ if (ixOsalThreadStart(&statsPollThread) != IX_SUCCESS) { printf("CodeletMain: Error failed to start the stats thread\n"); return IX_FAIL; } ixEthAccCodeletInitialised = TRUE; return (IX_SUCCESS);}/* * Function definition: ixEthAccCodeletUninit() * * Stop all threads and interrupts */IX_STATUS ixEthAccCodeletUninit(void){ IxEthAccPortId portId; IxEthAccStatus status; if(!ixEthAccCodeletInitialised) { /* already uninitialized */ return(IX_SUCCESS); } if (!ixEthAccCodeletStatsPollTaskStop) { ixEthAccCodeletStatsPollTaskStop = TRUE; if (ixOsalMutexLock (&ixEthAccCodeletStatsPollTaskRunning, IX_OSAL_WAIT_FOREVER) != IX_SUCCESS) { printf("CodeletMain: Error stopping Statistics Polling thread!\n"); return (IX_FAIL); } ixOsalMutexUnlock (&ixEthAccCodeletStatsPollTaskRunning); } for (portId = IX_ETH_PORT_1; portId < IX_ETHACC_CODELET_MAX_PORT; portId++) { status = ixEthAccPortDisable (portId); if (IX_ETH_ACC_SUCCESS != status) { printf("CodeletMain: Failed to disable port %d, error code %d\n", portId, status); return (IX_FAIL); } } if (ixEthAccCodeletDBMaintenanceStop() != IX_SUCCESS) { printf("CodeletMain: Error stopping DB Maintenance task!\n"); return (IX_FAIL); } if (ixEthAccUninit() != IX_SUCCESS) { printf("CodeletMain: Failed to uninitialize Ethernet Access Layer!\n"); return (IX_FAIL); }#ifdef __ixp46X if (ixNpeDlNpeStopAndReset(IX_NPEDL_NPEID_NPEA) != IX_SUCCESS) { printf("CodeletMain: Failed to stop and reset NPE A!\n"); return (IX_FAIL); }#endif if (ixNpeDlNpeStopAndReset(IX_NPEDL_NPEID_NPEB) != IX_SUCCESS) { printf("CodeletMain: Failed to stop and reset NPE B!\n"); return (IX_FAIL); } if (ixNpeDlNpeStopAndReset(IX_NPEDL_NPEID_NPEC) != IX_SUCCESS) { printf("CodeletMain: Failed to stop and reset NPE C!\n"); return (IX_FAIL); } if (ixNpeDlUnload() != IX_SUCCESS) { printf("CodeletMain: Failed to unload NPE Downloader!\n"); return (IX_FAIL); } if (ixNpeMhUnload() != IX_SUCCESS) { printf("CodeletMain: Failed to unload NPE Message Handler!\n"); return (IX_FAIL); } if (ixEthAccCodeletDispatcherStop(IX_ETH_CODELET_QMGR_DISPATCH_MODE) != IX_SUCCESS) { printf("CodeletMain: Error stopping QMgr Dispatcher loop!\n"); return (IX_FAIL); } if (ixQMgrUnload() != IX_SUCCESS) { printf("CodeletMain: Failed to unload QMgr!\n"); return (IX_FAIL); } if (ixEthAccCodeletMemPoolFree() != IX_SUCCESS) { printf("CodeletMain: Failed to free memory pool!\n"); return (IX_FAIL); } ixEthAccCodeletInitialised = FALSE; return (IX_SUCCESS);}/* * Function definition: ixEthAccCodeletRxSink() * * See header file for documentation. */IX_STATUS ixEthAccCodeletRxSink(void){ IxEthAccPortId portId; IX_ETHACC_IS_CODELET_INITIALISED(); /* Configure all available ports and start traffic */ for (portId = 0; portId < IX_ETHACC_CODELET_MAX_PORT; portId++) { if (ixEthAccCodeletHardwareExists[portId]) { if (ixEthAccCodeletRxSinkStart(portId) != IX_ETH_ACC_SUCCESS) { printf("CodeletMain: Failed to configure the RX Sink Operation Port %u\n", (UINT32)portId); return IX_FAIL; } } } printf("\n"); printf("Rx Sink Operation started.\n"); printf("Begin sending packets in from external source\n"); printf("\n"); /* wait for user input */ if(ixEthAccCodeletLoop() != IX_SUCCESS) { printf("CodeletMain: Failed to get User Input (should never happen)"); return (IX_FAIL); } /* Stop traffic and unconfigure all available ports */ for (portId = 0; portId < IX_ETHACC_CODELET_MAX_PORT; portId++) { if (ixEthAccCodeletHardwareExists[portId]) { if (ixEthAccCodeletRxSinkStop(portId) != IX_ETH_ACC_SUCCESS) { printf("CodeletMain: Failed to unconfigure the RX Sink Operation Port %u\n", (UINT32)portId); return IX_FAIL; } } } /* wait for pending traffic to be completely received */ if (ixEthAccCodeletRecoverBuffers() != IX_SUCCESS) { printf("CodeletMain: Warning! Not all buffers are accounted for\n"); } return (IX_SUCCESS);}/* * Function definition: ixEthAccCodeletSwLoopback() * * See header file for documentation. */IX_STATUS ixEthAccCodeletSwLoopback(void){ IxEthAccPortId portId; IX_ETHACC_IS_CODELET_INITIALISED(); /* Configure all available ports */ for (portId = 0; portId < IX_ETHACC_CODELET_MAX_PORT; portId++) { if (ixEthAccCodeletHardwareExists[portId]) { if (ixEthAccCodeletSwLoopbackStart(portId) != IX_ETH_ACC_SUCCESS) { printf("CodeletMain: Failed to configure the RX Sink Operation Port %u\n", (UINT32)portId); return IX_FAIL; } } } printf("\n"); printf("Software loopback successfully started.\n"); printf("Begin sending packets from external source\n"); printf("\n"); /* wait for user input */ if(ixEthAccCodeletLoop() != IX_SUCCESS) { return (IX_FAIL); } /* Stop traffic and unconfigure all available ports */ for (portId = 0; portId < IX_ETHACC_CODELET_MAX_PORT; portId++) { if (ixEthAccCodeletHardwareExists[portId]) { if (ixEthAccCodeletSwLoopbackStop(portId) != IX_ETH_ACC_SUCCESS) { printf("CodeletMain: Failed to unconfigure the RX Sink Operation Port %u\n", (UINT32)portId); return IX_FAIL; } } } /* wait for pending traffic to be completely received */ if (ixEthAccCodeletRecoverBuffers() != IX_SUCCESS) { printf("CodeletMain: Warning! Not all buffers are accounted for\n"); } return (IX_SUCCESS);}/* * Function definition: ixEthAccCodeletTxGenRxSinkLoopback() * * See header file for documentation. */IX_STATUS ixEthAccCodeletTxGenRxSinkLoopback(IxEthAccPortId inPort, IxEthAccPortId outPort)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -