Soft Patch Panel
 help / color / mirror / Atom feed
From: x-fn-spp-ml@ntt-tx.co.jp
To: spp@dpdk.org, ferruh.yigit@intel.com, yasufum.o@gmail.com
Subject: [spp] [PATCH v3 17/17] spp_nfv: add support of multi-queue
Date: Tue, 25 Feb 2020 14:56:39 +0900	[thread overview]
Message-ID: <20200225055639.31616-18-x-fn-spp-ml@ntt-tx.co.jp> (raw)
In-Reply-To: <20200219112155.13964-1-yamashita.hideyuki@ntt-tx.co.jp>

From: Hideyuki Yamashita <yamashita.hideyuki@ntt-tx.co.jp>

To achieve hardware offload in secondary process, multi-queue should be
supported.
Multi-queue support is divided into several changes like following:
- add queue number parameter in patch command
- parse newly added parameter
- add queue number parameter in status response

Signed-off-by: Hideyuki Yamashita <yamashita.hideyuki@ntt-tx.co.jp>
Signed-off-by: Naoki Takada <ntakada14@gmail.com>
---
 src/nfv/commands.h   |  71 +++++++---
 src/nfv/main.c       |  18 ++-
 src/nfv/nfv_status.c | 315 +++++++++++++++++++------------------------
 src/nfv/nfv_status.h |  12 +-
 4 files changed, 207 insertions(+), 209 deletions(-)

diff --git a/src/nfv/commands.h b/src/nfv/commands.h
index e5b25be..6b3a935 100644
--- a/src/nfv/commands.h
+++ b/src/nfv/commands.h
@@ -17,7 +17,7 @@
  */
 
 static int
-do_del(char *p_type, int p_id)
+do_del(char *p_type, int p_id, uint16_t queue_id)
 {
 	uint16_t port_id = PORT_RESET;
 
@@ -55,7 +55,7 @@ do_del(char *p_type, int p_id)
 
 	}
 
-	forward_array_remove(port_id);
+	forward_array_remove(port_id, queue_id);
 	port_map_init_one(port_id);
 
 	return 0;
@@ -66,7 +66,7 @@ do_del(char *p_type, int p_id)
  * combination of port type and ID like as 'ring:0'.
  */
 static int
-do_add(char *p_type, int p_id)
+do_add(char *p_type, int p_id, uint16_t queue_id)
 {
 	enum port_type type = UNDEF;
 	uint16_t port_id = PORT_RESET;
@@ -105,9 +105,11 @@ do_add(char *p_type, int p_id)
 	 * other than RING. There is no support to show/clear this stats
 	 * at the moment.
 	 */
+	port_map[port_id].queue_info = NULL;
 
-	/* Update ports_fwd_array with port id */
-	ports_fwd_array[port_id].in_port_id = port_id;
+	/* Update ports_fwd_array with port id and queue id */
+	ports_fwd_array[port_id][queue_id].in_port_id = port_id;
+	ports_fwd_array[port_id][queue_id].in_queue_id = queue_id;
 
 	return 0;
 }
@@ -164,6 +166,7 @@ parse_command(char *str)
 	char port_set[128] = { 0 };
 	char *p_type;
 	int p_id;
+	uint16_t queue_id;
 
 	if (!str)
 		return 0;
