draft
authorimarom <[email protected]>
Sun, 30 Aug 2015 08:32:10 +0000 (11:32 +0300)
committerimarom <[email protected]>
Sun, 30 Aug 2015 08:32:10 +0000 (11:32 +0300)
src/gtest/rpc_test.cpp
src/rpc-server/commands/trex_rpc_cmd_stream.cpp
src/rpc-server/trex_rpc_cmd.cpp
src/rpc-server/trex_rpc_cmd_api.h
src/rpc-server/trex_rpc_cmds_table.cpp

index 914cb27..a3df2a6 100644 (file)
@@ -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);
+}
index 88b5008..58226a6 100644 (file)
@@ -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 &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);
 }
index d1a9ebb..1ad94fb 100644 (file)
@@ -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;
index a2982f4..34e6ba0 100644 (file)
@@ -91,6 +91,7 @@ protected:
      */
     enum field_type_e {
         FIELD_TYPE_INT,
+        FIELD_TYPE_DOUBLE,
         FIELD_TYPE_BOOL,
         FIELD_TYPE_STR,
         FIELD_TYPE_OBJ,
index 04a5638..ac419bf 100644 (file)
@@ -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() {