summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/base64.cpp123
-rw-r--r--src/common/base64.h9
-rw-r--r--src/rpc-server/commands/trex_rpc_cmd_stream.cpp32
-rw-r--r--src/stateless/cp/trex_stream.h2
-rw-r--r--src/stub/trex_stateless_stub.cpp23
-rw-r--r--src/stub/zmq_stub.c81
6 files changed, 232 insertions, 38 deletions
diff --git a/src/common/base64.cpp b/src/common/base64.cpp
new file mode 100644
index 00000000..50006d4f
--- /dev/null
+++ b/src/common/base64.cpp
@@ -0,0 +1,123 @@
+/*
+ base64.cpp and base64.h
+
+ Copyright (C) 2004-2008 René Nyffenegger
+
+ This source code is provided 'as-is', without any express or implied
+ warranty. In no event will the author be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this source code must not be misrepresented; you must not
+ claim that you wrote the original source code. If you use this source code
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original source code.
+
+ 3. This notice may not be removed or altered from any source distribution.
+
+ René Nyffenegger rene.nyffenegger@adp-gmbh.ch
+
+*/
+
+#include "base64.h"
+#include <iostream>
+
+static const std::string base64_chars =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789+/";
+
+
+static inline bool is_base64(unsigned char c) {
+ return (isalnum(c) || (c == '+') || (c == '/'));
+}
+
+std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
+ std::string ret;
+ int i = 0;
+ int j = 0;
+ unsigned char char_array_3[3];
+ unsigned char char_array_4[4];
+
+ while (in_len--) {
+ char_array_3[i++] = *(bytes_to_encode++);
+ if (i == 3) {
+ char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
+ char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
+ char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
+ char_array_4[3] = char_array_3[2] & 0x3f;
+
+ for(i = 0; (i <4) ; i++)
+ ret += base64_chars[char_array_4[i]];
+ i = 0;
+ }
+ }
+
+ if (i)
+ {
+ for(j = i; j < 3; j++)
+ char_array_3[j] = '\0';
+
+ char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
+ char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
+ char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
+ char_array_4[3] = char_array_3[2] & 0x3f;
+
+ for (j = 0; (j < i + 1); j++)
+ ret += base64_chars[char_array_4[j]];
+
+ while((i++ < 3))
+ ret += '=';
+
+ }
+
+ return ret;
+
+}
+
+std::string base64_decode(std::string const& encoded_string) {
+ int in_len = encoded_string.size();
+ int i = 0;
+ int j = 0;
+ int in_ = 0;
+ unsigned char char_array_4[4], char_array_3[3];
+ std::string ret;
+
+ while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
+ char_array_4[i++] = encoded_string[in_]; in_++;
+ if (i ==4) {
+ for (i = 0; i <4; i++)
+ char_array_4[i] = base64_chars.find(char_array_4[i]);
+
+ char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
+ char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
+ char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
+
+ for (i = 0; (i < 3); i++)
+ ret += char_array_3[i];
+ i = 0;
+ }
+ }
+
+ if (i) {
+ for (j = i; j <4; j++)
+ char_array_4[j] = 0;
+
+ for (j = 0; j <4; j++)
+ char_array_4[j] = base64_chars.find(char_array_4[j]);
+
+ char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
+ char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
+ char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
+
+ for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
+ }
+
+ return ret;
+} \ No newline at end of file
diff --git a/src/common/base64.h b/src/common/base64.h
new file mode 100644
index 00000000..48a13fe5
--- /dev/null
+++ b/src/common/base64.h
@@ -0,0 +1,9 @@
+#ifndef __BASE64_H__
+#define __BASE64_H__
+
+#include <string>
+
+std::string base64_encode(unsigned char const* , unsigned int len);
+std::string base64_decode(std::string const& s);
+
+#endif /* __BASE64_H__ */
diff --git a/src/rpc-server/commands/trex_rpc_cmd_stream.cpp b/src/rpc-server/commands/trex_rpc_cmd_stream.cpp
index 821479f5..69e5dd18 100644
--- a/src/rpc-server/commands/trex_rpc_cmd_stream.cpp
+++ b/src/rpc-server/commands/trex_rpc_cmd_stream.cpp
@@ -24,7 +24,7 @@ limitations under the License.
#include <trex_stateless.h>
#include <trex_stateless_port.h>
#include <trex_streams_compiler.h>
-
+#include <common/base64.h>
#include <iostream>
using namespace std;
@@ -63,19 +63,31 @@ TrexRpcCmdAddStream::_run(const Json::Value &params, Json::Value &result) {
stream->m_next_stream_id = parse_int(section, "next_stream_id", result);
const Json::Value &pkt = parse_object(section, "packet", result);
- const Json::Value &pkt_binary = parse_array(pkt, "binary", result);
+ std::string pkt_binary = base64_decode(parse_string(pkt, "binary", result));
+
+ /* check packet size */
+ if ( (pkt_binary.size() < TrexStream::MIN_PKT_SIZE_BYTES) || (pkt_binary.size() > TrexStream::MAX_PKT_SIZE_BYTES) ) {
+ std::stringstream ss;
+ ss << "bad packet size provided: should be between " << TrexStream::MIN_PKT_SIZE_BYTES << " and " << TrexStream::MAX_PKT_SIZE_BYTES;
+ delete stream;
+ generate_execute_err(result, ss.str());
+ }
/* fetch the packet from the message */
- stream->m_pkt.len = pkt_binary.size();
- stream->m_pkt.binary = new uint8_t[pkt_binary.size()];
+ stream->m_pkt.len = std::max(pkt_binary.size(), 60UL);
+
+ /* allocate and init to zero ( with () ) */
+ stream->m_pkt.binary = new uint8_t[pkt_binary.size()]();
if (!stream->m_pkt.binary) {
generate_internal_err(result, "unable to allocate memory");
}
- /* parse the packet */
+ const char *pkt_buffer = pkt_binary.c_str();
+
+ /* copy the packet - if less than 60 it will remain zeroes */
for (int i = 0; i < pkt_binary.size(); i++) {
- stream->m_pkt.binary[i] = parse_byte(pkt_binary, i, result);
+ stream->m_pkt.binary[i] = pkt_buffer[i];
}
/* meta data */
@@ -304,14 +316,6 @@ TrexRpcCmdAddStream::parse_vm(const Json::Value &vm, TrexStream *stream, Json::V
void
TrexRpcCmdAddStream::validate_stream(const TrexStream *stream, Json::Value &result) {
- /* check packet size */
- if ( (stream->m_pkt.len < TrexStream::MIN_PKT_SIZE_BYTES) || (stream->m_pkt.len > TrexStream::MAX_PKT_SIZE_BYTES) ) {
- std::stringstream ss;
- ss << "bad packet size provided: should be between " << TrexStream::MIN_PKT_SIZE_BYTES << " and " << TrexStream::MAX_PKT_SIZE_BYTES;
- delete stream;
- generate_execute_err(result, ss.str());
- }
-
/* add the stream to the port's stream table */
TrexStatelessPort * port = get_stateless_obj()->get_port_by_id(stream->m_port_id);
diff --git a/src/stateless/cp/trex_stream.h b/src/stateless/cp/trex_stream.h
index 6bb30cf9..80d64ec5 100644
--- a/src/stateless/cp/trex_stream.h
+++ b/src/stateless/cp/trex_stream.h
@@ -125,7 +125,7 @@ public:
virtual ~TrexStream();
/* defines the min max per packet supported */
- static const uint32_t MIN_PKT_SIZE_BYTES = 60;
+ static const uint32_t MIN_PKT_SIZE_BYTES = 14;
static const uint32_t MAX_PKT_SIZE_BYTES = MAX_PKT_SIZE;
/* provides storage for the stream json*/
diff --git a/src/stub/trex_stateless_stub.cpp b/src/stub/trex_stateless_stub.cpp
deleted file mode 100644
index 199356d8..00000000
--- a/src/stub/trex_stateless_stub.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-
-#include <trex_stateless_dp_core.h>
-
-class CFlowGenListPerThread;
-class TrexStatelessCpToDpMsgBase;
-
-void
-TrexStatelessDpCore::create(unsigned char, CFlowGenListPerThread*) {
- m_thread_id = 0;
- m_core = NULL;
-
- m_state = STATE_IDLE;
-
- CMessagingManager * cp_dp = CMsgIns::Ins()->getCpDp();
-
- m_ring_from_cp = cp_dp->getRingCpToDp(0);
- m_ring_to_cp = cp_dp->getRingDpToCp(0);
-}
-
-void TrexStatelessDpCore::start(){}
-
-void TrexStatelessDpCore::handle_cp_msg(TrexStatelessCpToDpMsgBase*) {}
-
diff --git a/src/stub/zmq_stub.c b/src/stub/zmq_stub.c
new file mode 100644
index 00000000..b94f93e4
--- /dev/null
+++ b/src/stub/zmq_stub.c
@@ -0,0 +1,81 @@
+#include <zmq.h>
+#include <assert.h>
+
+void *zmq_ctx_new (void) {
+ return NULL;
+}
+
+void *zmq_socket (void *, int type) {
+ return NULL;
+}
+
+int zmq_close (void *s) {
+ return (-1);
+}
+
+int zmq_setsockopt (void *s, int option, const void *optval,size_t optvallen) {
+ return (-1);
+}
+
+int zmq_getsockopt (void *s, int option, void *optval,
+ size_t *optvallen) {
+ return (-1);
+}
+
+int zmq_bind (void *s, const char *addr) {
+ return (-1);
+}
+
+void *zmq_init (int io_threads) {
+ return NULL;
+}
+
+int zmq_term (void *context) {
+ return (-1);
+}
+
+int zmq_ctx_destroy (void *context) {
+ return (-1);
+}
+
+
+int zmq_connect (void *s, const char *addr) {
+ return (-1);
+}
+
+int zmq_send (void *s, const void *buf, size_t len, int flags) {
+ return (-1);
+}
+
+int zmq_recv (void *s, void *buf, size_t len, int flags) {
+ return (-1);
+}
+
+int zmq_errno (void) {
+ return (-1);
+}
+
+const char *zmq_strerror (int errnum) {
+ return "";
+}
+
+int zmq_msg_init (zmq_msg_t *msg) {
+ return (-1);
+}
+
+int zmq_msg_recv (zmq_msg_t *msg, void *s, int flags) {
+ return (-1);
+}
+
+int zmq_msg_close (zmq_msg_t *msg) {
+ return (-1);
+}
+
+void *zmq_msg_data (zmq_msg_t *msg) {
+ return NULL;
+}
+
+size_t zmq_msg_size (zmq_msg_t *msg) {
+ return (0);
+}
+