summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/rpc-server/include/trex_rpc_server_api.h1
-rw-r--r--src/rpc-server/src/trex_rpc_req_resp.cpp28
-rw-r--r--src/rpc-server/src/trex_rpc_server.cpp5
3 files changed, 31 insertions, 3 deletions
diff --git a/src/rpc-server/include/trex_rpc_server_api.h b/src/rpc-server/include/trex_rpc_server_api.h
index 8009137f..5f567a5c 100644
--- a/src/rpc-server/include/trex_rpc_server_api.h
+++ b/src/rpc-server/include/trex_rpc_server_api.h
@@ -105,6 +105,7 @@ protected:
/**
* TREX RPC server
* may contain serveral types of RPC servers
+ * (request response, async and etc.)
*
* @author imarom (12-Aug-15)
*/
diff --git a/src/rpc-server/src/trex_rpc_req_resp.cpp b/src/rpc-server/src/trex_rpc_req_resp.cpp
index 2d8f12fa..f5fad461 100644
--- a/src/rpc-server/src/trex_rpc_req_resp.cpp
+++ b/src/rpc-server/src/trex_rpc_req_resp.cpp
@@ -30,16 +30,26 @@ limitations under the License.
#include <zmq.h>
#include <json/json.h>
-
+/**
+ * ZMQ based request-response server
+ *
+ */
TrexRpcServerReqRes::TrexRpcServerReqRes(const TrexRpcServerConfig &cfg) : TrexRpcServerInterface(cfg) {
/* ZMQ is not thread safe - this should be outside */
m_context = zmq_ctx_new();
}
+/**
+ * main entry point for the server
+ * this function will be created on a different thread
+ *
+ * @author imarom (17-Aug-15)
+ */
void TrexRpcServerReqRes::_rpc_thread_cb() {
std::stringstream ss;
- // Socket to talk to clients
+ /* create a socket based on the configuration */
+
m_socket = zmq_socket (m_context, ZMQ_REP);
switch (m_cfg.get_protocol()) {
@@ -52,6 +62,7 @@ void TrexRpcServerReqRes::_rpc_thread_cb() {
ss << m_cfg.get_port();
+ /* bind the scoket */
int rc = zmq_bind (m_socket, ss.str().c_str());
if (rc != 0) {
throw TrexRpcException("Unable to start ZMQ server at: " + ss.str());
@@ -61,6 +72,7 @@ void TrexRpcServerReqRes::_rpc_thread_cb() {
while (m_is_running) {
int msg_size = zmq_recv (m_socket, m_msg_buffer, sizeof(m_msg_buffer), 0);
+ /* msg_size of -1 is an error - decode it */
if (msg_size == -1) {
/* normal shutdown and zmq_term was called */
if (errno == ETERM) {
@@ -70,6 +82,7 @@ void TrexRpcServerReqRes::_rpc_thread_cb() {
}
}
+ /* transform it to a string */
std::string request((const char *)m_msg_buffer, msg_size);
handle_request(request);
}
@@ -78,23 +91,32 @@ void TrexRpcServerReqRes::_rpc_thread_cb() {
zmq_close(m_socket);
}
+/**
+ * stops the ZMQ based RPC server
+ *
+ */
void TrexRpcServerReqRes::_stop_rpc_thread() {
/* by calling zmq_term we signal the blocked thread to exit */
zmq_term(m_context);
}
+/**
+ * handles a request given to the server
+ * respondes to the request
+ */
void TrexRpcServerReqRes::handle_request(const std::string &request) {
std::vector<TrexJsonRpcV2ParsedObject *> commands;
Json::FastWriter writer;
Json::Value response;
+ /* first parse the request using JSON RPC V2 parser */
TrexJsonRpcV2Parser rpc_request(request);
-
rpc_request.parse(commands);
int index = 0;
+ /* for every command parsed - launch it */
for (auto command : commands) {
Json::Value single_response;
diff --git a/src/rpc-server/src/trex_rpc_server.cpp b/src/rpc-server/src/trex_rpc_server.cpp
index 2e3f97f9..bdbab5cf 100644
--- a/src/rpc-server/src/trex_rpc_server.cpp
+++ b/src/rpc-server/src/trex_rpc_server.cpp
@@ -38,6 +38,11 @@ TrexRpcServerInterface::~TrexRpcServerInterface() {
}
}
+/**
+ * starts a RPC specific server
+ *
+ * @author imarom (17-Aug-15)
+ */
void TrexRpcServerInterface::start() {
m_is_running = true;