summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIdo Barnea <ibarnea@cisco.com>2017-03-09 11:53:37 +0200
committerIdo Barnea <ibarnea@cisco.com>2017-03-09 11:53:37 +0200
commitf48443a11497c9a38c1aa3df42741e4a55ac780f (patch)
treeffa6219c03937e4edfc42c83ead7e60050a9ee99 /src
parentd8a541a28d09ecc85629f29a57db8a4be1fe526c (diff)
trex-370. Added --no-hw-flow-stat command line option
Signed-off-by: Ido Barnea <ibarnea@cisco.com>
Diffstat (limited to 'src')
-rwxr-xr-xsrc/bp_sim.h9
-rw-r--r--src/main_dpdk.cpp40
2 files changed, 41 insertions, 8 deletions
diff --git a/src/bp_sim.h b/src/bp_sim.h
index 435c054b..7346615a 100755
--- a/src/bp_sim.h
+++ b/src/bp_sim.h
@@ -419,6 +419,14 @@ public:
return (btGetMaskBit32(m_flags,2,2) ? true:false);
}
+ void set_disable_hw_flow_stat(bool enable) {
+ btSetMaskBit32(m_flags, 3, 3, enable ? 1 : 0);
+ }
+
+ bool get_disable_hw_flow_stat() {
+ return (btGetMaskBit32(m_flags, 3, 3) ? true:false);
+ }
+
void set_disable_flow_control_setting(bool enable){
btSetMaskBit32(m_flags,4,4,enable?1:0);
}
@@ -427,7 +435,6 @@ public:
return (btGetMaskBit32(m_flags,4,4) ? true:false);
}
-
/* learn & verify mode */
void set_learn_and_verify_mode_enable(bool enable){
btSetMaskBit32(m_flags,5,5,enable?1:0);
diff --git a/src/main_dpdk.cpp b/src/main_dpdk.cpp
index 12317d3f..0da245ba 100644
--- a/src/main_dpdk.cpp
+++ b/src/main_dpdk.cpp
@@ -415,10 +415,21 @@ public:
virtual int dump_fdir_global_stats(CPhyEthIF * _if, FILE *fd);
virtual int get_stat_counters_num() {return MAX_FLOW_STATS;}
virtual int get_rx_stat_capabilities() {
- return TrexPlatformApi::IF_STAT_IPV4_ID | TrexPlatformApi::IF_STAT_PAYLOAD;
+ uint32_t ret = TrexPlatformApi::IF_STAT_IPV4_ID | TrexPlatformApi::IF_STAT_PAYLOAD;
+ // HW counters on x710 does not support coutning bytes.
+ if ( CGlobalInfo::m_options.preview.get_disable_hw_flow_stat() ) {
+ ret |= TrexPlatformApi::IF_STAT_RX_BYTES_COUNT;
+ }
+ return ret;
}
virtual int wait_for_stable_link();
- virtual bool hw_rx_stat_supported(){return true;}
+ virtual bool hw_rx_stat_supported(){
+ if (CGlobalInfo::m_options.preview.get_disable_hw_flow_stat()) {
+ return false;
+ } else {
+ return true;
+ }
+ }
virtual int verify_fw_ver(int i);
virtual CFlowStatParser *get_flow_stat_parser();
virtual int set_rcv_all(CPhyEthIF * _if, bool set_on);
@@ -696,6 +707,7 @@ enum { OPT_HELP,
OPT_LEARN_VERIFY,
OPT_L_PKT_MODE,
OPT_NO_FLOW_CONTROL,
+ OPT_NO_HW_FLOW_STAT,
OPT_VLAN,
OPT_RX_CHECK_HOPS,
OPT_CLIENT_CFG_FILE,
@@ -757,6 +769,7 @@ static CSimpleOpt::SOption parser_options[] =
{ OPT_LEARN_VERIFY, "--learn-verify", SO_NONE },
{ OPT_L_PKT_MODE, "--l-pkt-mode", SO_REQ_SEP },
{ OPT_NO_FLOW_CONTROL, "--no-flow-control-change", SO_NONE },
+ { OPT_NO_HW_FLOW_STAT, "--no-hw-flow-stat", SO_NONE },
{ OPT_VLAN, "--vlan", SO_NONE },
{ OPT_CLIENT_CFG_FILE, "--client_cfg", SO_REQ_SEP },
{ OPT_CLIENT_CFG_FILE, "--client-cfg", SO_REQ_SEP },
@@ -787,6 +800,9 @@ static int usage(){
printf("\n");
printf(" Available options are:\n");
+ printf(" --active-flows : An experimental switch to scale up or down the number of active flows. \n");
+ printf(" It is not accurate due to the quantization of flow scheduler and in some case does not work. \n");
+ printf(" Example --active-flows 500000 wil set the ballpark of the active flow to be ~0.5M \n");
printf(" --allow-coredump : Allow creation of core dump \n");
printf(" --arp-refresh-period : Period in seconds between sending of gratuitous ARP for our addresses. Value of 0 means 'never send' \n");
printf(" -c <num>> : Number of hardware threads to allocate for each port pair. Overrides the 'c' argument from config file \n");
@@ -825,6 +841,8 @@ static int usage(){
printf(" --mbuf-factor : Factor for packet memory \n");
printf(" --nc : If set, will not wait for all flows to be closed, before terminating - see manual for more information \n");
printf(" --no-flow-control-change : By default TRex disables flow-control. If this option is given, it does not touch it \n");
+ printf(" --no-hw-flow-stat : Relevant only for Intel x710 stateless mode. Do not use HW counters for flow stats\n");
+ printf(" : Enabling this will support lower traffic rate, but will also report RX byte count statistics. See manual for more details\n");
printf(" --no-key : Daemon mode, don't get input from keyboard \n");
printf(" --no-ofed-check : Disable the check of OFED version \n");
printf(" --no-scapy-server : Disable Scapy server implicit start at stateless \n");
@@ -845,10 +863,6 @@ static int usage(){
printf(" --vm-sim : Simulate vm with driver of one input queue and one output queue \n");
printf(" -w <num> : Wait num seconds between init of interfaces and sending traffic, default is 1 \n");
- printf(" --active-flows : An experimental switch to scale up or down the number of active flows. \n");
- printf(" It is not accurate due to the quantization of flow scheduler and in some case does not work. \n");
- printf(" Example --active-flows 500000 wil set the ballpark of the active flow to be ~0.5M \n");
-
printf("\n");
printf(" Examples: ");
printf(" basic trex run for 20 sec and multiplier of 10 \n");
@@ -994,6 +1008,9 @@ static int parse_options(int argc, char *argv[], CParserOption* po, bool first_t
po->m_l_pkt_mode=(uint8_t)tmp_data;
break;
+ case OPT_NO_HW_FLOW_STAT:
+ po->preview.set_disable_hw_flow_stat(true);
+ break;
case OPT_NO_FLOW_CONTROL:
po->preview.set_disable_flow_control_setting(true);
break;
@@ -6645,7 +6662,16 @@ int CTRexExtendedDriverBase40G::add_del_rx_flow_stat_rule(uint8_t port_id, enum
}
}
- add_del_rules(op, port_id, rte_type, 0, IP_ID_RESERVE_BASE + id, next_proto, MAIN_DPDK_DROP_Q, rule_id);
+ // If we count flow stat in hardware, we want all packets to be dropped.
+ // If we count in software, we want to receive them.
+ uint16_t queue;
+ if (CGlobalInfo::m_options.preview.get_disable_hw_flow_stat()) {
+ queue = MAIN_DPDK_RX_Q;
+ } else {
+ queue = MAIN_DPDK_DROP_Q;
+ }
+
+ add_del_rules(op, port_id, rte_type, 0, IP_ID_RESERVE_BASE + id, next_proto, queue, rule_id);
return 0;
}