From 951b09ef1b892594840f091f861f11ad274541ec Mon Sep 17 00:00:00 2001 From: imarom Date: Wed, 18 Jan 2017 13:08:41 +0200 Subject: many capture modes in Python console Signed-off-by: imarom --- src/rpc-server/commands/trex_rpc_cmd_general.cpp | 43 ++++++++++++++++++---- src/rpc-server/commands/trex_rpc_cmds.h | 1 + .../messaging/trex_stateless_messaging.cpp | 13 +++++++ src/stateless/messaging/trex_stateless_messaging.h | 15 ++++++++ src/stateless/rx/trex_stateless_capture.cpp | 9 ++--- src/stateless/rx/trex_stateless_capture.h | 2 +- 6 files changed, 68 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/rpc-server/commands/trex_rpc_cmd_general.cpp b/src/rpc-server/commands/trex_rpc_cmd_general.cpp index 80f69fa3..8f7431e4 100644 --- a/src/rpc-server/commands/trex_rpc_cmd_general.cpp +++ b/src/rpc-server/commands/trex_rpc_cmd_general.cpp @@ -853,7 +853,7 @@ TrexRpcCmdSetL3::_run(const Json::Value ¶ms, Json::Value &result) { */ trex_rpc_cmd_rc_e TrexRpcCmdCapture::_run(const Json::Value ¶ms, Json::Value &result) { - const std::string cmd = parse_choice(params, "command", {"start", "stop", "fetch", "status"}, result); + const std::string cmd = parse_choice(params, "command", {"start", "stop", "fetch", "status", "remove"}, result); if (cmd == "start") { parse_cmd_start(params, result); @@ -863,6 +863,8 @@ TrexRpcCmdCapture::_run(const Json::Value ¶ms, Json::Value &result) { parse_cmd_fetch(params, result); } else if (cmd == "status") { parse_cmd_status(params, result); + } else if (cmd == "remove") { + parse_cmd_remove(params, result); } else { /* can't happen */ assert(0); @@ -878,10 +880,9 @@ TrexRpcCmdCapture::_run(const Json::Value ¶ms, Json::Value &result) { void TrexRpcCmdCapture::parse_cmd_start(const Json::Value ¶ms, Json::Value &result) { - uint32_t limit = parse_uint32(params, "limit", result); - const Json::Value &tx_json = parse_array(params, "tx", result); - const Json::Value &rx_json = parse_array(params, "rx", result); - + uint32_t limit = parse_uint32(params, "limit", result); + const Json::Value &tx_json = parse_array(params, "tx", result); + const Json::Value &rx_json = parse_array(params, "rx", result); CaptureFilter filter; std::set ports; @@ -909,7 +910,7 @@ TrexRpcCmdCapture::parse_cmd_start(const Json::Value ¶ms, Json::Value &resul static MsgReply reply; reply.reset(); - + TrexStatelessRxCaptureStart *start_msg = new TrexStatelessRxCaptureStart(filter, limit, reply); get_stateless_obj()->send_msg_to_rx(start_msg); @@ -918,7 +919,7 @@ TrexRpcCmdCapture::parse_cmd_start(const Json::Value ¶ms, Json::Value &resul generate_execute_err(result, rc.get_err()); } - result["result"] = Json::objectValue; + result["result"]["capture_id"] = rc.get_new_id(); } /** @@ -990,7 +991,33 @@ TrexRpcCmdCapture::parse_cmd_fetch(const Json::Value ¶ms, Json::Value &resul generate_execute_err(result, rc.get_err()); } - result["result"]["pkts"] = rc.get_pkt_buffer()->to_json(); + const TrexPktBuffer *pkt_buffer = rc.get_pkt_buffer(); + result["result"]["pending"] = rc.get_pending(); + result["result"]["pkts"] = pkt_buffer->to_json(); + + /* delete the buffer */ + delete pkt_buffer; +} + +void +TrexRpcCmdCapture::parse_cmd_remove(const Json::Value ¶ms, Json::Value &result) { + + uint32_t capture_id = parse_uint32(params, "capture_id", result); + + /* generate a remove command */ + + static MsgReply reply; + reply.reset(); + + TrexStatelessRxCaptureRemove *remove_msg = new TrexStatelessRxCaptureRemove(capture_id, reply); + get_stateless_obj()->send_msg_to_rx(remove_msg); + + TrexCaptureRCRemove rc = reply.wait_for_reply(); + if (!rc) { + generate_execute_err(result, rc.get_err()); + } + + result["result"] = Json::objectValue; } diff --git a/src/rpc-server/commands/trex_rpc_cmds.h b/src/rpc-server/commands/trex_rpc_cmds.h index bf78ff80..54797bdf 100644 --- a/src/rpc-server/commands/trex_rpc_cmds.h +++ b/src/rpc-server/commands/trex_rpc_cmds.h @@ -165,6 +165,7 @@ TREX_RPC_CMD_DEFINE_EXTENDED(TrexRpcCmdCapture, "capture", 1, false, APIClass:: void parse_cmd_stop(const Json::Value &msg, Json::Value &result); void parse_cmd_status(const Json::Value &msg, Json::Value &result); void parse_cmd_fetch(const Json::Value &msg, Json::Value &result); + void parse_cmd_remove(const Json::Value ¶ms, Json::Value &result); ); diff --git a/src/stateless/messaging/trex_stateless_messaging.cpp b/src/stateless/messaging/trex_stateless_messaging.cpp index b9bb1d1c..2452487c 100644 --- a/src/stateless/messaging/trex_stateless_messaging.cpp +++ b/src/stateless/messaging/trex_stateless_messaging.cpp @@ -313,6 +313,19 @@ TrexStatelessRxCaptureStatus::handle(CRxCoreStateless *rx_core) { return true; } +bool +TrexStatelessRxCaptureRemove::handle(CRxCoreStateless *rx_core) { + + TrexCaptureRCRemove remove_rc; + + TrexStatelessCaptureMngr::getInstance().remove(m_capture_id, remove_rc); + + /* mark as done */ + m_reply.set_reply(remove_rc); + + return true; +} + bool TrexStatelessRxStartQueue::handle(CRxCoreStateless *rx_core) { diff --git a/src/stateless/messaging/trex_stateless_messaging.h b/src/stateless/messaging/trex_stateless_messaging.h index 4027d075..3535ad4f 100644 --- a/src/stateless/messaging/trex_stateless_messaging.h +++ b/src/stateless/messaging/trex_stateless_messaging.h @@ -552,6 +552,21 @@ private: }; + +class TrexStatelessRxCaptureRemove : public TrexStatelessRxCapture { +public: + TrexStatelessRxCaptureRemove(capture_id_t capture_id, MsgReply &reply) : m_reply(reply) { + m_capture_id = capture_id; + } + + virtual bool handle(CRxCoreStateless *rx_core); + +private: + capture_id_t m_capture_id; + MsgReply &m_reply; +}; + + class TrexStatelessRxStartQueue : public TrexStatelessCpToRxMsgBase { public: TrexStatelessRxStartQueue(uint8_t port_id, diff --git a/src/stateless/rx/trex_stateless_capture.cpp b/src/stateless/rx/trex_stateless_capture.cpp index 85be7aef..5d43cede 100644 --- a/src/stateless/rx/trex_stateless_capture.cpp +++ b/src/stateless/rx/trex_stateless_capture.cpp @@ -62,7 +62,7 @@ TrexStatelessCapture::handle_pkt_rx(const rte_mbuf_t *m, int port) { return; } - m_pkt_buffer->push(m); + m_pkt_buffer->push(m, port, TrexPkt::ORIGIN_RX); } @@ -87,7 +87,6 @@ TrexStatelessCapture::to_json() const { default: assert(0); - } return output; @@ -178,10 +177,6 @@ TrexStatelessCaptureMngr::fetch(capture_id_t capture_id, uint32_t pkt_limit, Tre rc.set_err(TrexCaptureRC::RC_CAPTURE_NOT_FOUND); return; } - if (capture->is_active()) { - rc.set_err(TrexCaptureRC::RC_CAPTURE_FETCH_UNDER_ACTIVE); - return; - } uint32_t pending = 0; TrexPktBuffer *pkt_buffer = capture->fetch(pkt_limit, pending); @@ -214,6 +209,8 @@ TrexStatelessCaptureMngr::remove(capture_id_t capture_id, TrexCaptureRCRemove &r /* update global filter */ update_global_filter(); + + rc.set_ok(); } void diff --git a/src/stateless/rx/trex_stateless_capture.h b/src/stateless/rx/trex_stateless_capture.h index 6cd25a94..4a9efea7 100644 --- a/src/stateless/rx/trex_stateless_capture.h +++ b/src/stateless/rx/trex_stateless_capture.h @@ -27,7 +27,7 @@ limitations under the License. #include "trex_stateless_pkt.h" #include "trex_stateless_capture_msg.h" -typedef int64_t capture_id_t; +typedef int32_t capture_id_t; class TrexCaptureRC { public: -- cgit 1.2.3-korg