From 05a529031e962d61ab977393fb3d153931feff34 Mon Sep 17 00:00:00 2001 From: imarom Date: Sun, 30 Aug 2015 11:32:10 +0300 Subject: draft --- src/gtest/rpc_test.cpp | 16 ++++ src/rpc-server/commands/trex_rpc_cmd_stream.cpp | 116 +++++++++++++++++++++++- src/rpc-server/trex_rpc_cmd.cpp | 8 ++ src/rpc-server/trex_rpc_cmd_api.h | 1 + src/rpc-server/trex_rpc_cmds_table.cpp | 3 + 5 files changed, 143 insertions(+), 1 deletion(-) diff --git a/src/gtest/rpc_test.cpp b/src/gtest/rpc_test.cpp index 914cb272..a3df2a67 100644 --- a/src/gtest/rpc_test.cpp +++ b/src/gtest/rpc_test.cpp @@ -224,3 +224,19 @@ TEST_F(RpcTest, batch_rpc_test) { return; } + +TEST_F(RpcTest, add_stream) { + Json::Value request; + Json::Value response; + Json::Reader reader; + + string req_str; + string resp_str; + + req_str = "{'stream':{'port_id':7,'stream_id':12,'enable':True,'start':True,'Is':10.0,'packet':[0,1,2,3,4]," + "'vm_data':[{'Name':'ip_cnt','Size':4,'big_edian':True,'type':'inc','core_mask':'split','init_val':'10.0.0.7','min':'10.0.0.1','max':'10.0.0.10',}]," + "'vm_program':[{'op_core':['read_to_reg_mem','write_reg_offet','write_rand_offset'],'read_name':'nameofopecodetoread','pkt_offset':20}]," + "'mode':{'type':'continues','pps':1000},'next_stream':17,'next_stream_loop':100,'rx_stats':{'enable':True,'rx_stream_id':71,'seq_enable':True,'latency':True}}}"; + + resp_str = send_msg(req_str); +} diff --git a/src/rpc-server/commands/trex_rpc_cmd_stream.cpp b/src/rpc-server/commands/trex_rpc_cmd_stream.cpp index 88b50089..58226a6b 100644 --- a/src/rpc-server/commands/trex_rpc_cmd_stream.cpp +++ b/src/rpc-server/commands/trex_rpc_cmd_stream.cpp @@ -24,6 +24,107 @@ limitations under the License. using namespace std; +/** + * Stateless stream mode + * abstract class + */ +class TrexStreamMode { +public: + enum mode_e { + CONTINUOUS, + SINGLE_BURST, + MULTI_BURST + }; + + virtual mode_e get_runtime_type() = 0; + virtual ~TrexStreamMode() {} +}; + +/** + * stream mode continuous + * + * @author imarom (30-Aug-15) + */ +class TrexStreamModeContinuous : public TrexStreamMode { +public: + mode_e get_runtime_type() { + return (CONTINUOUS); + } +private: + uint32_t pps; +}; + +/** + * single burst mode + * + */ +class TrexStreamModeSingleBurst : public TrexStreamMode { +public: + mode_e get_runtime_type() { + return (SINGLE_BURST); + } +private: + + uint32_t packets; + uint32_t pps; +}; + +class TrexStreamModeMultiBurst : public TrexStreamMode { +public: + + mode_e get_runtime_type() { + return (MULTI_BURST); + } + +private: + + uint32_t pps; + double ibg_usec; + uint32_t number_of_bursts; + uint32_t pkts_per_burst; +}; + + +/** + * Stateless Stream + * + */ +class TrexStatelessStream { + friend class TrexRpcCmdAddStream; + +public: + +private: + /* config */ + uint32_t stream_id; + uint8_t port_id; + double isg_usec; + uint32_t next_stream_id; + uint32_t loop_count; + + /* indicators */ + bool enable; + bool start; + + /* pkt */ + uint8_t *pkt; + uint16_t pkt_len; + + /* stream mode */ + TrexStreamMode *mode; + + /* VM */ + + /* RX check */ + struct { + bool enable; + bool seq_enable; + bool latency; + uint32_t stream_id; + + } rx_check; + +}; /** * add new stream * @@ -31,10 +132,23 @@ using namespace std; trex_rpc_cmd_rc_e TrexRpcCmdAddStream::_run(const Json::Value ¶ms, Json::Value &result) { + TrexStatelessStream stream; + check_param_count(params, 1, result); check_field_type(params, "stream", FIELD_TYPE_OBJ, result); - Json::Value &stream = result["stream"]; + Json::Value §ion = result["stream"]; + + /* create a new steram and populate it */ + + check_field_type(section, "stream_id", FIELD_TYPE_INT, result); + stream.stream_id = section["stream_id"].asInt(); + + check_field_type(section, "port_id", FIELD_TYPE_INT, result); + stream.port_id = section["port_id"].asInt(); + + check_field_type(section, "Is", FIELD_TYPE_DOUBLE, result); + stream.isg_usec = section["Is"].asDouble(); return (TREX_RPC_CMD_OK); } diff --git a/src/rpc-server/trex_rpc_cmd.cpp b/src/rpc-server/trex_rpc_cmd.cpp index d1a9ebb0..1ad94fb5 100644 --- a/src/rpc-server/trex_rpc_cmd.cpp +++ b/src/rpc-server/trex_rpc_cmd.cpp @@ -52,6 +52,8 @@ TrexRpcCommand::type_to_str(field_type_e type) { return "bool"; case FIELD_TYPE_INT: return "int"; + case FIELD_TYPE_DOUBLE: + return "double"; case FIELD_TYPE_OBJ: return "object"; case FIELD_TYPE_STR: @@ -117,6 +119,12 @@ TrexRpcCommand::check_field_type(const Json::Value &parent, const std::string &n } break; + case FIELD_TYPE_DOUBLE: + if (!field.isDouble()) { + rc = false; + } + break; + case FIELD_TYPE_OBJ: if (!field.isObject()) { rc = false; diff --git a/src/rpc-server/trex_rpc_cmd_api.h b/src/rpc-server/trex_rpc_cmd_api.h index a2982f4a..34e6ba0a 100644 --- a/src/rpc-server/trex_rpc_cmd_api.h +++ b/src/rpc-server/trex_rpc_cmd_api.h @@ -91,6 +91,7 @@ protected: */ enum field_type_e { FIELD_TYPE_INT, + FIELD_TYPE_DOUBLE, FIELD_TYPE_BOOL, FIELD_TYPE_STR, FIELD_TYPE_OBJ, diff --git a/src/rpc-server/trex_rpc_cmds_table.cpp b/src/rpc-server/trex_rpc_cmds_table.cpp index 04a56389..ac419bfd 100644 --- a/src/rpc-server/trex_rpc_cmds_table.cpp +++ b/src/rpc-server/trex_rpc_cmds_table.cpp @@ -33,6 +33,9 @@ TrexRpcCommandsTable::TrexRpcCommandsTable() { register_command(new TrexRpcCmdPing()); register_command(new TrexRpcCmdGetReg()); register_command(new TrexRpcCmdGetStatus()); + + /* stream commands */ + register_command(new TrexRpcCmdAddStream()); } TrexRpcCommandsTable::~TrexRpcCommandsTable() { -- cgit 1.2.3-korg