diff options
author | 2015-11-23 14:10:19 +0200 | |
---|---|---|
committer | 2015-11-23 14:10:19 +0200 | |
commit | 54c1f0fc29b3d4580f7a13cffbe625fe88e37b16 (patch) | |
tree | 2651b973d3b24cbf0138dc08509986d470bd0e38 | |
parent | bd8b640077591377375f2ab5ec6c542119ead0a2 (diff) |
add pause/resume into the console
-rwxr-xr-x | scripts/automation/trex_control_plane/client/trex_stateless_client.py | 118 | ||||
-rw-r--r-- | scripts/automation/trex_control_plane/console/old_console.py | 12 | ||||
-rwxr-xr-x | scripts/automation/trex_control_plane/console/trex_console.py | 10 | ||||
-rw-r--r-- | src/stateless/cp/trex_stateless_port.cpp | 25 | ||||
-rw-r--r-- | src/stateless/cp/trex_stateless_port.h | 5 | ||||
-rw-r--r-- | src/stateless/cp/trex_streams_compiler.cpp | 7 | ||||
-rw-r--r-- | src/stateless/cp/trex_streams_compiler.h | 5 | ||||
-rw-r--r-- | src/stateless/dp/trex_stateless_dp_core.cpp | 1 |
8 files changed, 172 insertions, 11 deletions
diff --git a/scripts/automation/trex_control_plane/client/trex_stateless_client.py b/scripts/automation/trex_control_plane/client/trex_stateless_client.py index 164cdb90..7bcbf2c7 100755 --- a/scripts/automation/trex_control_plane/client/trex_stateless_client.py +++ b/scripts/automation/trex_control_plane/client/trex_stateless_client.py @@ -331,6 +331,40 @@ class Port(object): return self.ok() + def pause (self): + + if (self.state != self.STATE_TX) : + return self.err("port is not transmitting") + + params = {"handler": self.handler, + "port_id": self.port_id} + + rc, data = self.transmit("pause_traffic", params) + if not rc: + return self.err(data) + + # only valid state after stop + self.state = self.STATE_PAUSE + + return self.ok() + + def resume (self): + + if (self.state != self.STATE_PAUSE) : + return self.err("port is not in pause mode") + + params = {"handler": self.handler, + "port_id": self.port_id} + + rc, data = self.transmit("resume_traffic", params) + if not rc: + return self.err(data) + + # only valid state after stop + self.state = self.STATE_TX + + return self.ok() + ################# events handler ###################### def async_event_port_stopped (self): self.state = self.STATE_STREAMS @@ -615,6 +649,25 @@ class CTRexStatelessClient(object): return rc + def resume_traffic (self, port_id_list = None, force = False): + + port_id_list = self.__ports(port_id_list) + rc = RC() + + for port_id in port_id_list: + rc.add(self.ports[port_id].resume()) + + return rc + + def pause_traffic (self, port_id_list = None, force = False): + + port_id_list = self.__ports(port_id_list) + rc = RC() + + for port_id in port_id_list: + rc.add(self.ports[port_id].pause()) + + return rc def stop_traffic (self, port_id_list = None, force = False): @@ -707,6 +760,71 @@ class CTRexStatelessClient(object): return RC_OK() + # pause cmd + def cmd_pause (self, port_id_list): + + # find the relveant ports + active_ports = list(set(self.get_active_ports()).intersection(port_id_list)) + + if not active_ports: + msg = "No active traffic on porvided ports" + print format_text(msg, 'bold') + return RC_ERR(msg) + + rc = self.pause_traffic(active_ports) + rc.annotate("Pausing traffic on port(s) {0}:".format(port_id_list)) + if rc.bad(): + return rc + + return RC_OK() + + def cmd_pause_line (self, line): + '''Pause active traffic in specified ports on TRex\n''' + parser = parsing_opts.gen_parser(self, + "pause", + self.cmd_stop_line.__doc__, + parsing_opts.PORT_LIST_WITH_ALL) + + opts = parser.parse_args(line.split()) + if opts is None: + return RC_ERR("bad command line paramters") + + return self.cmd_pause(opts.ports) + + + # resume cmd + def cmd_resume (self, port_id_list): + + # find the relveant ports + active_ports = list(set(self.get_active_ports()).intersection(port_id_list)) + + if not active_ports: + msg = "No active traffic on porvided ports" + print format_text(msg, 'bold') + return RC_ERR(msg) + + rc = self.resume_traffic(active_ports) + rc.annotate("Resume traffic on port(s) {0}:".format(port_id_list)) + if rc.bad(): + return rc + + return RC_OK() + + + def cmd_resume_line (self, line): + '''Resume active traffic in specified ports on TRex\n''' + parser = parsing_opts.gen_parser(self, + "resume", + self.cmd_stop_line.__doc__, + parsing_opts.PORT_LIST_WITH_ALL) + + opts = parser.parse_args(line.split()) + if opts is None: + return RC_ERR("bad command line paramters") + + return self.cmd_resume(opts.ports) + + # start cmd def cmd_start (self, port_id_list, stream_list, mult, force, duration): diff --git a/scripts/automation/trex_control_plane/console/old_console.py b/scripts/automation/trex_control_plane/console/old_console.py index 93c7e3f4..9d61a3a6 100644 --- a/scripts/automation/trex_control_plane/console/old_console.py +++ b/scripts/automation/trex_control_plane/console/old_console.py @@ -636,6 +636,18 @@ class TRexConsole1(cmd.Cmd): res_ok = self.stop_traffic(port_list) return + def do_pause(self, line): + '''Pause active traffic in specified ports on TRex\n''' + parser = parsing_opts.gen_parser("stop", self.do_stop.__doc__, + parsing_opts.PORT_LIST_WITH_ALL) + opts = parser.parse_args(line.split()) + if opts is None: + # avoid further processing in this command + return + port_list = self.extract_port_list(opts) + res_ok = self.stop_traffic(port_list) + return + def help_stop(self): self.do_stop("-h") diff --git a/scripts/automation/trex_control_plane/console/trex_console.py b/scripts/automation/trex_control_plane/console/trex_console.py index 995965fd..c03f2a82 100755 --- a/scripts/automation/trex_control_plane/console/trex_console.py +++ b/scripts/automation/trex_control_plane/console/trex_console.py @@ -263,6 +263,16 @@ class TRexConsole(TRexGeneralCmd): '''stops port(s) transmitting traffic\n''' self.stateless_client.cmd_stop_line(line) + ############# stop + def do_pause(self, line): + '''pause port(s) transmitting traffic\n''' + self.stateless_client.cmd_pause_line(line) + + ############# stop + def do_resume(self, line): + '''resume port(s) transmitting traffic\n''' + self.stateless_client.cmd_resume_line(line) + def help_stop(self): diff --git a/src/stateless/cp/trex_stateless_port.cpp b/src/stateless/cp/trex_stateless_port.cpp index fbc5f7c7..40392e68 100644 --- a/src/stateless/cp/trex_stateless_port.cpp +++ b/src/stateless/cp/trex_stateless_port.cpp @@ -127,6 +127,9 @@ TrexStatelessPort::start_traffic(double mul, double duration) { TrexStatelessCpToDpMsgBase *start_msg = new TrexStatelessDpStart(m_port_id, event_id, compiled_obj, duration); + m_last_all_streams_continues = compiled_obj->get_all_streams_continues(); + m_last_duration =duration; + change_state(PORT_STATE_TX); send_message_to_dp(start_msg); @@ -143,7 +146,8 @@ TrexStatelessPort::start_traffic(double mul, double duration) { void TrexStatelessPort::stop_traffic(void) { - if (m_port_state != PORT_STATE_TX) { + if (!( (m_port_state == PORT_STATE_TX) + || (m_port_state ==PORT_STATE_PAUSE) )) { return; } @@ -164,14 +168,18 @@ TrexStatelessPort::pause_traffic(void) { verify_state(PORT_STATE_TX); - #if 0 - /* generate a message to all the relevant DP cores to start transmitting */ - TrexStatelessCpToDpMsgBase *stop_msg = new TrexStatelessDpStop(m_port_id); + if (m_last_all_streams_continues == false) { + throw TrexRpcException(" pause is supported when all streams are in continues mode "); + } + + if ( m_last_duration>0.0 ) { + throw TrexRpcException(" pause is supported when duration is not enable is start command "); + } + + TrexStatelessCpToDpMsgBase *stop_msg = new TrexStatelessDpPause(m_port_id); send_message_to_dp(stop_msg); - m_port_state = PORT_STATE_UP_IDLE; - #endif change_state(PORT_STATE_PAUSE); } @@ -180,14 +188,11 @@ TrexStatelessPort::resume_traffic(void) { verify_state(PORT_STATE_PAUSE); - #if 0 /* generate a message to all the relevant DP cores to start transmitting */ - TrexStatelessCpToDpMsgBase *stop_msg = new TrexStatelessDpStop(m_port_id); + TrexStatelessCpToDpMsgBase *stop_msg = new TrexStatelessDpResume(m_port_id); send_message_to_dp(stop_msg); - m_port_state = PORT_STATE_UP_IDLE; - #endif change_state(PORT_STATE_TX); } diff --git a/src/stateless/cp/trex_stateless_port.h b/src/stateless/cp/trex_stateless_port.h index 73157c15..006ec97c 100644 --- a/src/stateless/cp/trex_stateless_port.h +++ b/src/stateless/cp/trex_stateless_port.h @@ -207,6 +207,8 @@ public: return m_dp_events; } + + private: @@ -260,6 +262,9 @@ private: /* holds the DP cores associated with this port */ std::vector<int> m_cores_id_list; + bool m_last_all_streams_continues; + double m_last_duration; + TrexDpPortEvents m_dp_events; }; diff --git a/src/stateless/cp/trex_streams_compiler.cpp b/src/stateless/cp/trex_streams_compiler.cpp index bdfc3c01..302863ae 100644 --- a/src/stateless/cp/trex_streams_compiler.cpp +++ b/src/stateless/cp/trex_streams_compiler.cpp @@ -136,6 +136,7 @@ private: * stream compiled object *************************************/ TrexStreamsCompiledObj::TrexStreamsCompiledObj(uint8_t port_id, double mul) : m_port_id(port_id), m_mul(mul) { + m_all_continues=false; } TrexStreamsCompiledObj::~TrexStreamsCompiledObj() { @@ -401,6 +402,7 @@ TrexStreamsCompiler::compile(const std::vector<TrexStream *> &streams, } + bool all_continues=true; /* for now we do something trivial, */ for (auto stream : streams) { @@ -408,6 +410,9 @@ TrexStreamsCompiler::compile(const std::vector<TrexStream *> &streams, if (!stream->m_enabled) { continue; } + if (stream->get_type() != TrexStream::stCONTINUOUS ) { + all_continues=false; + } int new_id= nodes.get(stream->m_stream_id)->m_compressed_stream_id; assert(new_id>=0); @@ -423,7 +428,7 @@ TrexStreamsCompiler::compile(const std::vector<TrexStream *> &streams, my_next_stream_id ); } - + obj.m_all_continues =all_continues; return true; } diff --git a/src/stateless/cp/trex_streams_compiler.h b/src/stateless/cp/trex_streams_compiler.h index 200f7ce9..17ca3c74 100644 --- a/src/stateless/cp/trex_streams_compiler.h +++ b/src/stateless/cp/trex_streams_compiler.h @@ -64,6 +64,10 @@ public: return (m_mul); } + bool get_all_streams_continues(){ + return (m_all_continues); + } + void Dump(FILE *fd); private: @@ -73,6 +77,7 @@ private: std::vector<obj_st> m_objs; + bool m_all_continues; uint8_t m_port_id; double m_mul; }; diff --git a/src/stateless/dp/trex_stateless_dp_core.cpp b/src/stateless/dp/trex_stateless_dp_core.cpp index 03b13d6c..9b4a6ad9 100644 --- a/src/stateless/dp/trex_stateless_dp_core.cpp +++ b/src/stateless/dp/trex_stateless_dp_core.cpp @@ -160,6 +160,7 @@ bool TrexStatelessDpPerPort::stop_traffic(uint8_t port_id, bool stop_on_id, int event_id){ + if (m_state == TrexStatelessDpPerPort::ppSTATE_IDLE) { assert(m_active_streams==0); return false; |