@@ -185,12 +188,10 @@ parse_command(char *str)
 		memset(str, '\0', MSG_SIZE);
 		if (cmd == FORWARD)
 			get_sec_stats_json(str, get_client_id(), "running",
-					lcore_id_used,
-					ports_fwd_array, port_map);
+					lcore_id_used);
 		else
 			get_sec_stats_json(str, get_client_id(), "idling",
-					lcore_id_used,
-					ports_fwd_array, port_map);
+					lcore_id_used);
 
 		RTE_ETH_FOREACH_DEV(dev_id) {
 			rte_eth_dev_get_name_by_port(dev_id, dev_name);
@@ -245,11 +246,12 @@ parse_command(char *str)
 	} else if (!strcmp(token_list[0], "add")) {
 		RTE_LOG(DEBUG, SPP_NFV, "Received add command\n");
 
-		ret = parse_resource_uid(token_list[1], &p_type, &p_id);
+		ret = parse_resource_uid(token_list[1], &p_type, &p_id,
+				&queue_id);
 		if (ret < 0)
 			return ret;
 
-		if (do_add(p_type, p_id) < 0) {
+		if (do_add(p_type, p_id, queue_id) < 0) {
 			RTE_LOG(ERR, SPP_NFV, "Failed to do_add()\n");
 			sprintf(result, "%s", "\"failed\"");
 		} else
@@ -282,13 +284,23 @@ parse_command(char *str)
 			char *out_p_type;
 			int in_p_id;
 			int out_p_id;
-
-			parse_resource_uid(token_list[1], &in_p_type, &in_p_id);
+			uint16_t in_queue_id, out_queue_id;
+			int res_uid_str_size = 32;
+			char in_res_uid[res_uid_str_size];
+			char out_res_uid[res_uid_str_size];
+
+			strncpy(in_res_uid, token_list[1],
+				res_uid_str_size - 1);
+			strncpy(out_res_uid, token_list[2],
+				res_uid_str_size - 1);
+
+			parse_resource_uid(token_list[1], &in_p_type, &in_p_id,
+					&in_queue_id);
 			in_port = find_port_id(in_p_id,
 					get_port_type(in_p_type));
 
 			parse_resource_uid(token_list[2],
-					&out_p_type, &out_p_id);
+					&out_p_type, &out_p_id, &out_queue_id);
 			out_port = find_port_id(out_p_id,
 					get_port_type(out_p_type));
 
@@ -314,13 +326,27 @@ parse_command(char *str)
 					"Patch not found, out_port",
 					out_p_type, out_p_id);
 				RTE_LOG(ERR, SPP_NFV, "%s\n", err_msg);
+			} else if (is_valid_port_rxq(in_port, in_queue_id)) {
+				RTE_LOG(ERR, SPP_NFV,
+					"Queue number of in_port"
+					" exceeds definition"
+					" %s:%d nq %d(%s:%d)\n",
+					in_p_type, in_p_id, in_queue_id,
+					__func__, __LINE__);
+			} else if (is_valid_port_txq(out_port, out_queue_id)) {
+				RTE_LOG(ERR, SPP_NFV,
+					"Queue number of out_port"
+					" exceeds definition"
+					" %s:%d nq %d(%s:%d)\n",
+					out_p_type, out_p_id, out_queue_id,
+					__func__, __LINE__);
 			}
 
