summaryrefslogtreecommitdiffstats
path: root/src/gtest
diff options
context:
space:
mode:
authorHanoh Haim <hhaim@cisco.com>2015-12-24 16:16:49 +0200
committerHanoh Haim <hhaim@cisco.com>2015-12-24 16:16:49 +0200
commit9d1cd91825d48a97ca0ea21fa7bd34900f6c7450 (patch)
treebb3c8585e29f7c6787d0f298e2d2655b21277855 /src/gtest
parent32bdea5fd30ffc378a213e773634015a5d5f255f (diff)
parentba297ed1bfdfbf61bc99fe7f75deb800b570c58e (diff)
merge vm random support
Diffstat (limited to 'src/gtest')
-rw-r--r--src/gtest/trex_stateless_gtest.cpp292
1 files changed, 195 insertions, 97 deletions
diff --git a/src/gtest/trex_stateless_gtest.cpp b/src/gtest/trex_stateless_gtest.cpp
index 2718dead..73b7536a 100644
--- a/src/gtest/trex_stateless_gtest.cpp
+++ b/src/gtest/trex_stateless_gtest.cpp
@@ -161,7 +161,7 @@ TEST_F(basic_vm, vm0) {
StreamVm vm;
vm.add_instruction( new StreamVmInstructionFixChecksumIpv4(20) );
- vm.add_instruction( new StreamVmInstructionFlowMan( "var1",1,
+ vm.add_instruction( new StreamVmInstructionFlowMan( "var1",8,
StreamVmInstructionFlowMan::FLOW_VAR_OP_INC,0,1,7 )
);
vm.add_instruction( new StreamVmInstructionWriteToPkt( "var1",14, 0,true)
@@ -181,9 +181,7 @@ TEST_F(basic_vm, vm1) {
);
vm.add_instruction( new StreamVmInstructionFixChecksumIpv4(14) );
- vm.set_packet_size(128);
-
- vm.compile();
+ vm.compile(128);
uint32_t program_size=vm.get_dp_instruction_buffer()->get_program_size();
@@ -200,15 +198,13 @@ TEST_F(basic_vm, vm2) {
StreamVm vm;
vm.add_instruction( new StreamVmInstructionFlowMan( "var1",1,
- StreamVmInstructionFlowMan::FLOW_VAR_OP_INC,4,1,7 )
+ StreamVmInstructionFlowMan::FLOW_VAR_OP_INC,5,1,7 )
);
vm.add_instruction( new StreamVmInstructionWriteToPkt( "var1",26, 0,true)
);
//vm.add_instruction( new StreamVmInstructionFixChecksumIpv4(14) );
- vm.set_packet_size(128);
-
- vm.compile();
+ vm.compile(128);
uint32_t program_size=vm.get_dp_instruction_buffer()->get_program_size();
@@ -280,15 +276,13 @@ TEST_F(basic_vm, vm3) {
StreamVm vm;
vm.add_instruction( new StreamVmInstructionFlowMan( "var1",4 /* size */,
- StreamVmInstructionFlowMan::FLOW_VAR_OP_INC,4,1,7 )
+ StreamVmInstructionFlowMan::FLOW_VAR_OP_INC,5,1,7 )
);
vm.add_instruction( new StreamVmInstructionWriteToPkt( "var1",26, 0,true)
);
//vm.add_instruction( new StreamVmInstructionFixChecksumIpv4(14) );
- vm.set_packet_size(128);
-
- vm.compile();
+ vm.compile(128);
uint32_t program_size=vm.get_dp_instruction_buffer()->get_program_size();
@@ -367,16 +361,14 @@ TEST_F(basic_vm, vm4) {
StreamVm vm;
- vm.add_instruction( new StreamVmInstructionFlowMan( "var1",4 /* size */,
- StreamVmInstructionFlowMan::FLOW_VAR_OP_INC,4,1,7 )
+ vm.add_instruction( new StreamVmInstructionFlowMan( "var1", 8 /* size */,
+ StreamVmInstructionFlowMan::FLOW_VAR_OP_INC,5,1,7 )
);
vm.add_instruction( new StreamVmInstructionWriteToPkt( "var1",26, 0,false)
);
//vm.add_instruction( new StreamVmInstructionFixChecksumIpv4(14) );
- vm.set_packet_size(128);
-
- vm.compile();
+ vm.compile(128);
uint32_t program_size=vm.get_dp_instruction_buffer()->get_program_size();
@@ -441,8 +433,12 @@ TEST_F(basic_vm, vm4) {
test_udp_pkt);
fprintf(stdout," %d \n",i);
- //utl_DumpBuffer(stdout,test_udp_pkt,PKT_TEST_SIZE,0);
+ utl_DumpBuffer(stdout,test_udp_pkt,PKT_TEST_SIZE,0);
/* not big */
+ EXPECT_EQ(test_udp_pkt[33],0);
+ EXPECT_EQ(test_udp_pkt[32],0);
+ EXPECT_EQ(test_udp_pkt[31],0);
+ EXPECT_EQ(test_udp_pkt[30],0);
EXPECT_EQ(test_udp_pkt[29],0);
EXPECT_EQ(test_udp_pkt[28],0);
EXPECT_EQ(test_udp_pkt[27],0);
@@ -458,11 +454,11 @@ TEST_F(basic_vm, vm5) {
StreamVm vm;
vm.add_instruction( new StreamVmInstructionFlowMan( "var1",4 /* size */,
- StreamVmInstructionFlowMan::FLOW_VAR_OP_INC,4,1,7 )
+ StreamVmInstructionFlowMan::FLOW_VAR_OP_INC,5,1,7 )
);
vm.add_instruction( new StreamVmInstructionFlowMan( "var2",1 /* size */,
- StreamVmInstructionFlowMan::FLOW_VAR_OP_DEC,25,23,27 ) );
+ StreamVmInstructionFlowMan::FLOW_VAR_OP_DEC,24,23,27 ) );
/* src ip */
vm.add_instruction( new StreamVmInstructionWriteToPkt( "var1",26, 0,true)
@@ -474,9 +470,7 @@ TEST_F(basic_vm, vm5) {
vm.add_instruction( new StreamVmInstructionFixChecksumIpv4(14) );
- vm.set_packet_size(128);
-
- vm.compile();
+ vm.compile(128);
uint32_t program_size=vm.get_dp_instruction_buffer()->get_program_size();
@@ -607,7 +601,7 @@ TEST_F(basic_vm, vm6) {
);
vm.add_instruction( new StreamVmInstructionFlowMan( "var2",1 /* size */,
- StreamVmInstructionFlowMan::FLOW_VAR_OP_DEC,25,23,27 ) );
+ StreamVmInstructionFlowMan::FLOW_VAR_OP_DEC,24,23,27 ) );
/* src ip */
vm.add_instruction( new StreamVmInstructionWriteToPkt( "var1",26, 0,true)
@@ -619,9 +613,7 @@ TEST_F(basic_vm, vm6) {
vm.add_instruction( new StreamVmInstructionFixChecksumIpv4(14) );
- vm.set_packet_size(128);
-
- vm.compile();
+ vm.compile(128);
uint32_t program_size=vm.get_dp_instruction_buffer()->get_program_size();
@@ -689,10 +681,7 @@ TEST_F(basic_vm, vm7) {
vm.add_instruction( new StreamVmInstructionWriteToPkt( "cl1.port",34, 0,true)
);
-
- vm.set_packet_size(128);
-
- vm.compile();
+ vm.compile(128);
uint32_t program_size=vm.get_dp_instruction_buffer()->get_program_size();
@@ -759,9 +748,7 @@ TEST_F(basic_vm, vm8) {
);
- vm.set_packet_size(128);
-
- vm.compile();
+ vm.compile(128);
uint32_t program_size=vm.get_dp_instruction_buffer()->get_program_size();
@@ -825,11 +812,8 @@ static void vm_build_program_seq(StreamVm & vm,
vm.add_instruction( new StreamVmInstructionWriteToPkt( "tuple_gen.port",34, 0,true)
);
-
- vm.set_packet_size(packet_size);
-
if (should_compile) {
- vm.compile();
+ vm.compile(packet_size);
}
}
@@ -896,7 +880,7 @@ TEST_F(basic_vm, vm10) {
EXPECT_EQ(36,vm.get_max_packet_update_offset());
- StreamVmDp * lpDpVm =vm.cloneAsVmDp();
+ StreamVmDp * lpDpVm =vm.generate_dp_object();
EXPECT_EQ(lpDpVm->get_bss_size(),vm.get_bss_size());
@@ -991,16 +975,13 @@ TEST_F(basic_vm, vm_syn_attack) {
vm.add_instruction( new StreamVmInstructionWriteToPkt( "dst_port",34+2, 0,true)
);
-
- vm.set_packet_size(128);
-
- vm.compile();
+ vm.compile(128);
printf(" max packet update %lu \n",(ulong)vm.get_max_packet_update_offset());
EXPECT_EQ(38,vm.get_max_packet_update_offset());
- StreamVmDp * lpDpVm =vm.cloneAsVmDp();
+ StreamVmDp * lpDpVm =vm.generate_dp_object();
EXPECT_EQ(lpDpVm->get_bss_size(),vm.get_bss_size());
@@ -2770,76 +2751,193 @@ TEST_F(basic_stl, graph_generator2) {
delete obj;
}
-/* stress test */
-#if 0
-TEST_F(basic_stl, graph_generator2) {
- std::vector<TrexStream *> streams;
- TrexStreamsGraph graph;
- TrexStream *stream;
+class VmSplitTest {
- /* add some multi burst streams */
- stream = new TrexStream(TrexStream::stMULTI_BURST, 0, 1);
- stream->m_enabled = true;
- stream->m_self_start = true;
- stream->m_isg_usec = 100;
+public:
- stream->set_pps(20);
- stream->set_multi_burst(4918, 321312, 15);
- stream->m_next_stream_id = -1;
- stream->m_pkt.len = 64;
+ VmSplitTest(const char *erf_filename) {
+ m_erf_filename = erf_filename;
+ m_stream = NULL;
- streams.push_back(stream);
+ pcap.load_pcap_file("cap2/udp_64B.pcap",0);
+ pcap.update_ip_src(0x10000001);
- stream = new TrexStream(TrexStream::stMULTI_BURST, 0, 2);
- stream->m_enabled = true;
- stream->m_self_start = true;
- stream->m_isg_usec = 59281;
+ }
- stream->set_pps(30);
- stream->set_multi_burst(4918, 51040, 27);
- stream->m_next_stream_id = -1;
- stream->m_pkt.len = 64;
+ ~VmSplitTest() {
+ }
- streams.push_back(stream);
+ void set_stream(TrexStream *stream) {
- stream = new TrexStream(TrexStream::stMULTI_BURST, 0, 3);
- stream->m_enabled = true;
- stream->m_self_start = true;
- stream->m_isg_usec = 59281492;
+ if (m_stream) {
+ delete m_stream;
+ m_stream = NULL;
+ }
- stream->set_pps(40);
- stream->set_multi_burst(4918, 412312, 2917);
- stream->m_next_stream_id = -1;
- stream->m_pkt.len = 64;
+ m_stream = stream;
+ m_stream->m_enabled = true;
+ m_stream->m_self_start = true;
+
+ pcap.clone_packet_into_stream(stream);
+ }
- streams.push_back(stream);
+ void set_flow_var_as_split(StreamVmInstructionFlowMan::flow_var_op_e op,
+ uint64_t start,
+ uint64_t end,
+ uint64_t init) {
+ assert(m_stream);
- /* stream 3 */
- stream = new TrexStream(TrexStream::stCONTINUOUS, 0, 4);
- stream->m_enabled = true;
- stream->m_self_start = true;
+ StreamVmInstructionVar *split_instr = new StreamVmInstructionFlowMan("var1",
+ 8,
+ op,
+ init,
+ start,
+ end);
- stream->m_isg_usec = 50;
- stream->set_pps(30);
- stream->m_next_stream_id = -1;
- stream->m_pkt.len = 1512;
+ StreamVm &vm = m_stream->m_vm;
- streams.push_back(stream);
+ vm.add_instruction(split_instr);
+ vm.add_instruction(new StreamVmInstructionWriteToPkt( "var1", 60 - 8 - 4, 0,true));
- const TrexStreamsGraphObj &obj = graph.generate(streams);
- printf("event_count is: %lu, max BPS: %f, max PPS: %f\n", obj.get_events().size(), obj.get_max_bps(), obj.get_max_pps());
+ vm.add_instruction(new StreamVmInstructionFixChecksumIpv4(14));
-// for (const TrexStreamsGraphObj::rate_event_st &ev : obj.get_events()) {
-// printf("time: %f, diff bps: %f, diff pps: %f\n", ev.time, ev.diff_bps, ev.diff_pps);
-// }
+ vm.set_split_instruction(split_instr);
- for (auto stream : streams) {
- delete stream;
- }
-}
+ }
+
+ void set_client_var_as_split(uint32_t client_min_value,
+ uint32_t client_max_value,
+ uint16_t port_min,
+ uint16_t port_max) {
+
+
+ assert(m_stream);
+
+ StreamVmInstructionVar *split_instr = new StreamVmInstructionFlowClient("var1",
+ client_min_value,
+ client_max_value,
+ port_min,
+ port_max,
+ 0,
+ 0);
+
+
+ StreamVm &vm = m_stream->m_vm;
+
+ vm.add_instruction(split_instr);
+
+ /* src ip */
+ vm.add_instruction(new StreamVmInstructionWriteToPkt( "var1.ip",26, 0,true));
+ vm.add_instruction(new StreamVmInstructionFixChecksumIpv4(14));
+
+ /* src port */
+ vm.add_instruction(new StreamVmInstructionWriteToPkt("var1.port",34, 0,true));
+
+ vm.set_split_instruction(split_instr);
+ }
+
+ void run(uint8_t dp_core_count, uint8_t dp_core_to_check) {
+ TrexStreamsCompiler compile;
+ std::vector<TrexStreamsCompiledObj *> objs;
+ std::vector<TrexStream *> streams;
+
+ if (m_stream->m_vm.is_vm_empty()) {
+ set_flow_var_as_split(StreamVmInstructionFlowMan::FLOW_VAR_OP_INC,
+ 0,
+ 1000,
+ 0);
+ }
+
+ streams.push_back(m_stream);
+
+ /* compiling for 8 cores */
+ assert(compile.compile(0, streams, objs, dp_core_count));
+
+ /* choose one DP object */
+ TrexStatelessDpStart *lpStartCmd = new TrexStatelessDpStart(0, 0, objs[dp_core_to_check], 1 /*sec */ );
+ objs[dp_core_to_check] = NULL;
+ /* free all the non used DP objects */
+ for (auto obj : objs) {
+ if (obj) {
+ delete obj;
+ }
+ }
+
+
+ CParserOption * po =&CGlobalInfo::m_options;
+ po->preview.setVMode(7);
+ po->preview.setFileWrite(true);
+ po->out_file = m_erf_filename;
+
+ CBasicStl t1;
+ t1.m_msg = lpStartCmd;
+ bool res=t1.init();
+ EXPECT_EQ_UINT32(1, res?1:0);
+
+ }
+
+private:
+ const char *m_erf_filename;
+ TrexStream *m_stream;
+ CPcapLoader pcap;
+};
+
+
+
+TEST_F(basic_stl, vm_split_flow_var_inc) {
+
+ VmSplitTest split("exp/stl_vm_split_flow_var_inc.erf");
+
+ TrexStream stream(TrexStream::stSINGLE_BURST, 0, 0);
+ stream.set_pps(1000);
+
+ split.set_stream(&stream);
+ split.run(8, 4);
+
+}
+
+TEST_F(basic_stl, vm_split_flow_var_small_range) {
+ /* small range */
+ VmSplitTest split("exp/stl_vm_split_flow_var_small_range.erf");
+
+ TrexStream stream(TrexStream::stSINGLE_BURST, 0, 0);
+ stream.set_pps(1000);
+
+ split.set_stream(&stream);
+ split.set_flow_var_as_split(StreamVmInstructionFlowMan::FLOW_VAR_OP_INC, 0, 1, 0);
+
+ split.run(8, 4);
+
+}
+
+TEST_F(basic_stl, vm_split_flow_var_big_range) {
+ VmSplitTest split("exp/stl_vm_split_flow_var_big_range.erf");
+
+ TrexStream stream(TrexStream::stSINGLE_BURST, 0, 0);
+ stream.set_pps(1000);
+
+ split.set_stream(&stream);
+ split.set_flow_var_as_split(StreamVmInstructionFlowMan::FLOW_VAR_OP_DEC, 1, 1000, 1000);
+
+ split.run(8, 7);
+
+
+}
+
+TEST_F(basic_stl, vm_split_client_var) {
+ VmSplitTest split("exp/stl_vm_split_client_var.erf");
-#endif
+ TrexStream stream(TrexStream::stSINGLE_BURST, 0, 0);
+ stream.set_pps(1000);
+
+ split.set_stream(&stream);
+ split.set_client_var_as_split(0x10000001, 0x100000fe, 5000, 5050);
+
+ split.run(8, 7);
+
+
+}
/********************************************* Itay Tests End *************************************/