summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorimarom <imarom@cisco.com>2016-01-10 06:40:58 -0500
committerimarom <imarom@cisco.com>2016-01-10 06:42:24 -0500
commit1d074bf3b198c1f160f6e636c21c16c9c833ce61 (patch)
tree97bb14bac8a3a2053529f8688cf9d58405d672d6 /src
parent773e9d1c67c314aca8f6f88f676b4dd2d777863d (diff)
random packet size - uses expected packet size
instead of the value as is
Diffstat (limited to 'src')
-rw-r--r--src/stateless/cp/trex_stream.cpp5
-rw-r--r--src/stateless/cp/trex_stream.h19
-rw-r--r--src/stateless/cp/trex_stream_vm.cpp56
-rw-r--r--src/stateless/cp/trex_stream_vm.h22
-rw-r--r--src/stateless/cp/trex_streams_compiler.cpp6
5 files changed, 82 insertions, 26 deletions
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);