summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHanoh Haim <hhaim@cisco.com>2015-11-23 14:10:19 +0200
committerHanoh Haim <hhaim@cisco.com>2015-11-23 14:10:19 +0200
commit54c1f0fc29b3d4580f7a13cffbe625fe88e37b16 (patch)
tree2651b973d3b24cbf0138dc08509986d470bd0e38
parentbd8b640077591377375f2ab5ec6c542119ead0a2 (diff)
add pause/resume into the console
-rwxr-xr-xscripts/automation/trex_control_plane/client/trex_stateless_client.py118
-rw-r--r--scripts/automation/trex_control_plane/console/old_console.py12
-rwxr-xr-xscripts/automation/trex_control_plane/console/trex_console.py10
-rw-r--r--src/stateless/cp/trex_stateless_port.cpp25
-rw-r--r--src/stateless/cp/trex_stateless_port.h5
-rw-r--r--src/stateless/cp/trex_streams_compiler.cpp7
-rw-r--r--src/stateless/cp/trex_streams_compiler.h5
-rw-r--r--src/stateless/dp/trex_stateless_dp_core.cpp1
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;