From db6254e3c59ef887ff41ff2aff44349010bd6bad Mon Sep 17 00:00:00 2001 From: imarom Date: Tue, 26 Jan 2016 09:53:21 -0500 Subject: packet is now base64 encoded --- linux/ws_main.py | 3 +- linux_dpdk/ws_main.py | 1 + .../client/trex_stateless_client.py | 5 +- .../client/trex_stateless_sim.py | 2 +- .../client_utils/jsonrpc_client.py | 7 +- .../client_utils/packet_builder.py | 10 +- src/common/base64.cpp | 123 +++++++++++++++++++++ src/common/base64.h | 9 ++ src/rpc-server/commands/trex_rpc_cmd_stream.cpp | 10 +- 9 files changed, 155 insertions(+), 15 deletions(-) create mode 100644 src/common/base64.cpp create mode 100644 src/common/base64.h 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 + +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 + +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 #include #include - +#include #include using namespace std; @@ -63,7 +63,7 @@ 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)); /* fetch the packet from the message */ @@ -73,9 +73,11 @@ TrexRpcCmdAddStream::_run(const Json::Value ¶ms, 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 */ -- cgit 1.2.3-korg