From ddef1a091fc5d73d2d7d49f19a121bfc8f129851 Mon Sep 17 00:00:00 2001 From: imarom Date: Wed, 3 Aug 2016 16:36:58 +0300 Subject: fix for https://trex-tgn.cisco.com/youtrack/issue/trex-226 commit #trex-226 --- src/stateless/cp/trex_stateless_port.cpp | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'src/stateless/cp/trex_stateless_port.cpp') diff --git a/src/stateless/cp/trex_stateless_port.cpp b/src/stateless/cp/trex_stateless_port.cpp index 0fe4b410..376453b9 100644 --- a/src/stateless/cp/trex_stateless_port.cpp +++ b/src/stateless/cp/trex_stateless_port.cpp @@ -394,6 +394,17 @@ TrexStatelessPort::common_port_stop_actions(bool async) { } +/** + * core is considered active if it has a pending for async stop + * + */ +bool +TrexStatelessPort::is_core_active(int core_id) { + return ( (m_pending_async_stop_event != TrexDpPortEvents::INVALID_ID) && + (m_dp_events.is_core_pending_on_event(m_pending_async_stop_event, core_id)) + ); +} + void TrexStatelessPort::pause_traffic(void) { @@ -409,7 +420,9 @@ TrexStatelessPort::pause_traffic(void) { /* send a pause message */ TrexStatelessCpToDpMsgBase *pause_msg = new TrexStatelessDpPause(m_port_id); - send_message_to_all_dp(pause_msg); + + /* send message to all cores */ + send_message_to_all_dp(pause_msg, true); /* make sure all DP cores paused */ m_dp_events.barrier(); @@ -431,10 +444,9 @@ TrexStatelessPort::resume_traffic(void) { /* generate a message to all the relevant DP cores to start transmitting */ TrexStatelessCpToDpMsgBase *resume_msg = new TrexStatelessDpResume(m_port_id); - send_message_to_all_dp(resume_msg); + send_message_to_all_dp(resume_msg, true); change_state(PORT_STATE_TX); - Json::Value data; data["port_id"] = m_port_id; get_stateless_obj()->get_publisher()->publish_event(TrexPublisher::EVENT_PORT_RESUMED, data); @@ -609,9 +621,15 @@ TrexStatelessPort::encode_stats(Json::Value &port) { } void -TrexStatelessPort::send_message_to_all_dp(TrexStatelessCpToDpMsgBase *msg) { +TrexStatelessPort::send_message_to_all_dp(TrexStatelessCpToDpMsgBase *msg, bool send_to_active_only) { for (auto core_id : m_cores_id_list) { + + /* skip non active cores if requested */ + if ( (send_to_active_only) && (!is_core_active(core_id)) ) { + continue; + } + send_message_to_dp(core_id, msg->clone()); } -- cgit 1.2.3-korg