summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorimarom <imarom@cisco.com>2015-08-17 10:45:37 +0300
committerimarom <imarom@cisco.com>2015-08-17 10:45:37 +0300
commitb9c9cb1ca1257d799d82837b3d69b60028291379 (patch)
treecbb3ad7b51d26a5926b3f91f9e6802d58bb9c494
parent509b68a5cff9503ffffe2e72a2812bb10ca0380f (diff)
draft
-rw-r--r--src/gtest/rpc_test.cpp6
-rw-r--r--src/rpc-server/include/trex_rpc_req_resp.h10
-rw-r--r--src/rpc-server/include/trex_rpc_server_api.h60
-rw-r--r--src/rpc-server/src/trex_rpc_req_resp.cpp8
-rw-r--r--src/rpc-server/src/trex_rpc_server.cpp86
5 files changed, 98 insertions, 72 deletions
diff --git a/src/gtest/rpc_test.cpp b/src/gtest/rpc_test.cpp
index 0141dec4..8cee0859 100644
--- a/src/gtest/rpc_test.cpp
+++ b/src/gtest/rpc_test.cpp
@@ -31,7 +31,9 @@ using namespace std;
class RpcTest : public testing::Test {
virtual void SetUp() {
- m_rpc = new TrexRpcServerArray(TrexRpcServerArray::RPC_PROT_TCP, 5050);
+ TrexRpcServerConfig cfg = TrexRpcServerConfig(TrexRpcServerConfig::RPC_PROT_TCP, 5050);
+
+ m_rpc = new TrexRpcServer(cfg);
m_rpc->start();
m_context = zmq_ctx_new ();
@@ -57,7 +59,7 @@ public:
return string(buffer, len);
}
- TrexRpcServerArray *m_rpc;
+ TrexRpcServer *m_rpc;
void *m_context;
void *m_socket;
};
diff --git a/src/rpc-server/include/trex_rpc_req_resp.h b/src/rpc-server/include/trex_rpc_req_resp.h
index 511afc02..f12d0540 100644
--- a/src/rpc-server/include/trex_rpc_req_resp.h
+++ b/src/rpc-server/include/trex_rpc_req_resp.h
@@ -32,7 +32,7 @@ limitations under the License.
class TrexRpcServerReqRes : public TrexRpcServerInterface {
public:
- TrexRpcServerReqRes(TrexRpcServerArray::protocol_type_e protocol, uint16_t port);
+ TrexRpcServerReqRes(const TrexRpcServerConfig &cfg);
protected:
void _rpc_thread_cb();
@@ -41,10 +41,10 @@ protected:
private:
void handle_request(const std::string &request);
- static const int RPC_MAX_MSG_SIZE = 2048;
- void *m_context;
- void *m_socket;
- uint8_t m_msg_buffer[RPC_MAX_MSG_SIZE];
+ static const int RPC_MAX_MSG_SIZE = 2048;
+ void *m_context;
+ void *m_socket;
+ uint8_t m_msg_buffer[RPC_MAX_MSG_SIZE];
};
diff --git a/src/rpc-server/include/trex_rpc_server_api.h b/src/rpc-server/include/trex_rpc_server_api.h
index f9860e14..8009137f 100644
--- a/src/rpc-server/include/trex_rpc_server_api.h
+++ b/src/rpc-server/include/trex_rpc_server_api.h
@@ -27,36 +27,37 @@ limitations under the License.
#include <thread>
#include <string>
#include <stdexcept>
-
#include <trex_rpc_exception_api.h>
-/* forward decl. of class */
class TrexRpcServerInterface;
/**
- * servers array
+ * defines a configuration of generic RPC server
*
- * @author imarom (12-Aug-15)
+ * @author imarom (17-Aug-15)
*/
-class TrexRpcServerArray {
+class TrexRpcServerConfig {
public:
- /**
- * different types the RPC server supports
- */
- enum protocol_type_e {
+
+ enum rpc_prot_e {
RPC_PROT_TCP
};
- TrexRpcServerArray(protocol_type_e protocol, uint16_t port);
- ~TrexRpcServerArray();
+ TrexRpcServerConfig(rpc_prot_e protocol, uint16_t port) : m_protocol(protocol), m_port(port) {
- void start();
- void stop();
+ }
+
+ uint16_t get_port() {
+ return m_port;
+ }
+
+ rpc_prot_e get_protocol() {
+ return m_protocol;
+ }
private:
- std::vector<TrexRpcServerInterface *> m_servers;
- protocol_type_e m_protocol;
- uint16_t m_port;
+ rpc_prot_e m_protocol;
+ uint16_t m_port;
};
/**
@@ -67,7 +68,7 @@ private:
class TrexRpcServerInterface {
public:
- TrexRpcServerInterface(TrexRpcServerArray::protocol_type_e protocol, uint16_t port);
+ TrexRpcServerInterface(const TrexRpcServerConfig &cfg);
virtual ~TrexRpcServerInterface();
/**
@@ -93,13 +94,32 @@ protected:
* instances implement this
*
*/
- virtual void _rpc_thread_cb() = 0;
+ virtual void _rpc_thread_cb() = 0;
virtual void _stop_rpc_thread() = 0;
- TrexRpcServerArray::protocol_type_e m_protocol;
- uint16_t m_port;
+ TrexRpcServerConfig m_cfg;
bool m_is_running;
std::thread *m_thread;
};
+/**
+ * TREX RPC server
+ * may contain serveral types of RPC servers
+ *
+ * @author imarom (12-Aug-15)
+ */
+class TrexRpcServer {
+public:
+
+ /* currently only request response server config is required */
+ TrexRpcServer(const TrexRpcServerConfig &req_resp_cfg);
+ ~TrexRpcServer();
+
+ void start();
+ void stop();
+
+private:
+ std::vector<TrexRpcServerInterface *> m_servers;
+};
+
#endif /* __TREX_RPC_SERVER_API_H__ */
diff --git a/src/rpc-server/src/trex_rpc_req_resp.cpp b/src/rpc-server/src/trex_rpc_req_resp.cpp
index e533c4f2..2d8f12fa 100644
--- a/src/rpc-server/src/trex_rpc_req_resp.cpp
+++ b/src/rpc-server/src/trex_rpc_req_resp.cpp
@@ -31,7 +31,7 @@ limitations under the License.
#include <json/json.h>
-TrexRpcServerReqRes::TrexRpcServerReqRes(TrexRpcServerArray::protocol_type_e protocol, uint16_t port) : TrexRpcServerInterface(protocol, port) {
+TrexRpcServerReqRes::TrexRpcServerReqRes(const TrexRpcServerConfig &cfg) : TrexRpcServerInterface(cfg) {
/* ZMQ is not thread safe - this should be outside */
m_context = zmq_ctx_new();
}
@@ -42,15 +42,15 @@ void TrexRpcServerReqRes::_rpc_thread_cb() {
// Socket to talk to clients
m_socket = zmq_socket (m_context, ZMQ_REP);
- switch (m_protocol) {
- case TrexRpcServerArray::RPC_PROT_TCP:
+ switch (m_cfg.get_protocol()) {
+ case TrexRpcServerConfig::RPC_PROT_TCP:
ss << "tcp://*:";
break;
default:
throw TrexRpcException("unknown protocol for RPC");
}
- ss << m_port;
+ ss << m_cfg.get_port();
int rc = zmq_bind (m_socket, ss.str().c_str());
if (rc != 0) {
diff --git a/src/rpc-server/src/trex_rpc_server.cpp b/src/rpc-server/src/trex_rpc_server.cpp
index 5c29b6d7..2e3f97f9 100644
--- a/src/rpc-server/src/trex_rpc_server.cpp
+++ b/src/rpc-server/src/trex_rpc_server.cpp
@@ -25,54 +25,17 @@ limitations under the License.
#include <zmq.h>
#include <sstream>
-/************** RPC server array *************/
-
-TrexRpcServerArray::TrexRpcServerArray(protocol_type_e protocol, uint16_t prot) {
-
- /* add the request response server */
- m_servers.push_back(new TrexRpcServerReqRes(protocol, prot));
-}
-
-TrexRpcServerArray::~TrexRpcServerArray() {
-
- /* make sure they are all stopped */
- TrexRpcServerArray::stop();
-
- for (auto server : m_servers) {
- delete server;
- }
-}
-
-/**
- * start the server array
- *
- */
-void TrexRpcServerArray::start() {
- for (auto server : m_servers) {
- server->start();
- }
-}
-
-/**
- * stop the server array
- *
- */
-void TrexRpcServerArray::stop() {
- for (auto server : m_servers) {
- if (server->is_running()) {
- server->stop();
- }
- }
-}
/************** RPC server interface ***************/
-TrexRpcServerInterface::TrexRpcServerInterface(TrexRpcServerArray::protocol_type_e protocol, uint16_t port) : m_protocol(protocol), m_port(port) {
+TrexRpcServerInterface::TrexRpcServerInterface(const TrexRpcServerConfig &cfg) : m_cfg(cfg) {
m_is_running = false;
}
TrexRpcServerInterface::~TrexRpcServerInterface() {
-
+ if (m_is_running) {
+ stop();
+ }
}
void TrexRpcServerInterface::start() {
@@ -99,3 +62,44 @@ bool TrexRpcServerInterface::is_running() {
return m_is_running;
}
+
+/************** RPC server *************/
+
+TrexRpcServer::TrexRpcServer(const TrexRpcServerConfig &req_resp_cfg) {
+
+ /* add the request response server */
+ m_servers.push_back(new TrexRpcServerReqRes(req_resp_cfg));
+}
+
+TrexRpcServer::~TrexRpcServer() {
+
+ /* make sure they are all stopped */
+ stop();
+
+ for (auto server : m_servers) {
+ delete server;
+ }
+}
+
+/**
+ * start the server array
+ *
+ */
+void TrexRpcServer::start() {
+ for (auto server : m_servers) {
+ server->start();
+ }
+}
+
+/**
+ * stop the server array
+ *
+ */
+void TrexRpcServer::stop() {
+ for (auto server : m_servers) {
+ if (server->is_running()) {
+ server->stop();
+ }
+ }
+}
+