summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xlinux/ws_main.py3
-rwxr-xr-xlinux_dpdk/ws_main.py1
-rwxr-xr-xscripts/automation/trex_control_plane/client/trex_stateless_client.py5
-rw-r--r--scripts/automation/trex_control_plane/client/trex_stateless_sim.py2
-rwxr-xr-xscripts/automation/trex_control_plane/client_utils/jsonrpc_client.py7
-rwxr-xr-xscripts/automation/trex_control_plane/client_utils/packet_builder.py10
-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.cpp10
9 files changed, 155 insertions, 15 deletions
diff --git a/linux/ws_main.py b/linux/ws_main.py
index a41fab1e..ec3ef6d7 100755
--- a/linux/ws_main.py
+++ b/linux/ws_main.py
@@ -133,7 +133,8 @@ cmn_src = SrcGroup(dir='src/common',
'basic_utils.cpp',
'captureFile.cpp',
'erf.cpp',
- 'pcap.cpp'
+ 'pcap.cpp',
+ 'base64.cpp'
]);
diff --git a/linux_dpdk/ws_main.py b/linux_dpdk/ws_main.py
index f098e193..9dcb3bae 100755
--- a/linux_dpdk/ws_main.py
+++ b/linux_dpdk/ws_main.py
@@ -124,6 +124,7 @@ cmn_src = SrcGroup(dir='src/common',
'captureFile.cpp',
'erf.cpp',
'pcap.cpp',
+ 'base64.cpp'
]);
net_src = SrcGroup(dir='src/common/Network/Packet',
diff --git a/scripts/automation/trex_control_plane/client/trex_stateless_client.py b/scripts/automation/trex_control_plane/client/trex_stateless_client.py
index 886edb61..65e69938 100755
--- a/scripts/automation/trex_control_plane/client/trex_stateless_client.py
+++ b/scripts/automation/trex_control_plane/client/trex_stateless_client.py
@@ -636,20 +636,19 @@ class STLClient(object):
self.connected = False
# connect sync channel
- self.logger.pre_cmd("connecting to RPC server on {0}:{1}".format(self.connection_info['server'], self.connection_info['sync_port']))
+ self.logger.pre_cmd("Connecting to RPC server on {0}:{1}".format(self.connection_info['server'], self.connection_info['sync_port']))
rc = self.comm_link.connect()
self.logger.post_cmd(rc)
if not rc:
return rc
-
-
# version
rc = self._transmit("get_version")
if not rc:
return rc
+
self.server_version = rc.data()
self.global_stats.server_version = rc.data()
diff --git a/scripts/automation/trex_control_plane/client/trex_stateless_sim.py b/scripts/automation/trex_control_plane/client/trex_stateless_sim.py
index 3196c666..a8f24d65 100644
--- a/scripts/automation/trex_control_plane/client/trex_stateless_sim.py
+++ b/scripts/automation/trex_control_plane/client/trex_stateless_sim.py
@@ -247,7 +247,7 @@ def setParserOptions():
parser.add_argument('-m', '--multiplier',
help = parsing_opts.match_multiplier_help,
dest = 'mult',
- default = {'type':'raw', 'value':1, 'op': 'abs'},
+ default = "1",
type = parsing_opts.match_multiplier_strict)
group = parser.add_mutually_exclusive_group()
diff --git a/scripts/automation/trex_control_plane/client_utils/jsonrpc_client.py b/scripts/automation/trex_control_plane/client_utils/jsonrpc_client.py
index 05a32bc4..9c351175 100755
--- a/scripts/automation/trex_control_plane/client_utils/jsonrpc_client.py
+++ b/scripts/automation/trex_control_plane/client_utils/jsonrpc_client.py
@@ -81,7 +81,7 @@ class JsonRpcClient(object):
return pretty_str
def verbose_msg (self, msg):
- self.logger.log("[verbose] " + msg, level = self.logger.VERBOSE_HIGH)
+ self.logger.log("\n\n[verbose] " + msg, level = self.logger.VERBOSE_HIGH)
# batch messages
@@ -215,6 +215,11 @@ class JsonRpcClient(object):
self.connected = True
+ rc = self.invoke_rpc_method('ping')
+ if not rc:
+ self.connected = False
+ return rc
+
return RC_OK()
diff --git a/scripts/automation/trex_control_plane/client_utils/packet_builder.py b/scripts/automation/trex_control_plane/client_utils/packet_builder.py
index fe96789e..c7d3308e 100755
--- a/scripts/automation/trex_control_plane/client_utils/packet_builder.py
+++ b/scripts/automation/trex_control_plane/client_utils/packet_builder.py
@@ -12,7 +12,7 @@ import re
import itertools
from abc import ABCMeta, abstractmethod
from collections import namedtuple
-
+import base64
class CTRexPktBuilder(object):
"""
@@ -332,6 +332,7 @@ class CTRexPktBuilder(object):
def load_packet_from_byte_list(self, byte_list):
# convert byte array into buffer
+ byte_list = [ord(c) for c in base64.b64decode(byte_list)]
buf = struct.pack('B'*len(byte_list), *byte_list)
# thn, load it based on dpkt parsing
@@ -480,11 +481,10 @@ class CTRexPktBuilder(object):
"""
if self._packet is None:
raise CTRexPktBuilder.EmptyPacketError()
- pkt_in_hex = binascii.hexlify(str(self._packet))
- return {"binary": [int(pkt_in_hex[i:i+2], 16)
- for i in range(0, len(pkt_in_hex), 2)],
+
+ return {"binary": base64.b64encode(str(self._packet)),
"meta": self.metadata}
- # return [pkt_in_hex[i:i+2] for i in range(0, len(pkt_in_hex), 2)]
+
def dump_pkt_to_pcap(self, file_path, ts=None):
"""
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..dc8a9ccd 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,7 +63,7 @@ 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));
/* fetch the packet from the message */
@@ -73,9 +73,11 @@ TrexRpcCmdAddStream::_run(const Json::Value &params, Json::Value &result) {
generate_internal_err(result, "unable to allocate memory");
}
- /* parse the packet */
+ /* copy the packet */
+ const char *pkt_buffer = pkt_binary.c_str();
+
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 */