summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gtest/rpc_test.cpp16
-rw-r--r--src/rpc-server/commands/trex_rpc_cmd_stream.cpp116
-rw-r--r--src/rpc-server/trex_rpc_cmd.cpp8
-rw-r--r--src/rpc-server/trex_rpc_cmd_api.h1
-rw-r--r--src/rpc-server/trex_rpc_cmds_table.cpp3
5 files changed, 143 insertions, 1 deletions
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
@@ -25,16 +25,130 @@ 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
*
*/
trex_rpc_cmd_rc_e
TrexRpcCmdAddStream::_run(const Json::Value &params, 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 &section = 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() {