From 540da82e6df983c36f54b9f48dfa251b348d8e38 Mon Sep 17 00:00:00 2001 From: imarom Date: Sun, 4 Sep 2016 17:42:48 +0300 Subject: dual mode - check for ERF only --- .../trex_control_plane/stl/trex_stl_lib/trex_stl_client.py | 3 +++ .../trex_control_plane/stl/trex_stl_lib/utils/parsing_opts.py | 2 +- src/common/captureFile.h | 3 +++ src/common/erf.h | 5 +++++ src/common/pcap.h | 6 +++++- src/rpc-server/commands/trex_rpc_cmd_general.cpp | 10 ++++++++++ src/stateless/cp/trex_stateless_port.cpp | 3 +-- 7 files changed, 28 insertions(+), 4 deletions(-) diff --git a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py index 2c1fa5e9..b4a7b4c1 100755 --- a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py +++ b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py @@ -2234,6 +2234,9 @@ class STLClient(object): # for dual mode check that all are masters if is_dual: + if not pcap_filename.endswith('erf'): + raise STLError("dual mode: only ERF format is supported for dual mode") + for port in ports: master = port slave = port ^ 0x1 diff --git a/scripts/automation/trex_control_plane/stl/trex_stl_lib/utils/parsing_opts.py b/scripts/automation/trex_control_plane/stl/trex_stl_lib/utils/parsing_opts.py index 4e57aae3..779f35db 100755 --- a/scripts/automation/trex_control_plane/stl/trex_stl_lib/utils/parsing_opts.py +++ b/scripts/automation/trex_control_plane/stl/trex_stl_lib/utils/parsing_opts.py @@ -317,7 +317,7 @@ OPTIONS_DB = {MULTIPLIER: ArgumentPack(['-m', '--multiplier'], DUAL: ArgumentPack(['--dual'], {"action": "store_true", 'default': False, - 'help': "Transmit in a dual mode - requires a slave attached to the port"}), + 'help': "Transmit in a dual mode - requires ownership on the adjacent port"}), FILE_PATH: ArgumentPack(['-f'], {'metavar': 'FILE', diff --git a/src/common/captureFile.h b/src/common/captureFile.h index 32b98272..fefa62bd 100755 --- a/src/common/captureFile.h +++ b/src/common/captureFile.h @@ -183,6 +183,9 @@ public: * open file for reading. */ virtual bool Create(char * name, int loops = 0) = 0; + + virtual capture_type_e get_type() = 0; + protected: int m_loops; uint64_t m_file_size; diff --git a/src/common/erf.h b/src/common/erf.h index 299bcdc5..2feb4fd6 100755 --- a/src/common/erf.h +++ b/src/common/erf.h @@ -248,6 +248,11 @@ public: bool Create(char *filename, int loops = 0); void Delete(); virtual bool ReadPacket(CCapPktRaw * lpPacket); + + virtual capture_type_e get_type() { + return ERF; + } + private: FILE * m_handle; }; diff --git a/src/common/pcap.h b/src/common/pcap.h index fb266e31..01c981d7 100755 --- a/src/common/pcap.h +++ b/src/common/pcap.h @@ -79,9 +79,13 @@ public: * otherwise (reached eof) */ virtual bool ReadPacket(CCapPktRaw *lpPacket); - virtual void Rewind(); + virtual void Rewind(); + virtual capture_type_e get_type() { + return LIBPCAP; + } + private: LibPCapReader(LibPCapReader &); diff --git a/src/rpc-server/commands/trex_rpc_cmd_general.cpp b/src/rpc-server/commands/trex_rpc_cmd_general.cpp index ba3c1658..85f77a7f 100644 --- a/src/rpc-server/commands/trex_rpc_cmd_general.cpp +++ b/src/rpc-server/commands/trex_rpc_cmd_general.cpp @@ -525,8 +525,18 @@ TrexRpcCmdPushRemote::_run(const Json::Value ¶ms, Json::Value &result) { if (!slave->get_owner().verify(slave_handler)) { generate_execute_err(result, "incorrect or missing slave port handler"); } + + std::stringstream ss; + CCapReaderBase *reader = CCapReaderFactory::CreateReader((char *)pcap_filename.c_str(), 0, ss); + if (!reader) { + generate_execute_err(result, ss.str()); + } + if (reader->get_type() != ERF) { + generate_execute_err(result, "dual mode is only supported on ERF format"); + } } + try { port->push_remote(pcap_filename, ipg_usec, speedup, count, duration, is_dual); } catch (const TrexException &ex) { diff --git a/src/stateless/cp/trex_stateless_port.cpp b/src/stateless/cp/trex_stateless_port.cpp index df50d3e2..5162c477 100644 --- a/src/stateless/cp/trex_stateless_port.cpp +++ b/src/stateless/cp/trex_stateless_port.cpp @@ -504,9 +504,8 @@ TrexStatelessPort::push_remote(const std::string &pcap_filename, verify_state(PORT_STATE_IDLE | PORT_STATE_STREAMS, "push_remote"); /* check that file exists */ - CCapReaderBase *reader; std::stringstream ss; - reader = CCapReaderFactory::CreateReader((char *)pcap_filename.c_str(), 0, ss); + CCapReaderBase *reader = CCapReaderFactory::CreateReader((char *)pcap_filename.c_str(), 0, ss); if (!reader) { throw TrexException(ss.str()); } -- cgit 1.2.3-korg