diff options
author | Hanoh Haim <hhaim@cisco.com> | 2016-02-24 14:55:59 +0200 |
---|---|---|
committer | Hanoh Haim <hhaim@cisco.com> | 2016-02-24 14:55:59 +0200 |
commit | 5a844c9d72411435842e5a0674c6fdc04e5d4e84 (patch) | |
tree | dc2738fe0638ac0ed856c70564bc7096bb33868e /src/stateless/cp | |
parent | 9e616d8eecaefbf538174328edfce8fd96336ce6 (diff) | |
parent | 3eb4f868ef5bc728a46c8012c914f6a9381f4cdb (diff) |
Merge GARP example
Diffstat (limited to 'src/stateless/cp')
-rw-r--r-- | src/stateless/cp/trex_stateless.h | 3 | ||||
-rw-r--r-- | src/stateless/cp/trex_stateless_port.cpp | 73 | ||||
-rw-r--r-- | src/stateless/cp/trex_stateless_port.h | 50 | ||||
-rw-r--r-- | src/stateless/cp/trex_stream.cpp | 21 | ||||
-rw-r--r-- | src/stateless/cp/trex_stream.h | 37 | ||||
-rw-r--r-- | src/stateless/cp/trex_stream_vm.cpp | 8 | ||||
-rw-r--r-- | src/stateless/cp/trex_stream_vm.h | 2 | ||||
-rw-r--r-- | src/stateless/cp/trex_streams_compiler.cpp | 8 | ||||
-rw-r--r-- | src/stateless/cp/trex_vm_splitter.cpp | 2 |
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); } } |