-			if (add_patch(in_port, out_port) == 0) {
+			if (add_patch(in_port, in_queue_id, out_port,
+				out_queue_id) == 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);
+					"Patched '%s' and '%s'\n",
+					in_res_uid, out_res_uid);
 				sprintf(result, "%s", "\"succeeded\"");
 			} else {
 				RTE_LOG(ERR, SPP_NFV, "Failed to patch\n");
@@ -328,8 +354,8 @@ parse_command(char *str)
 			}
 
 			sprintf(port_set,
-				"{\"src\":\"%s:%d\",\"dst\":\"%s:%d\"}",
-				in_p_type, in_p_id, out_p_type, out_p_id);
+				"{\"src\":\"%s\",\"dst\":\"%s\"}",
+				in_res_uid, out_res_uid);
 
 			memset(str, '\0', MSG_SIZE);
 			sprintf(str, "{%s:%s,%s:%s,%s:%s}",
@@ -345,11 +371,12 @@ parse_command(char *str)
 
 		cmd = STOP;
 
-		ret = parse_resource_uid(token_list[1], &p_type, &p_id);
+		ret = parse_resource_uid(token_list[1], &p_type, &p_id,
+				&queue_id);
 		if (ret < 0)
 			return ret;
 
-		if (do_del(p_type, p_id) < 0) {
+		if (do_del(p_type, p_id, queue_id) < 0) {
 			RTE_LOG(ERR, SPP_NFV, "Failed to do_del()\n");
 			sprintf(result, "%s", "\"failed\"");
 		} else
diff --git a/src/nfv/main.c b/src/nfv/main.c
index f2c6bfc..32f1074 100644
--- a/src/nfv/main.c
+++ b/src/nfv/main.c
@@ -145,13 +145,14 @@ main(int argc, char *argv[])
 	unsigned int nb_ports;
 	int connected = 0;
 	char str[MSG_SIZE] = { 0 };
-	unsigned int i;
+	unsigned int i, j;
 	int flg_exit;  // used as res of parse_command() to exit if -1
 	int ret;
 	char dev_name[RTE_DEV_NAME_MAX_LEN] = { 0 };
 	int port_type;
 	int nof_phy_port = 0;
 	char log_msg[1024] = { 0 };  /* temporary log message */
+	uint16_t max_queue;
 
 	ret = rte_eal_init(argc, argv);
 	if (ret < 0)
@@ -218,11 +219,22 @@ main(int argc, char *argv[])
 		 * not display to avoid confusion.
 		 */
 
-		/* Update ports_fwd_array with phy port. */
-		ports_fwd_array[i].in_port_id = i;
 		port_map[i].port_type = port_type;
 		port_map[i].id = port_id;
 		port_map[i].stats = &ports->port_stats[i];
+		port_map[i].queue_info = &ports->queue_info[i];
+
+		/* Update ports_fwd_array with phy port. */
+		if (port_map[i].queue_info->rxq >=
+			port_map[i].queue_info->txq)
+			max_queue = port_map[i].queue_info->rxq;
+		else
+			max_queue = port_map[i].queue_info->txq;
+
+		for (j = 0; j < max_queue; j++) {
+			ports_fwd_array[i][j].in_port_id = i;
+			ports_fwd_array[i][j].in_queue_id = j;
+		}
 
 		/* TODO(yasufum) convert from int of port_type to char */
 		RTE_LOG(DEBUG, SPP_NFV, "Add port, type: %d, id: %d\n",
diff --git a/src/nfv/nfv_status.c b/src/nfv/nfv_status.c
index 3947a84..d5d7f44 100644
--- a/src/nfv/nfv_status.c
+++ b/src/nfv/nfv_status.c
@@ -6,6 +6,8 @@
 
 #include <arpa/inet.h>
 #include "shared/common.h"
+#include "shared/basic_forwarder.h"
+#include "shared/port_manager.h"
 #include "nfv_status.h"
 
 /*
@@ -28,9 +30,7 @@
 void
 get_sec_stats_json(char *str, int cli_id,
 		const char *running_stat,
-		uint8_t lcore_id_used[RTE_MAX_LCORE],
-		struct port *ports_fwd_array,
-		struct port_map *port_map)
+		uint8_t lcore_id_used[RTE_MAX_LCORE])
 {
 	sprintf(str, "{\"client-id\":%d,", cli_id);
 
@@ -40,10 +40,10 @@ get_sec_stats_json(char *str, int cli_id,
 	append_lcore_info_json(str, lcore_id_used);
 	sprintf(str + strlen(str), ",");
 
-	append_port_info_json(str, ports_fwd_array, port_map);
+	append_port_info_json(str);
 	sprintf(str + strlen(str), ",");
 
-	append_patch_info_json(str, ports_fwd_array, port_map);
+	append_patch_info_json(str);
 	sprintf(str + strlen(str), "}");
 
 	/* Make sure to be terminated with null character. */
@@ -76,53 +76,63 @@ append_lcore_info_json(char *str,
  *     "ports": ["phy:0", "phy:1", "ring:0", "vhost:0"]
  */
 int
-append_port_info_json(char *str,
-		struct port *ports_fwd_array,
-		struct port_map *port_map)
+append_port_info_json(char *str)
 {
-	unsigned int i;
+	unsigned int i, j;
 	unsigned int has_port = 0;  // for checking having port at last
+	uint16_t max_queue;
 
 	sprintf(str + strlen(str), "\"ports\":[");
 	for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
+		max_queue = get_port_max_queues(i);
 
-		if (ports_fwd_array[i].in_port_id == PORT_RESET)
-			continue;
+		for (j = 0; j < max_queue; j++) {
+			if (ports_fwd_array[i][j].in_port_id == PORT_RESET)
+				continue;
 
-		has_port = 1;
-		switch (port_map[i].port_type) {
-		case PHY:
-			sprintf(str + strlen(str), "\"phy:%u\",",
-					port_map[i].id);
-			break;
-		case RING:
-			sprintf(str + strlen(str), "\"ring:%u\",",
-				port_map[i].id);
-			break;
-		case VHOST:
-			sprintf(str + strlen(str), "\"vhost:%u\",",
-				port_map[i].id);
-			break;
-		case PCAP:
-			sprintf(str + strlen(str), "\"pcap:%u\",",
-					port_map[i].id);
-			break;
-		case NULLPMD:
-			sprintf(str + strlen(str), "\"nullpmd:%u\",",
-					port_map[i].id);
-			break;
-		case TAP:
-			sprintf(str + strlen(str), "\"tap:%u\",",
+			has_port = 1;
+			switch (port_map[i].port_type) {
+			case PHY:
+				if (max_queue == 1)
+					sprintf(str + strlen(str),
+						"\"phy:%u\",", port_map[i].id);
+				else
+					sprintf(str + strlen(str),
+						"\"phy:%u nq %u\",",
+						port_map[i].id, j);
+				break;
+			case RING:
+				sprintf(str + strlen(str), "\"ring:%u\",",
 					port_map[i].id);
-			break;
-		case MEMIF:
-			sprintf(str + strlen(str), "\"memif:%u\",",
+				break;
+			case VHOST:
+				sprintf(str + strlen(str), "\"vhost:%u\",",
 					port_map[i].id);
-			break;
-		case UNDEF:
-			/* TODO(yasufum) Need to remove print for undefined ? */
-			sprintf(str + strlen(str), "\"udf\",");
-			break;
+				break;
+			case PCAP:
+				sprintf(str + strlen(str), "\"pcap:%u\",",
+						port_map[i].id);
+				break;
+			case NULLPMD:
+				sprintf(str + strlen(str), "\"nullpmd:%u\",",
+						port_map[i].id);
+				break;
+			case TAP:
+				sprintf(str + strlen(str), "\"tap:%u\",",
+						port_map[i].id);
+				break;
+			case MEMIF:
+				sprintf(str + strlen(str), "\"memif:%u\",",
+						port_map[i].id);
+				break;
+			case UNDEF:
+				/*
+				 * TODO(yasufum) Need to remove print for
+				 * undefined ?
+				 */
+				sprintf(str + strlen(str), "\"udf\",");
+				break;
+			}
 		}
 	}
 
@@ -136,6 +146,57 @@ append_port_info_json(char *str,
 	return 0;
 }
 
+static void
+append_port_string(char *str, enum port_type port_type,
+		uint16_t port_id, uint16_t queue_id, int max_queue)
+{
+	switch (port_type) {
+	case PHY:
+		RTE_LOG(INFO, SHARED, "Type: PHY\n");
+		if (max_queue > 1)
+			sprintf(str, "\"phy:%u nq %u\"", port_id, queue_id);
+		else
+			sprintf(str, "\"phy:%u\"", port_id);
+		break;
+
+	case RING:
+		RTE_LOG(INFO, SHARED, "Type: RING\n");
+		sprintf(str, "\"ring:%u\"", port_id);
+		break;
+
+	case VHOST:
+		RTE_LOG(INFO, SHARED, "Type: VHOST\n");
+		sprintf(str, "\"vhost:%u\"", port_id);
+		break;
+
+	case PCAP:
+		RTE_LOG(INFO, SHARED, "Type: PCAP\n");
+		sprintf(str, "\"pcap:%u\"", port_id);
+		break;
+
+	case NULLPMD:
+		RTE_LOG(INFO, SHARED, "Type: NULLPMD\n");
+		sprintf(str, "\"nullpmd:%u\"", port_id);
+		break;
+
+	case TAP:
+		RTE_LOG(INFO, SHARED, "Type: TAP\n");
+		sprintf(str, "\"tap:%u\"", port_id);
+		break;
+
+	case MEMIF:
+		RTE_LOG(INFO, SHARED, "Type: MEMIF\n");
+		sprintf(str, "\"memif:%u\"", port_id);
+		break;
+
+	case UNDEF:
+		RTE_LOG(INFO, SHARED, "Type: UDF\n");
+		/* TODO(yasufum) Need to remove print for undefined ? */
+		sprintf(str, "\"udf\"");
+		break;
+	}
+}
+
 /*
  * Append patch info to sec status. It is called from get_sec_stats_json()
  * to add a JSON formatted patch info to given 'str'. Here is an example.
@@ -146,152 +207,56 @@ append_port_info_json(char *str,
  *      ]
  */
 int
-append_patch_info_json(char *str,
-		struct port *ports_fwd_array,
-		struct port_map *port_map)
+append_patch_info_json(char *str)
 {
-	unsigned int i;
+	unsigned int i, j;
 	unsigned int has_patch = 0;  // for checking having patch at last
+	unsigned int out_port_id;
+	uint16_t out_queue_id;
+	uint16_t in_max_queue, out_max_queue;
 
 	char patch_str[128];
 	sprintf(str + strlen(str), "\"patches\":[");
 	for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
+		in_max_queue = get_port_max_queues(i);
 
-		if (ports_fwd_array[i].in_port_id == PORT_RESET)
-			continue;
-
-		RTE_LOG(INFO, SHARED, "Port ID %d\n", i);
-		RTE_LOG(INFO, SHARED, "Status %d\n",
-			ports_fwd_array[i].in_port_id);
+		for (j = 0; j < in_max_queue; j++) {
 
-		memset(patch_str, '\0', sizeof(patch_str));
+			if (ports_fwd_array[i][j].in_port_id == PORT_RESET ||
+				ports_fwd_array[i][j].out_port_id == PORT_RESET)
+				continue;
 
-		sprintf(patch_str, "{\"src\":");
-
-		switch (port_map[i].port_type) {
-		case PHY:
-			RTE_LOG(INFO, SHARED, "Type: PHY\n");
-			sprintf(patch_str + strlen(patch_str),
-					"\"phy:%u\",",
-					port_map[i].id);
-			break;
-		case RING:
-			RTE_LOG(INFO, SHARED, "Type: RING\n");
-			sprintf(patch_str + strlen(patch_str),
-					"\"ring:%u\",",
-					port_map[i].id);
-			break;
-		case VHOST:
-			RTE_LOG(INFO, SHARED, "Type: VHOST\n");
-			sprintf(patch_str + strlen(patch_str),
-					"\"vhost:%u\",",
-					port_map[i].id);
-			break;
-		case PCAP:
-			RTE_LOG(INFO, SHARED, "Type: PCAP\n");
-			sprintf(patch_str + strlen(patch_str),
-					"\"pcap:%u\",",
-					port_map[i].id);
-			break;
-		case NULLPMD:
-			RTE_LOG(INFO, SHARED, "Type: NULLPMD\n");
-			sprintf(patch_str + strlen(patch_str),
-					"\"nullpmd:%u\",",
-					port_map[i].id);
-			break;
-		case TAP:
-			RTE_LOG(INFO, SHARED, "Type: TAP\n");
-			sprintf(patch_str + strlen(patch_str),
-					"\"tap:%u\",",
-					port_map[i].id);
-			break;
-		case MEMIF:
-			RTE_LOG(INFO, SHARED, "Type: MEMIF\n");
-			sprintf(patch_str + strlen(patch_str),
-					"\"memif:%u\",",
-					port_map[i].id);
-			break;
-		case UNDEF:
-			RTE_LOG(INFO, SHARED, "Type: UDF\n");
-			/* TODO(yasufum) Need to remove print for undefined ? */
-			sprintf(patch_str + strlen(patch_str),
-					"\"udf\",");
-			break;
-		}
-
-		sprintf(patch_str + strlen(patch_str), "\"dst\":");
-
-		RTE_LOG(INFO, SHARED, "Out Port ID %d\n",
-				ports_fwd_array[i].out_port_id);
-
-		if (ports_fwd_array[i].out_port_id == PORT_RESET) {
-			//sprintf(patch_str + strlen(patch_str), "%s", "\"\"");
-			continue;
-		} else {
 			has_patch = 1;
-			unsigned int j = ports_fwd_array[i].out_port_id;
-			switch (port_map[j].port_type) {
-			case PHY:
-				RTE_LOG(INFO, SHARED, "Type: PHY\n");
-				sprintf(patch_str + strlen(patch_str),
-						"\"phy:%u\"",
-						port_map[j].id);
-				break;
-			case RING:
-				RTE_LOG(INFO, SHARED, "Type: RING\n");
-				sprintf(patch_str + strlen(patch_str),
-						"\"ring:%u\"",
-						port_map[j].id);
-				break;
-			case VHOST:
-				RTE_LOG(INFO, SHARED, "Type: VHOST\n");
-				sprintf(patch_str + strlen(patch_str),
-						"\"vhost:%u\"",
-						port_map[j].id);
-				break;
-			case PCAP:
-				RTE_LOG(INFO, SHARED, "Type: PCAP\n");
-				sprintf(patch_str + strlen(patch_str),
-						"\"pcap:%u\"",
-						port_map[j].id);
-				break;
-			case NULLPMD:
-				RTE_LOG(INFO, SHARED, "Type: NULLPMD\n");
-				sprintf(patch_str + strlen(patch_str),
-						"\"nullpmd:%u\"",
-						port_map[j].id);
-				break;
-			case TAP:
-				RTE_LOG(INFO, SHARED, "Type: TAP\n");
-				sprintf(patch_str + strlen(patch_str),
-						"\"tap:%u\"",
-						port_map[j].id);
-				break;
-			case MEMIF:
-				RTE_LOG(INFO, SHARED, "Type: MEMIF\n");
-				sprintf(patch_str + strlen(patch_str),
-						"\"memif:%u\"",
-						port_map[j].id);
-				break;
-			case UNDEF:
-				RTE_LOG(INFO, SHARED, "Type: UDF\n");
-				/*
-				 * TODO(yasufum) Need to remove print for
-				 * undefined ?
-				 */
-				sprintf(patch_str + strlen(patch_str),
-						"\"udf\"");
-				break;
-			}
-		}
-
-		sprintf(patch_str + strlen(patch_str), "},");
+			RTE_LOG(INFO, SHARED, "Port ID %d\n", i);
+			RTE_LOG(INFO, SHARED, "Queue ID %d\n", j);
+			RTE_LOG(INFO, SHARED, "Status %d\n",
+				ports_fwd_array[i][j].in_port_id);
+
+			memset(patch_str, '\0', sizeof(patch_str));
+
+			sprintf(patch_str, "{\"src\":");
+			append_port_string(patch_str + strlen(patch_str),
+				port_map[i].port_type, port_map[i].id,
+				j, in_max_queue);
+			sprintf(patch_str + strlen(patch_str), ",\"dst\":");
+
+			out_port_id = ports_fwd_array[i][j].out_port_id;
+			out_queue_id = ports_fwd_array[i][j].out_queue_id;
+			RTE_LOG(INFO, SHARED, "Out Port ID %d\n", out_port_id);
+			RTE_LOG(INFO, SHARED, "Out Queue ID %d\n",
+				out_queue_id);
+
+			out_max_queue = get_port_max_queues(out_port_id);
+			append_port_string(patch_str + strlen(patch_str),
+				port_map[out_port_id].port_type,
+				port_map[out_port_id].id,
+				out_queue_id, out_max_queue);
+			sprintf(patch_str + strlen(patch_str), "},");
 
-		if (has_patch != 0)
 			sprintf(str + strlen(str), "%s", patch_str);
+		}
 	}
 
-
 	/* Check if it has at least one patch to remove ",". */
 	if (has_patch == 0) {
 		sprintf(str + strlen(str), "]");
diff --git a/src/nfv/nfv_status.h b/src/nfv/nfv_status.h
index 14225cc..cf59dde 100644
--- a/src/nfv/nfv_status.h
+++ b/src/nfv/nfv_status.h
@@ -8,21 +8,15 @@
 /* Get status of spp_nfv or spp_vm as JSON format. */
 void get_sec_stats_json(char *str, int client_id,
 		const char *running_stat,
-		uint8_t lcore_id_used[RTE_MAX_LCORE],
-		struct port *ports_fwd_array,
-		struct port_map *port_map);
+		uint8_t lcore_id_used[RTE_MAX_LCORE]);
 
 int append_lcore_info_json(char *str,
 		uint8_t lcore_id_used[RTE_MAX_LCORE]);
 
 /* Append port info to sec status, called from get_sec_stats_json(). */
-int append_port_info_json(char *str,
-		struct port *ports_fwd_array,
-		struct port_map *port_map);
+int append_port_info_json(char *str);
 
 /* Append patch info to sec status, called from get_sec_stats_json(). */
-int append_patch_info_json(char *str,
-		struct port *ports_fwd_array,
-		struct port_map *port_map);
+int append_patch_info_json(char *str);
 
 #endif
-- 
2.17.1


      parent reply	other threads:[~2020-02-25  5:57 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20200219112155.13964-1-yamashita.hideyuki@ntt-tx.co.jp>
2020-02-25  5:56 ` [spp] [PATCH v3 00/17] Adding Hardware offload capability x-fn-spp-ml
2020-02-25 10:37   ` Yasufumi Ogawa
2020-02-25  5:56 ` [spp] [PATCH v3 01/17] shared: add support of multi-queue x-fn-spp-ml
2020-02-25  5:56 ` [spp] [PATCH v3 02/17] spp_vf: " x-fn-spp-ml
2020-02-25  5:56 ` [spp] [PATCH v3 03/17] spp_mirror: " x-fn-spp-ml
2020-02-25  5:56 ` [spp] [PATCH v3 04/17] spp_pcap: " x-fn-spp-ml
2020-02-25  5:56 ` [spp] [PATCH v3 05/17] spp_primary: " x-fn-spp-ml
2020-02-25  5:56 ` [spp] [PATCH v3 06/17] spp_primary: add support of rte_flow x-fn-spp-ml
2020-02-25  5:56 ` [spp] [PATCH v3 07/17] spp_primary: add common function " x-fn-spp-ml
2020-02-25  5:56 ` [spp] [PATCH v3 08/17] spp_primary: add attribute " x-fn-spp-ml
2020-02-25  5:56 ` [spp] [PATCH v3 09/17] spp_primary: add patterns " x-fn-spp-ml
2020-02-25  5:56 ` [spp] [PATCH v3 10/17] spp_primary: add actions " x-fn-spp-ml
2020-02-25  5:56 ` [spp] [PATCH v3 11/17] bin: add parameter for hardrare offload x-fn-spp-ml
2020-02-25  5:56 ` [spp] [PATCH v3 12/17] cli: add support of hardware offload x-fn-spp-ml
2020-02-25  5:56 ` [spp] [PATCH v3 13/17] cli: add support of rte_flow in vf x-fn-spp-ml
2020-02-25  5:56 ` [spp] [PATCH v3 14/17] cli: add support of rte_flow in mirror x-fn-spp-ml
2020-02-25  5:56 ` [spp] [PATCH v3 15/17] cli: add support of rte_flow in nfv x-fn-spp-ml
2020-02-25  5:56 ` [spp] [PATCH v3 16/17] spp-ctl: add APIs for flow rules x-fn-spp-ml
2020-02-25  5:56 ` x-fn-spp-ml [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200225055639.31616-18-x-fn-spp-ml@ntt-tx.co.jp \
    --to=x-fn-spp-ml@ntt-tx.co.jp \
    --cc=ferruh.yigit@intel.com \
    --cc=spp@dpdk.org \
    --cc=yasufum.o@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).