summaryrefslogtreecommitdiffstats
path: root/src/stateless/cp
diff options
context:
space:
mode:
authorHanoh Haim <hhaim@cisco.com>2016-02-24 14:55:59 +0200
committerHanoh Haim <hhaim@cisco.com>2016-02-24 14:55:59 +0200
commit5a844c9d72411435842e5a0674c6fdc04e5d4e84 (patch)
treedc2738fe0638ac0ed856c70564bc7096bb33868e /src/stateless/cp
parent9e616d8eecaefbf538174328edfce8fd96336ce6 (diff)
parent3eb4f868ef5bc728a46c8012c914f6a9381f4cdb (diff)
Merge GARP example
Diffstat (limited to 'src/stateless/cp')
-rw-r--r--src/stateless/cp/trex_stateless.h3
-rw-r--r--src/stateless/cp/trex_stateless_port.cpp73
-rw-r--r--src/stateless/cp/trex_stateless_port.h50
-rw-r--r--src/stateless/cp/trex_stream.cpp21
-rw-r--r--src/stateless/cp/trex_stream.h37
-rw-r--r--src/stateless/cp/trex_stream_vm.cpp8
-rw-r--r--src/stateless/cp/trex_stream_vm.h2
-rw-r--r--src/stateless/cp/trex_streams_compiler.cpp8
-rw-r--r--src/stateless/cp/trex_vm_splitter.cpp2
9 files changed, 131 insertions, 73 deletions
diff --git a/src/stateless/cp/trex_stateless.h b/src/stateless/cp/trex_stateless.h
index 59be9241..cc47da6b 100644
--- a/src/stateless/cp/trex_stateless.h
+++ b/src/stateless/cp/trex_stateless.h
@@ -32,6 +32,7 @@ limitations under the License.
#include <trex_rpc_server_api.h>
#include <publisher/trex_publisher.h>
+#include <flow_stat.h>
#include <internal_api/trex_platform_api.h>
/**
@@ -165,6 +166,8 @@ public:
return m_rpc_server;
}
+ CFlowStatRuleMgr m_rx_flow_stat;
+
protected:
/* no copy or assignment */
diff --git a/src/stateless/cp/trex_stateless_port.cpp b/src/stateless/cp/trex_stateless_port.cpp
index 99b6565c..88c38112 100644
--- a/src/stateless/cp/trex_stateless_port.cpp
+++ b/src/stateless/cp/trex_stateless_port.cpp
@@ -59,7 +59,7 @@ TrexStatelessPort::TrexStatelessPort(uint8_t port_id, const TrexPlatformApi *api
m_port_state = PORT_STATE_IDLE;
/* get the platform specific data */
- api->get_interface_info(port_id, m_driver_name, m_speed);
+ api->get_interface_info(port_id, m_driver_name, m_speed, m_has_crc);
/* get the DP cores belonging to this port */
api->port_id_to_cores(m_port_id, core_pair_list);
@@ -179,7 +179,6 @@ TrexStatelessPort::start_traffic(const TrexPortMultiplier &mul, double duration,
m_last_duration = duration;
change_state(PORT_STATE_TX);
-
/* update the DP - messages will be freed by the DP */
int index = 0;
for (auto core_id : m_cores_id_list) {
@@ -231,12 +230,32 @@ TrexStatelessPort::stop_traffic(void) {
send_message_to_all_dp(stop_msg);
+ /* continue to general actions */
+ common_port_stop_actions(false);
+
+}
+
+/**
+ * when a port stops, perform various actions
+ *
+ */
+void
+TrexStatelessPort::common_port_stop_actions(bool event_triggered) {
+
change_state(PORT_STATE_STREAMS);
Json::Value data;
data["port_id"] = m_port_id;
- get_stateless_obj()->get_publisher()->publish_event(TrexPublisher::EVENT_PORT_STOPPED, data);
+ if (event_triggered) {
+ get_stateless_obj()->get_publisher()->publish_event(TrexPublisher::EVENT_PORT_STOPPED, data);
+ } else {
+ get_stateless_obj()->get_publisher()->publish_event(TrexPublisher::EVENT_PORT_FINISHED_TX, data);
+ }
+
+ for (auto entry : m_stream_table) {
+ get_stateless_obj()->m_rx_flow_stat.stop_stream(entry.second);
+ }
}
void
@@ -428,12 +447,7 @@ TrexStatelessPort::on_dp_event_occured(TrexDpPortEvent::event_e event_type) {
switch (event_type) {
case TrexDpPortEvent::EVENT_STOP:
- /* set a stop event */
- change_state(PORT_STATE_STREAMS);
- /* send a ZMQ event */
-
- data["port_id"] = m_port_id;
- get_stateless_obj()->get_publisher()->publish_event(TrexPublisher::EVENT_PORT_FINISHED_TX, data);
+ common_port_stop_actions(true);
break;
default:
@@ -651,6 +665,47 @@ TrexStatelessPort::get_port_effective_rate(double &pps,
}
+void
+TrexStatelessPort::add_stream(TrexStream *stream) {
+
+ verify_state(PORT_STATE_IDLE | PORT_STATE_STREAMS);
+
+ m_stream_table.add_stream(stream);
+ delete_streams_graph();
+
+ get_stateless_obj()->m_rx_flow_stat.add_stream(stream);
+
+ change_state(PORT_STATE_STREAMS);
+}
+
+void
+TrexStatelessPort::remove_stream(TrexStream *stream) {
+
+ verify_state(PORT_STATE_STREAMS);
+
+ get_stateless_obj()->m_rx_flow_stat.del_stream(stream);
+
+ m_stream_table.remove_stream(stream);
+ delete_streams_graph();
+
+ if (m_stream_table.size() == 0) {
+ change_state(PORT_STATE_IDLE);
+ }
+}
+
+void
+TrexStatelessPort::remove_and_delete_all_streams() {
+ verify_state(PORT_STATE_IDLE | PORT_STATE_STREAMS);
+
+ vector<TrexStream *> streams;
+ get_object_list(streams);
+
+ for (auto stream : streams) {
+ remove_stream(stream);
+ delete stream;
+ }
+}
+
/************* Trex Port Owner **************/
TrexPortOwner::TrexPortOwner() {
diff --git a/src/stateless/cp/trex_stateless_port.h b/src/stateless/cp/trex_stateless_port.h
index 49e69757..434181c4 100644
--- a/src/stateless/cp/trex_stateless_port.h
+++ b/src/stateless/cp/trex_stateless_port.h
@@ -236,34 +236,9 @@ public:
*
*/
- void add_stream(TrexStream *stream) {
- verify_state(PORT_STATE_IDLE | PORT_STATE_STREAMS);
-
- m_stream_table.add_stream(stream);
- delete_streams_graph();
-
- change_state(PORT_STATE_STREAMS);
- }
-
- void remove_stream(TrexStream *stream) {
- verify_state(PORT_STATE_STREAMS);
-
- m_stream_table.remove_stream(stream);
- delete_streams_graph();
-
- if (m_stream_table.size() == 0) {
- change_state(PORT_STATE_IDLE);
- }
- }
-
- void remove_and_delete_all_streams() {
- verify_state(PORT_STATE_IDLE | PORT_STATE_STREAMS);
-
- m_stream_table.remove_and_delete_all_streams();
- delete_streams_graph();
-
- change_state(PORT_STATE_IDLE);
- }
+ void add_stream(TrexStream *stream);
+ void remove_stream(TrexStream *stream);
+ void remove_and_delete_all_streams();
TrexStream * get_stream_by_id(uint32_t stream_id) {
return m_stream_table.get_stream_by_id(stream_id);
@@ -308,6 +283,18 @@ public:
*/
uint64_t get_port_speed_bps() const;
+ /**
+ * return true if port adds CRC to a packet (not occurs for
+ * VNICs)
+ *
+ * @author imarom (24-Feb-16)
+ *
+ * @return bool
+ */
+ bool has_crc_added() const {
+ return m_has_crc;
+ }
+
TrexPortOwner & get_owner() {
return m_owner;
}
@@ -357,6 +344,12 @@ private:
/**
+ * when a port stops, perform various actions
+ *
+ */
+ void common_port_stop_actions(bool event_triggered);
+
+ /**
* calculate effective M per core
*
*/
@@ -382,6 +375,7 @@ private:
uint8_t m_port_id;
port_state_e m_port_state;
std::string m_driver_name;
+ bool m_has_crc;
TrexPlatformApi::driver_speed_e m_speed;
diff --git a/src/stateless/cp/trex_stream.cpp b/src/stateless/cp/trex_stream.cpp
index f1c93a11..9c7898a8 100644
--- a/src/stateless/cp/trex_stream.cpp
+++ b/src/stateless/cp/trex_stream.cpp
@@ -130,7 +130,7 @@ TrexStream::TrexStream(uint8_t type,
m_pkt.len = 0;
m_expected_pkt_len = 0;
- m_rx_check.m_enable = false;
+ m_rx_check.m_enabled = false;
m_burst_total_pkts=0;
@@ -191,15 +191,6 @@ void TrexStreamTable::remove_stream(TrexStream *stream) {
}
-void TrexStreamTable::remove_and_delete_all_streams() {
-
- for (auto stream : m_stream_table) {
- delete stream.second;
- }
-
- m_stream_table.clear();
-}
-
TrexStream * TrexStreamTable::get_stream_by_id(uint32_t stream_id) {
auto search = m_stream_table.find(stream_id);
@@ -254,5 +245,13 @@ TrexStreamRate::get_line_speed_bps() {
double
TrexStreamRate::get_pkt_size() {
- return m_stream.get_pkt_size();
+ TrexStatelessPort *port = get_stateless_obj()->get_port_by_id(m_stream.m_port_id);
+
+ double pkt_size = m_stream.get_pkt_size();
+
+ if (port->has_crc_added()) {
+ pkt_size += 4;
+ }
+
+ return pkt_size;
}
diff --git a/src/stateless/cp/trex_stream.h b/src/stateless/cp/trex_stream.h
index cc05c198..36f9d407 100644
--- a/src/stateless/cp/trex_stream.h
+++ b/src/stateless/cp/trex_stream.h
@@ -244,29 +244,29 @@ private:
double get_pkt_size();
void calculate_from_pps() {
- m_bps_L1 = m_pps * (get_pkt_size() + 24) * 8;
- m_bps_L2 = m_pps * (get_pkt_size() + 4) * 8;
+ m_bps_L1 = m_pps * (get_pkt_size() + 20) * 8;
+ m_bps_L2 = m_pps * get_pkt_size() * 8;
m_percentage = (m_bps_L1 / get_line_speed_bps()) * 100.0;
}
void calculate_from_bps_L1() {
- m_bps_L2 = m_bps_L1 * ( (get_pkt_size() + 4.0) / (get_pkt_size() + 24.0) );
- m_pps = m_bps_L2 / (8 * (get_pkt_size() + 4));
+ m_bps_L2 = m_bps_L1 * ( get_pkt_size() / (get_pkt_size() + 20.0) );
+ m_pps = m_bps_L2 / (8 * get_pkt_size());
m_percentage = (m_bps_L1 / get_line_speed_bps()) * 100.0;
}
void calculate_from_bps_L2() {
- m_bps_L1 = m_bps_L2 * ( (get_pkt_size() + 24.0) / (get_pkt_size() + 4.0));
- m_pps = m_bps_L2 / (8 * (get_pkt_size() + 4));
+ m_bps_L1 = m_bps_L2 * ( (get_pkt_size() + 20.0) / get_pkt_size());
+ m_pps = m_bps_L2 / (8 * get_pkt_size());
m_percentage = (m_bps_L1 / get_line_speed_bps()) * 100.0;
}
void calculate_from_percentage() {
m_bps_L1 = (m_percentage / 100.0) * get_line_speed_bps();
- m_bps_L2 = m_bps_L1 * ( (get_pkt_size() + 4.0) / (get_pkt_size() + 24.0) );
- m_pps = m_bps_L2 / (8 * (get_pkt_size() + 4));
+ m_bps_L2 = m_bps_L1 * ( get_pkt_size() / (get_pkt_size() + 20.0) );
+ m_pps = m_bps_L2 / (8 * get_pkt_size());
}
@@ -394,11 +394,19 @@ public:
}
/* create new stream */
- TrexStream * clone() const {
+ TrexStream * clone(bool full = false) const {
/* not all fields will be cloned */
TrexStream *dp = new TrexStream(m_type,m_port_id,m_stream_id);
+
+ /* on full clone we copy also VM */
+ if (full) {
+ m_vm.clone(dp->m_vm);
+
+ }
+
+ /* copy VM DP product */
if (m_vm_dp) {
dp->m_vm_dp = m_vm_dp->clone();
} else {
@@ -500,10 +508,10 @@ public:
/* RX check */
struct {
- bool m_enable;
+ bool m_enabled;
bool m_seq_enabled;
bool m_latency;
- uint32_t m_stream_id;
+ uint32_t m_user_id;
} m_rx_check;
@@ -559,12 +567,7 @@ public:
*/
void remove_stream(TrexStream *stream);
- /**
- * remove all streams on the table
- * memory will be deleted
- */
- void remove_and_delete_all_streams();
-
+
/**
* fetch a stream if exists
* o.w NULL
diff --git a/src/stateless/cp/trex_stream_vm.cpp b/src/stateless/cp/trex_stream_vm.cpp
index d8395ba4..7a1dc122 100644
--- a/src/stateless/cp/trex_stream_vm.cpp
+++ b/src/stateless/cp/trex_stream_vm.cpp
@@ -887,14 +887,14 @@ StreamVm::set_split_instruction(StreamVmInstructionVar *instr) {
}
/**
- * copy instructions from this VM to 'other'
+ * clone VM from this VM to 'other'
*
* @author imarom (22-Dec-15)
*
* @param other
*/
void
-StreamVm::copy_instructions(StreamVm &other) const {
+StreamVm::clone(StreamVm &other) const {
/* clear previous if any exists */
for (auto instr : other.m_inst_list) {
delete instr;
@@ -904,6 +904,7 @@ StreamVm::copy_instructions(StreamVm &other) const {
for (auto instr : m_inst_list) {
StreamVmInstruction *new_instr = instr->clone();
+
other.m_inst_list.push_back(new_instr);
/* for the split instruction - find the right one */
@@ -914,6 +915,7 @@ StreamVm::copy_instructions(StreamVm &other) const {
}
}
+ other.m_is_random_var = m_is_random_var;
}
/**
@@ -974,7 +976,7 @@ StreamVm::calc_expected_pkt_size(uint16_t regular_pkt_size) const {
StreamVm dummy;
- this->copy_instructions(dummy);
+ this->clone(dummy);
dummy.compile(regular_pkt_size);
assert(dummy.m_expected_pkt_size != 0);
diff --git a/src/stateless/cp/trex_stream_vm.h b/src/stateless/cp/trex_stream_vm.h
index f5d58edd..c1db090d 100644
--- a/src/stateless/cp/trex_stream_vm.h
+++ b/src/stateless/cp/trex_stream_vm.h
@@ -1456,7 +1456,7 @@ public:
* clone VM instructions
*
*/
- void copy_instructions(StreamVm &other) const;
+ void clone(StreamVm &other) const;
bool is_vm_empty() const {
diff --git a/src/stateless/cp/trex_streams_compiler.cpp b/src/stateless/cp/trex_streams_compiler.cpp
index aca74498..7c91754c 100644
--- a/src/stateless/cp/trex_streams_compiler.cpp
+++ b/src/stateless/cp/trex_streams_compiler.cpp
@@ -475,16 +475,18 @@ TrexStreamsCompiler::compile_stream(TrexStream *stream,
new_next_id = nodes.get(stream->m_next_stream_id)->m_compressed_stream_id;
}
+ TrexStream *fixed_rx_flow_stat_stream = stream->clone(true);
+ get_stateless_obj()->m_rx_flow_stat.start_stream(fixed_rx_flow_stat_stream);
/* can this stream be split to many cores ? */
if (!stream->is_splitable(dp_core_count)) {
- compile_stream_on_single_core(stream,
+ compile_stream_on_single_core(fixed_rx_flow_stat_stream,
factor,
objs[0],
new_id,
new_next_id);
} else {
- compile_stream_on_all_cores(stream,
+ compile_stream_on_all_cores(fixed_rx_flow_stat_stream,
factor,
dp_core_count,
objs,
@@ -492,7 +494,7 @@ TrexStreamsCompiler::compile_stream(TrexStream *stream,
new_next_id);
}
-
+ delete fixed_rx_flow_stat_stream;
}
/**
diff --git a/src/stateless/cp/trex_vm_splitter.cpp b/src/stateless/cp/trex_vm_splitter.cpp
index 5e6d4fbd..963b4525 100644
--- a/src/stateless/cp/trex_vm_splitter.cpp
+++ b/src/stateless/cp/trex_vm_splitter.cpp
@@ -190,7 +190,7 @@ void
TrexVmSplitter::duplicate_vm() {
/* for each core - duplicate the instructions */
for (TrexStream *core_stream : *m_core_streams) {
- m_stream->m_vm.copy_instructions(core_stream->m_vm);
+ m_stream->m_vm.clone(core_stream->m_vm);
}
}