diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/common/base64.cpp | 123 | ||||
-rw-r--r-- | src/common/base64.h | 9 | ||||
-rw-r--r-- | src/rpc-server/commands/trex_rpc_cmd_stream.cpp | 32 | ||||
-rw-r--r-- | src/stateless/cp/trex_stream.h | 2 | ||||
-rw-r--r-- | src/stub/trex_stateless_stub.cpp | 23 | ||||
-rw-r--r-- | src/stub/zmq_stub.c | 81 |
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 ¶ms, 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); +} + |