Soft Patch Panel
 help / color / Atom feed
* [spp] [PATCH] spp_nfv: change to return JSON msg for spp-ctl
@ 2019-07-25 11:25 yasufum.o
  0 siblings, 0 replies; only message in thread
From: yasufum.o @ 2019-07-25 11:25 UTC (permalink / raw)
  To: spp, ferruh.yigit, yasufum.o

From: Yasufumi Ogawa <yasufum.o@gmail.com>

Spp_nfv does not return to JSON message without to `status` and
`_get_client_id` requests. Spp-ctl fails to parse the results because
it expects JSON formatted message.

This update is to change the result to be JSON format.

Signed-off-by: Yasufumi Ogawa <yasufum.o@gmail.com>
---
 src/nfv/commands.h | 103 +++++++++++++++++++++++++++++++++------------
 src/nfv/main.c     |   2 +-
 2 files changed, 76 insertions(+), 29 deletions(-)

diff --git a/src/nfv/commands.h b/src/nfv/commands.h
index 06159ad..4b406ab 100644
--- a/src/nfv/commands.h
+++ b/src/nfv/commands.h
@@ -13,19 +13,9 @@
 #define RTE_LOGTYPE_SPP_NFV RTE_LOGTYPE_USER1
 
 static int
-do_del(char *res_uid)
+do_del(char *p_type, int p_id)
 {
 	uint16_t port_id = PORT_RESET;
-	char *p_type;
-	int p_id;
-	int res;
-
-	res = parse_resource_uid(res_uid, &p_type, &p_id);
-	if (res < 0) {
-		RTE_LOG(ERR, SPP_NFV,
-			"Failed to parse resource UID\n");
-		return -1;
-	}
 
 	if (!strcmp(p_type, "vhost")) {
 		port_id = find_port_id(p_id, VHOST);
@@ -65,17 +55,11 @@ do_del(char *res_uid)
  * combination of port type and ID like as 'ring:0'.
  */
 static int
-do_add(char *res_uid)
+do_add(char *p_type, int p_id)
 {
 	enum port_type type = UNDEF;
 	uint16_t port_id = PORT_RESET;
-	char *p_type;
-	int p_id;
-	int res;
-
-	res = parse_resource_uid(res_uid, &p_type, &p_id);
-	if (res < 0)
-		return -1;
+	int res = 0;
 
 	if (!strcmp(p_type, "vhost")) {
 		type = VHOST;
@@ -152,11 +136,14 @@ parse_command(char *str)
 {
 	uint16_t dev_id;
 	char dev_name[RTE_DEV_NAME_MAX_LEN] = { 0 };
-
-	char *token_list[MAX_PARAMETER] = {NULL};
+	char *token_list[MAX_PARAMETER] = { 0 };
 	int cli_id;
 	int max_token = 0;
 	int ret = 0;
+	char result[16] = { 0 };  /* succeeded or failed. */
+	char port_set[32] = { 0 };
+	char *p_type;
+	int p_id;
 
 	if (!str)
 		return 0;
@@ -194,33 +181,66 @@ parse_command(char *str)
 
 	} else if (!strcmp(token_list[0], "_get_client_id")) {
 		memset(str, '\0', MSG_SIZE);
+		/**
+		 * TODO(yasufum) revise result msg. 1) need both of `results`
+		 * and `result`. 2) change `success` to `succeeded`.
+		 */
 		sprintf(str, "{%s:%s,%s:%d,%s:%s}",
 				"\"results\"", "[{\"result\":\"success\"}]",
 				"\"client_id\"", get_client_id(),
 				"\"process_type\"", "\"nfv\"");
 
 	} else if (!strcmp(token_list[0], "_set_client_id")) {
-		if (spp_atoi(token_list[1], &cli_id) >= 0)
+		if (spp_atoi(token_list[1], &cli_id) >= 0) {
 			set_client_id(cli_id);
+			sprintf(result, "%s", "\"succeeded\"");
+		} else
+			sprintf(result, "%s", "\"failed\"");
+		sprintf(str, "{%s:%s,%s:%s}",
+				"\"result\"", result,
+				"\"command\"", "\"_set_client_id\"");
 
 	} else if (!strcmp(token_list[0], "exit")) {
 		RTE_LOG(DEBUG, SPP_NFV, "exit\n");
-		RTE_LOG(DEBUG, SPP_NFV, "stop\n");
 		cmd = STOP;
 		ret = -1;
+		sprintf(str, "{%s:%s,%s:%s}",
+				"\"result\"", "\"succeeded\"",
+				"\"command\"", "\"exit\"");
 
 	} else if (!strcmp(token_list[0], "stop")) {
 		RTE_LOG(DEBUG, SPP_NFV, "stop\n");
 		cmd = STOP;
+		sprintf(str, "{%s:%s,%s:%s}",
+				"\"result\"", "\"succeeded\"",
+				"\"command\"", "\"stop\"");
 
 	} else if (!strcmp(token_list[0], "forward")) {
 		RTE_LOG(DEBUG, SPP_NFV, "forward\n");
 		cmd = FORWARD;
+		sprintf(str, "{%s:%s,%s:%s}",
+				"\"result\"", "\"succeeded\"",
+				"\"command\"", "\"forward\"");
 
 	} else if (!strcmp(token_list[0], "add")) {
 		RTE_LOG(DEBUG, SPP_NFV, "Received add command\n");
-		if (do_add(token_list[1]) < 0)
+
+		ret = parse_resource_uid(token_list[1], &p_type, &p_id);
+		if (ret < 0)
+			return ret;
+
+		if (do_add(p_type, p_id) < 0) {
 			RTE_LOG(ERR, SPP_NFV, "Failed to do_add()\n");
+			sprintf(result, "%s", "\"failed\"");
+		} else
+			sprintf(result, "%s", "\"succeeded\"");
+
+		sprintf(port_set, "\"%s:%d\"", p_type, p_id);
+		memset(str, '\0', MSG_SIZE);
+		sprintf(str, "{%s:%s,%s:%s,%s:%s}",
+				"\"result\"", result,
+				"\"command\"", "\"add\"",
+				"\"port\"", port_set);
 
 	} else if (!strcmp(token_list[0], "patch")) {
 		RTE_LOG(DEBUG, SPP_NFV, "patch\n");
@@ -276,14 +296,27 @@ parse_command(char *str)
 				RTE_LOG(ERR, SPP_NFV, "%s\n", err_msg);
 			}
 
-			if (add_patch(in_port, out_port) == 0)
+			if (add_patch(in_port, out_port) == 0) {
 				RTE_LOG(INFO, SPP_NFV,
 					"Patched '%s:%d' and '%s:%d'\n",
 					in_p_type, in_p_id,
 					out_p_type, out_p_id);
-
-			else
+				sprintf(result, "%s", "\"succeeded\"");
+			} else {
 				RTE_LOG(ERR, SPP_NFV, "Failed to patch\n");
+				sprintf(result, "%s", "\"failed\"");
+			}
+
+			sprintf(port_set,
+				"{\"src\":\"%s:%d\",\"dst\":\"%s:%d\"}",
+				in_p_type, in_p_id, out_p_type, out_p_id);
+
+			memset(str, '\0', MSG_SIZE);
+			sprintf(str, "{%s:%s,%s:%s,%s:%s}",
+					"\"result\"", result,
+					"\"command\"", "\"patch\"",
+					"\"ports\"", port_set);
+
 			ret = 0;
 		}
 
@@ -292,8 +325,22 @@ parse_command(char *str)
 
 		cmd = STOP;
 
-		if (do_del(token_list[1]) < 0)
+		ret = parse_resource_uid(token_list[1], &p_type, &p_id);
+		if (ret < 0)
+			return ret;
+
+		if (do_del(p_type, p_id) < 0) {
 			RTE_LOG(ERR, SPP_NFV, "Failed to do_del()\n");
+			sprintf(result, "%s", "\"failed\"");
+		} else
+			sprintf(result, "%s", "\"succeeded\"");
+
+		sprintf(port_set, "\"%s:%d\"", p_type, p_id);
+		memset(str, '\0', MSG_SIZE);
+		sprintf(str, "{%s:%s,%s:%s,%s:%s}",
+				"\"result\"", result,
+				"\"command\"", "\"del\"",
+				"\"port\"", port_set);
 	}
 
 	return ret;
diff --git a/src/nfv/main.c b/src/nfv/main.c
index 70a6aab..aa2dbc7 100644
--- a/src/nfv/main.c
+++ b/src/nfv/main.c
@@ -190,7 +190,7 @@ main(int argc, char *argv[])
 	unsigned int lcore_id;
 	unsigned int nb_ports;
 	int connected = 0;
-	char str[MSG_SIZE];
+	char str[MSG_SIZE] = { 0 };
 	unsigned int i;
 	int flg_exit;  // used as res of parse_command() to exit if -1
 	int ret;
-- 
2.17.1


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, back to index

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-25 11:25 [spp] [PATCH] spp_nfv: change to return JSON msg for spp-ctl yasufum.o

Soft Patch Panel

Archives are clonable:
	git clone --mirror http://inbox.dpdk.org/spp/0 spp/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 spp spp/ http://inbox.dpdk.org/spp \
		spp@dpdk.org
	public-inbox-index spp


Newsgroup available over NNTP:
	nntp://inbox.dpdk.org/inbox.dpdk.spp


AGPL code for this site: git clone https://public-inbox.org/ public-inbox