summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--scripts/automation/regression/unit_tests/functional_tests/stl_basic_tests.py5
-rw-r--r--scripts/exp/burst_3st_loop_x_times.pcapbin0 -> 936 bytes
-rw-r--r--scripts/stl/burst_3st_loop_x_times.py53
-rw-r--r--src/rpc-server/commands/trex_rpc_cmd_stream.cpp10
-rw-r--r--src/stateless/dp/trex_stateless_dp_core.cpp19
-rw-r--r--src/stateless/dp/trex_stream_node.h3
6 files changed, 83 insertions, 7 deletions
diff --git a/scripts/automation/regression/unit_tests/functional_tests/stl_basic_tests.py b/scripts/automation/regression/unit_tests/functional_tests/stl_basic_tests.py
index bacfca36..e44948c5 100644
--- a/scripts/automation/regression/unit_tests/functional_tests/stl_basic_tests.py
+++ b/scripts/automation/regression/unit_tests/functional_tests/stl_basic_tests.py
@@ -174,12 +174,13 @@ class CStlBasic_Test(functional_general_test.CGeneralFunctional_Test):
["yaml/imix_3pkt_vm.yaml","-m 50kpps --limit 20 --cores 2",True],
["udp_1pkt_simple_mac_dst.py","-m 1 -l 1 ",True],
["udp_1pkt_simple_mac_src.py","-m 1 -l 1 ",True],
- ["udp_1pkt_simple_mac_dst_src.py","-m 1 -l 1 ",True]
+ ["udp_1pkt_simple_mac_dst_src.py","-m 1 -l 1 ",True],
+ ["burst_3st_loop_x_times.py","-m 1 -l 20 ",True]
];
- p1 = [ ["udp_1pkt_simple_mac_dst_src.py","-m 1 -l 1 ",True] ]
+ p1 = [ ["burst_3st_loop_x_times.py","-m 1 -l 20 ",True] ]
for obj in p:
diff --git a/scripts/exp/burst_3st_loop_x_times.pcap b/scripts/exp/burst_3st_loop_x_times.pcap
new file mode 100644
index 00000000..ca29a1b9
--- /dev/null
+++ b/scripts/exp/burst_3st_loop_x_times.pcap
Binary files differ
diff --git a/scripts/stl/burst_3st_loop_x_times.py b/scripts/stl/burst_3st_loop_x_times.py
new file mode 100644
index 00000000..2604124b
--- /dev/null
+++ b/scripts/stl/burst_3st_loop_x_times.py
@@ -0,0 +1,53 @@
+from trex_stl_lib.api import *
+
+# 1 clients MAC override the LSB of destination
+class STLS1(object):
+
+ def __init__ (self):
+ self.fsize =64; # the size of the packet
+
+
+ def create_stream (self):
+
+ # create a base packet and pad it to size
+ size = self.fsize - 4; # no FCS
+ base_pkt = Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/UDP(dport=12,sport=1025)
+ base_pkt1 = Ether()/IP(src="16.0.0.2",dst="48.0.0.1")/UDP(dport=12,sport=1025)
+ base_pkt2 = Ether()/IP(src="16.0.0.3",dst="48.0.0.1")/UDP(dport=12,sport=1025)
+ pad = max(0, size - len(base_pkt)) * 'x'
+
+
+ return STLProfile( [ STLStream( isg = 10.0, # star in delay
+ name ='S0',
+ packet = STLPktBuilder(pkt = base_pkt/pad),
+ mode = STLTXSingleBurst( pps = 10, total_pkts = 1),
+ next = 'S1'), # point to next stream
+
+ STLStream( self_start = False, # stream is disabled enable trow S0
+ name ='S1',
+ packet = STLPktBuilder(pkt = base_pkt1/pad),
+ mode = STLTXSingleBurst( pps = 10, total_pkts = 2),
+ next = 'S2' ),
+
+ STLStream( self_start = False, # stream is disabled enable trow S0
+ name ='S2',
+ packet = STLPktBuilder(pkt = base_pkt2/pad),
+ mode = STLTXSingleBurst( pps = 10, total_pkts = 3 ),
+ action_count = 2, # loop 2 times
+ next = 'S0' # back to S0 loop
+ )
+ ]).get_streams()
+
+
+ def get_streams (self, direction = 0):
+ # create 1 stream
+ return self.create_stream()
+
+
+# dynamic load - used for trex console or simulator
+def register():
+ return STLS1()
+
+
+
+
diff --git a/src/rpc-server/commands/trex_rpc_cmd_stream.cpp b/src/rpc-server/commands/trex_rpc_cmd_stream.cpp
index 87e205b0..918ff99b 100644
--- a/src/rpc-server/commands/trex_rpc_cmd_stream.cpp
+++ b/src/rpc-server/commands/trex_rpc_cmd_stream.cpp
@@ -57,7 +57,15 @@ TrexRpcCmdAddStream::_run(const Json::Value &params, Json::Value &result) {
stream->m_enabled = parse_bool(section, "enabled", result);
stream->m_self_start = parse_bool(section, "self_start", result);
stream->m_flags = parse_int(section, "flags", result);
- stream->m_action_count = (uint16_t)parse_int(section, "action_count", result);
+ int cnt = parse_int(section, "action_count", result);
+ if (cnt<0 || cnt >= UINT16_MAX) {
+ std::stringstream ss;
+ ss << "bad action_count provided: should be between " << 0 << " and " << UINT16_MAX;
+ printf(" %s \n",ss.str().c_str());
+ delete stream;
+ generate_execute_err(result, ss.str());
+ }
+ stream->m_action_count = (uint16_t)cnt;
/* inter stream gap */
stream->m_isg_usec = parse_double(section, "isg", result);
diff --git a/src/stateless/dp/trex_stateless_dp_core.cpp b/src/stateless/dp/trex_stateless_dp_core.cpp
index a84269ab..39080453 100644
--- a/src/stateless/dp/trex_stateless_dp_core.cpp
+++ b/src/stateless/dp/trex_stateless_dp_core.cpp
@@ -348,9 +348,20 @@ bool TrexStatelessDpCore::set_stateless_next_node(CGenNodeStateless * cur_node,
assert(state != CGenNodeStateless::ss_FREE_RESUSE);
if (state == CGenNodeStateless::ss_INACTIVE ) {
- /* refill start info and scedule, no update in active streams */
- next_node->refresh();
- schedule = true;
+ if (cur_node->m_action_counter > 0) {
+ cur_node->m_action_counter--;
+ if (cur_node->m_action_counter==0) {
+ to_stop_port = lp_port->update_number_of_active_streams(1);
+ }else{
+ /* refill start info and scedule, no update in active streams */
+ next_node->refresh();
+ schedule = true;
+ }
+ }else{
+ /* refill start info and scedule, no update in active streams */
+ next_node->refresh();
+ schedule = true;
+ }
}else{
to_stop_port = lp_port->update_number_of_active_streams(1);
@@ -554,6 +565,8 @@ TrexStatelessDpCore::add_stream(TrexStatelessDpPerPort * lp_port,
node->m_cache_mbuf=0;
node->m_type = CGenNode::STATELESS_PKT;
+ node->m_action_counter = stream->m_action_count;
+
/* clone the stream from control plane memory to DP memory */
node->m_ref_stream_info = stream->clone();
/* no need for this memory anymore on the control plane memory */
diff --git a/src/stateless/dp/trex_stream_node.h b/src/stateless/dp/trex_stream_node.h
index db7f19e8..ab43defe 100644
--- a/src/stateless/dp/trex_stream_node.h
+++ b/src/stateless/dp/trex_stream_node.h
@@ -81,7 +81,8 @@ private:
void * m_cache_mbuf;
double m_next_time_offset; /* in sec */
- uint32_t m_pad11;
+ uint16_t m_action_counter;
+ uint16_t m_pad11;
uint32_t m_pad12;
stream_state_t m_state;