summaryrefslogtreecommitdiffstats
path: root/src/main_dpdk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main_dpdk.cpp')
-rw-r--r--src/main_dpdk.cpp72
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))) {