From 1d074bf3b198c1f160f6e636c21c16c9c833ce61 Mon Sep 17 00:00:00 2001 From: imarom Date: Sun, 10 Jan 2016 06:40:58 -0500 Subject: random packet size - uses expected packet size instead of the value as is --- src/stateless/cp/trex_stream.cpp | 5 +-- src/stateless/cp/trex_stream.h | 19 ++++++++-- src/stateless/cp/trex_stream_vm.cpp | 56 ++++++++++++++++++++++-------- src/stateless/cp/trex_stream_vm.h | 22 +++++++++--- src/stateless/cp/trex_streams_compiler.cpp | 6 ++-- 5 files changed, 82 insertions(+), 26 deletions(-) (limited to 'src/stateless') diff --git a/src/stateless/cp/trex_stream.cpp b/src/stateless/cp/trex_stream.cpp index 976cfa07..077c30b4 100644 --- a/src/stateless/cp/trex_stream.cpp +++ b/src/stateless/cp/trex_stream.cpp @@ -118,8 +118,9 @@ TrexStream::TrexStream(uint8_t type, m_enabled = false; m_self_start = false; - m_pkt.binary = NULL; - m_pkt.len = 0; + m_pkt.binary = NULL; + m_pkt.len = 0; + m_expected_pkt_len = 0; m_rx_check.m_enable = false; diff --git a/src/stateless/cp/trex_stream.h b/src/stateless/cp/trex_stream.h index a164f266..0964d39a 100644 --- a/src/stateless/cp/trex_stream.h +++ b/src/stateless/cp/trex_stream.h @@ -199,6 +199,7 @@ public: /* deep copy */ dp->m_pkt.clone(m_pkt.binary,m_pkt.len); + dp->m_expected_pkt_len = m_expected_pkt_len; dp->m_rx_check = m_rx_check; dp->m_pps = m_pps; dp->m_burst_total_pkts = m_burst_total_pkts; @@ -220,9 +221,21 @@ public: return ( (m_burst_total_pkts / m_pps) * 1000 * 1000); } - double get_bps() const { + double get_bps() { + + /* lazy calculate the expected packet length */ + if (m_expected_pkt_len == 0) { + /* if we have a VM - it might have changed the packet (even random) */ + if (m_vm.is_vm_empty()) { + m_expected_pkt_len = m_pkt.len; + } else { + m_expected_pkt_len = m_vm.calc_expected_pkt_size(m_pkt.len); + } + } + + /* packet length + 4 CRC bytes to bits and multiplied by PPS */ - return (m_pps * (m_pkt.len + 4) * 8); + return (m_pps * (m_expected_pkt_len + 4) * 8); } void Dump(FILE *fd); @@ -258,6 +271,8 @@ public: StreamVmDp *m_vm_dp; CStreamPktData m_pkt; + uint16_t m_expected_pkt_len; + /* pkt */ diff --git a/src/stateless/cp/trex_stream_vm.cpp b/src/stateless/cp/trex_stream_vm.cpp index b992d1ab..b91f0fb5 100644 --- a/src/stateless/cp/trex_stream_vm.cpp +++ b/src/stateless/cp/trex_stream_vm.cpp @@ -139,6 +139,18 @@ StreamVmInstruction::~StreamVmInstruction() { * **************************/ void StreamVm::add_instruction(StreamVmInstruction *inst) { + + if (inst->get_instruction_type() == StreamVmInstruction::itFLOW_MAN) { + StreamVmInstructionFlowMan * ins_man=(StreamVmInstructionFlowMan *)inst; + if (ins_man->m_op == StreamVmInstructionFlowMan::FLOW_VAR_OP_RANDOM) { + m_is_random_var = true; + } + } + + if (inst->get_instruction_type() == StreamVmInstruction::itPKT_SIZE_CHANGE) { + m_is_change_pkt_size = true; + } + m_inst_list.push_back(inst); } @@ -194,22 +206,8 @@ void StreamVm::build_flow_var_table() { var_clear_table(); m_cur_var_offset=0; uint32_t ins_id=0; - m_is_random_var=false; - m_is_change_pkt_size=false; - /* scan all flow var instruction and build */ - for (auto inst : m_inst_list) { - if ( inst->get_instruction_type() == StreamVmInstruction::itFLOW_MAN ){ - StreamVmInstructionFlowMan * ins_man=(StreamVmInstructionFlowMan *)inst; - if (ins_man->m_op ==StreamVmInstructionFlowMan::FLOW_VAR_OP_RANDOM){ - m_is_random_var =true; - } - } - - if ( inst->get_instruction_type() == StreamVmInstruction::itPKT_SIZE_CHANGE ){ - m_is_change_pkt_size=true; - } - } + /* scan all flow var instruction and build */ /* if we found allocate BSS +4 bytes */ if ( m_is_random_var ){ @@ -346,6 +344,8 @@ void StreamVm::build_flow_var_table() { if ( var.m_ins.m_ins_flowv->m_min_value < 60) { var.m_ins.m_ins_flowv->m_min_value =60; } + + m_expected_pkt_size = (var.m_ins.m_ins_flowv->m_min_value + var.m_ins.m_ins_flowv->m_max_value) / 2; } }/* for */ @@ -783,6 +783,32 @@ StreamVm::~StreamVm() { free_bss(); } +/** + * calculate expected packet size of stream's VM + * + */ +uint16_t +StreamVm::calc_expected_pkt_size(uint16_t regular_pkt_size) const { + + /* if no packet size change - simply return the regular packet size */ + if (!m_is_change_pkt_size) { + return regular_pkt_size; + } + /* if we have an instruction that changes the packet size + so find the expected size + we must compile the VM temporarly to get this value + */ + + StreamVm dummy; + + this->copy_instructions(dummy); + dummy.compile(regular_pkt_size); + + assert(dummy.m_expected_pkt_size != 0); + + return (dummy.m_expected_pkt_size); +} + /** * return a pointer to a flow var / client var * by name if exists, otherwise NULL diff --git a/src/stateless/cp/trex_stream_vm.h b/src/stateless/cp/trex_stream_vm.h index edc4f730..ca7f71c1 100644 --- a/src/stateless/cp/trex_stream_vm.h +++ b/src/stateless/cp/trex_stream_vm.h @@ -1143,16 +1143,25 @@ public: m_prefix_size=0; m_bss=0; m_pkt_size=0; + m_expected_pkt_size=0; m_cur_var_offset=0; + m_is_random_var=false; + m_is_change_pkt_size=false; + m_split_instr=NULL; m_is_compiled = false; } - uint16_t get_packet_size() const { - return ( m_pkt_size); - } + /** + * calculate the expected packet size + * might be different from regular_pkt_size + * if the VM changes the packet length (random) + * + */ + uint16_t calc_expected_pkt_size(uint16_t regular_pkt_size) const; + void set_split_instruction(StreamVmInstructionVar *instr); @@ -1227,7 +1236,7 @@ public: } - bool is_compiled() { + bool is_compiled() const { return m_is_compiled; } @@ -1285,7 +1294,10 @@ private: bool m_is_change_pkt_size; bool m_is_compiled; uint16_t m_prefix_size; + uint16_t m_pkt_size; + uint16_t m_expected_pkt_size; + uint16_t m_cur_var_offset; uint16_t m_max_field_update; /* the location of the last byte that is going to be changed in the packet */ @@ -1296,6 +1308,8 @@ private: StreamDPVmInstructions m_instructions; StreamVmInstructionVar *m_split_instr; + + }; diff --git a/src/stateless/cp/trex_streams_compiler.cpp b/src/stateless/cp/trex_streams_compiler.cpp index 6bcddc1d..aa3fa1a0 100644 --- a/src/stateless/cp/trex_streams_compiler.cpp +++ b/src/stateless/cp/trex_streams_compiler.cpp @@ -550,7 +550,7 @@ TrexStreamsGraph::add_rate_events_for_stream_cont(double &offset_usec, const Tre start_event.time = offset_usec + stream->m_isg_usec; start_event.diff_pps = stream->get_pps(); - start_event.diff_bps = stream->get_bps(); + start_event.diff_bps = ((TrexStream *)stream)->get_bps(); m_graph_obj->add_rate_event(start_event); /* no more events after this stream */ @@ -577,7 +577,7 @@ TrexStreamsGraph::add_rate_events_for_stream_single_burst(double &offset_usec, c /* start event */ start_event.time = offset_usec + stream->m_isg_usec; start_event.diff_pps = stream->get_pps(); - start_event.diff_bps = stream->get_bps(); + start_event.diff_bps = ((TrexStream *)stream)->get_bps(); m_graph_obj->add_rate_event(start_event); /* stop event */ @@ -606,7 +606,7 @@ TrexStreamsGraph::add_rate_events_for_stream_multi_burst(double &offset_usec, co /* for debug purposes */ start_event.diff_pps = stream->get_pps(); - start_event.diff_bps = stream->get_bps(); + start_event.diff_bps = ((TrexStream *)stream)->get_bps(); start_event.stream_id = stream->m_stream_id; stop_event.diff_pps = -(start_event.diff_pps); -- cgit 1.2.3-korg