diff options
Diffstat (limited to 'src/main_dpdk.cpp')
-rw-r--r-- | src/main_dpdk.cpp | 72 |
1 files changed, 54 insertions, 18 deletions
diff --git a/src/main_dpdk.cpp b/src/main_dpdk.cpp index fbd55173..16fc2203 100644 --- a/src/main_dpdk.cpp +++ b/src/main_dpdk.cpp @@ -128,7 +128,7 @@ static char * global_dpdk_args[MAX_DPDK_ARGS]; static char global_cores_str[100]; static char global_prefix_str[100]; static char global_loglevel_str[20]; - +static char global_master_id_str[10]; class CTRexExtendedDriverBase { public: @@ -168,6 +168,14 @@ public: virtual CFlowStatParser *get_flow_stat_parser(); virtual int set_rcv_all(CPhyEthIF * _if, bool set_on)=0; virtual TRexPortAttr * create_port_attr(uint8_t port_id) = 0; + + /* Does this NIC type support automatic packet dropping in case of a link down? + in case it is supported the packets will be dropped, else there would be a back pressure to tx queues + this interface is used as a workaround to let TRex work without link in stateless mode, driver that + does not support that will be failed at init time because it will cause watchdog due to watchdog hang */ + virtual bool drop_packets_incase_of_linkdown() { + return (false); + } }; @@ -363,6 +371,10 @@ private: virtual int add_del_eth_type_rule(uint8_t port_id, enum rte_filter_op op, uint16_t eth_type); virtual int configure_rx_filter_rules_statefull(CPhyEthIF * _if); + virtual bool drop_packets_incase_of_linkdown() { + return (true); + } + private: uint8_t m_if_per_card; }; @@ -3412,9 +3424,15 @@ int CGlobalTRex::ixgbe_start(void){ get_ex_drv()->wait_for_stable_link(); if ( !is_all_links_are_up(true) /*&& !get_is_stateless()*/ ){ // disable start with link down for now - dump_links_status(stdout); - rte_exit(EXIT_FAILURE, " " - " one of the link is down \n"); + + /* temporary solution for trex-192 issue, solve the case for X710/XL710, will work for both Statless and Stateful */ + if ( get_ex_drv()->drop_packets_incase_of_linkdown() ){ + printf(" WARNING : there is no link on one of the ports, driver support auto drop in case of link down - continue\n"); + }else{ + dump_links_status(stdout); + rte_exit(EXIT_FAILURE, " " + " one of the link is down \n"); + } } } else { get_ex_drv()->wait_after_link_up(); @@ -4391,6 +4409,8 @@ void CGlobalTRex::shutdown() { int CGlobalTRex::run_in_master() { + //rte_thread_setname(pthread_self(), "TRex Control"); + if ( get_is_stateless() ) { m_trex_stateless->launch_control_plane(); } @@ -4441,6 +4461,8 @@ int CGlobalTRex::run_in_master() { int CGlobalTRex::run_in_rx_core(void){ + rte_thread_setname(pthread_self(), "TRex RX"); + if (get_is_stateless()) { m_sl_rx_running = true; m_rx_sl.start(); @@ -4457,7 +4479,9 @@ int CGlobalTRex::run_in_rx_core(void){ int CGlobalTRex::run_in_core(virtual_thread_id_t virt_core_id){ std::stringstream ss; - ss << "DP core " << int(virt_core_id); + + ss << "Trex DP core " << int(virt_core_id); + rte_thread_setname(pthread_self(), ss.str().c_str()); CPreviewMode *lp=&CGlobalInfo::m_options.preview; if ( lp->getSingleCore() && @@ -5069,25 +5093,28 @@ int update_dpdk_args(void){ } /* set the DPDK options */ - global_dpdk_args_num =7; + global_dpdk_args_num = 0; - global_dpdk_args[0]=(char *)"xx"; - global_dpdk_args[1]=(char *)"-c"; - global_dpdk_args[2]=(char *)global_cores_str; - global_dpdk_args[3]=(char *)"-n"; - global_dpdk_args[4]=(char *)"4"; + global_dpdk_args[global_dpdk_args_num++]=(char *)"xx"; + global_dpdk_args[global_dpdk_args_num++]=(char *)"-c"; + global_dpdk_args[global_dpdk_args_num++]=(char *)global_cores_str; + global_dpdk_args[global_dpdk_args_num++]=(char *)"-n"; + global_dpdk_args[global_dpdk_args_num++]=(char *)"4"; if ( CGlobalInfo::m_options.preview.getVMode() == 0 ) { - global_dpdk_args[5]=(char *)"--log-level"; + global_dpdk_args[global_dpdk_args_num++]=(char *)"--log-level"; snprintf(global_loglevel_str, sizeof(global_loglevel_str), "%d", 4); - global_dpdk_args[6]=(char *)global_loglevel_str; + global_dpdk_args[global_dpdk_args_num++]=(char *)global_loglevel_str; }else{ - global_dpdk_args[5]=(char *)"--log-level"; + global_dpdk_args[global_dpdk_args_num++]=(char *)"--log-level"; snprintf(global_loglevel_str, sizeof(global_loglevel_str), "%d", CGlobalInfo::m_options.preview.getVMode()+1); - global_dpdk_args[6]=(char *)global_loglevel_str; + global_dpdk_args[global_dpdk_args_num++]=(char *)global_loglevel_str; } - global_dpdk_args_num = 7; + global_dpdk_args[global_dpdk_args_num++] = (char *)"--master-lcore"; + + snprintf(global_master_id_str, sizeof(global_master_id_str), "%u", lpsock->get_master_phy_id()); + global_dpdk_args[global_dpdk_args_num++] = global_master_id_str; /* add white list */ if (lpop->m_run_mode == CParserOption::RUN_MODE_DUMP_INFO and lpop->dump_interfaces.size()) { @@ -5178,6 +5205,7 @@ void dump_interfaces_info() { int main_test(int argc , char * argv[]){ + utl_termio_init(); int ret; @@ -5233,6 +5261,12 @@ int main_test(int argc , char * argv[]){ return (-1); } + /* set affinity to the master core as default */ + cpu_set_t mask; + CPU_ZERO(&mask); + CPU_SET(CGlobalInfo::m_socket.get_master_phy_id(), &mask); + pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask); + ret = rte_eal_init(global_dpdk_args_num, (char **)global_dpdk_args); if (ret < 0){ printf(" You might need to run ./trex-cfg once \n"); @@ -6218,8 +6252,10 @@ int CTRexExtendedDriverBase40G::verify_fw_ver(int port_id) { ret = rte_eth_get_fw_ver(port_id, &version); if (ret == 0) { - printf("port %d: FW ver %02d.%02d.%02d\n", port_id, ((version >> 12) & 0xf), ((version >> 4) & 0xff) - ,(version & 0xf)); + if (CGlobalInfo::m_options.preview.getVMode() >= 1) { + printf("port %d: FW ver %02d.%02d.%02d\n", port_id, ((version >> 12) & 0xf), ((version >> 4) & 0xff) + ,(version & 0xf)); + } if ((((version >> 12) & 0xf) < 5) || ((((version >> 12) & 0xf) == 5) && ((version >> 4 & 0xff) == 0) && ((version & 0xf) < 4))) { |