Soft Patch Panel
 help / color / mirror / Atom feed
From: x-fn-spp@sl.ntt-tx.co.jp
To: spp@dpdk.org
Subject: [spp] [PATCH 08/57] spp_vf: modify data struct for upd command
Date: Thu, 28 Dec 2017 13:55:15 +0900	[thread overview]
Message-ID: <201712280456.vBS4u5T4010939@imss03.silk.ntt-tx.co.jp> (raw)
In-Reply-To: <4aae78ff-3b6c-cdfe-a8b7-24ec08b73935@lab.ntt.co.jp>

From: Hiroyuki Nakamura <nakamura.hioryuki@po.ntt-tx.co.jp>

spp_vf supports command for modifying classifier table.
* Modify internal data structure to support this command.

Signed-off-by: Kentaro Watanabe <watanabe.kentaro.z01@as.ntt-tx.co.jp>
Signed-off-by: Yasufum Ogawa <ogawa.yasufumi@lab.ntt.co.jp>
---
 src/vf/spp_vf.c | 274 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
 src/vf/spp_vf.h |  47 +++++++++-
 2 files changed, 307 insertions(+), 14 deletions(-)

diff --git a/src/vf/spp_vf.c b/src/vf/spp_vf.c
index 830aaaa..4fb25a4 100644
--- a/src/vf/spp_vf.c
+++ b/src/vf/spp_vf.c
@@ -1,3 +1,4 @@
+#include <netinet/in.h>
 #include <arpa/inet.h>
 #include <getopt.h>
 
@@ -21,19 +22,26 @@ enum SPP_LONGOPT_RETVAL {
 	/* add below */
 
 	SPP_LONGOPT_RETVAL_CONFIG,
+	SPP_LONGOPT_RETVAL_PROCESS_ID
 };
 
 /* struct */
 struct startup_param {
 	uint64_t cpu;
+	int process_id;
+	char server_ip[INET_ADDRSTRLEN];
+	int server_port;
 };
 
 struct patch_info {
-	int	use_flg;
-	int	dpdk_port;
-	struct spp_config_mac_table_element *mac_info;
-	struct spp_core_port_info *rx_core;
-	struct spp_core_port_info *tx_core;
+	int      use_flg;
+	int      dpdk_port;
+	int      rx_core_no;
+	int      tx_core_no;
+	char     mac_addr_str[SPP_CONFIG_STR_LEN];
+	uint64_t mac_addr;
+	struct   spp_core_port_info *rx_core;
+	struct   spp_core_port_info *tx_core;
 };
 
 struct if_info {
@@ -49,6 +57,7 @@ static struct spp_config_area	g_config;
 static struct startup_param	g_startup_param;
 static struct if_info		g_if_info;
 static struct spp_core_info	g_core_info[SPP_CONFIG_CORE_MAX];
+static int 			g_change_core[SPP_CONFIG_CORE_MAX];
 
 static char config_file_path[PATH_MAX];
 
@@ -58,9 +67,10 @@ static char config_file_path[PATH_MAX];
 static void
 usage(const char *progname)
 {
-	RTE_LOG(INFO, APP, "Usage: %s [EAL args] -- [--config CONFIG_FILE_PATH]\n"
-			" --config CONFIG_FILE_PATH: specific config file path\n"
-			"\n"
+	RTE_LOG(INFO, APP, "Usage: %s [EAL args] -- --process-id PROC_ID [--config CONFIG_FILE_PATH] -s SERVER_IP:SERVER_PORT\n"
+			" --process-id PROCESS_ID   : My process ID\n"
+			" --config CONFIG_FILE_PATH : specific config file path\n"
+			" -s SERVER_IP:SERVER_PORT  : Access information to the server\n"
 			, progname);
 }
 
@@ -294,6 +304,47 @@ parse_dpdk_args(int argc, char *argv[])
 }
 
 /*
+ * Parses the process ID of the application argument.
+ */
+static int
+parse_app_process_id(const char *process_id_str, int *process_id)
+{
+	int id = 0;
+	char *endptr = NULL;
+
+	id = strtol(process_id_str, &endptr, 0);
+	if (unlikely(process_id_str == endptr) || unlikely(*endptr != '\0'))
+		return -1;
+
+	*process_id = id;
+	RTE_LOG(DEBUG, APP, "Set process id = %d\n", *process_id);
+	return 0;
+}
+
+/*
+ * Parses server information of application arguments.
+ */
+static int
+parse_app_server(const char *server_str, char *server_ip, int *server_port)
+{
+	const char delim[2] = ":";
+	int pos = 0;
+	int port = 0;
+	char *endptr = NULL;
+
+	pos = strcspn(server_str, delim);
+	port = strtol(&server_str[pos+1], &endptr, 0);
+	if (unlikely(&server_str[pos+1] == endptr) || unlikely(*endptr != '\0'))
+		return -1;
+
+	memcpy(server_ip, server_str, pos);
+	*server_port = port;
+	RTE_LOG(DEBUG, APP, "Set server ip   = %s\n", server_ip);
+	RTE_LOG(DEBUG, APP, "Set server port = %d\n", *server_port);
+	return 0;
+}
+
+/*
  * Parse the application arguments to the client app.
  */
 static int
@@ -306,8 +357,9 @@ parse_app_args(int argc, char *argv[])
 	const char *progname = argv[0];
 	static struct option lgopts[] = { 
 			{ "config", required_argument, NULL, SPP_LONGOPT_RETVAL_CONFIG },
+			{ "process-id", required_argument, NULL, SPP_LONGOPT_RETVAL_PROCESS_ID },
 			{ 0 },
-	 };
+	};
 
 	/* getoptを使用するとargvが並び変わるみたいなので、コピーを実施 */
 	for (cnt = 0; cnt < argcopt; cnt++) {
@@ -317,7 +369,7 @@ parse_app_args(int argc, char *argv[])
 	/* Check application parameter */
 	optind = 0;
 	opterr = 0;
-	while ((opt = getopt_long(argc, argvopt, "", lgopts,
+	while ((opt = getopt_long(argc, argvopt, "s:", lgopts,
 			&option_index)) != EOF) {
 		switch (opt) {
 		case SPP_LONGOPT_RETVAL_CONFIG:
@@ -327,11 +379,31 @@ parse_app_args(int argc, char *argv[])
 			}
 			strcpy(config_file_path, optarg);
 			break;
+		case SPP_LONGOPT_RETVAL_PROCESS_ID:
+			if (parse_app_process_id(optarg, &g_startup_param.process_id) != 0) {
+				usage(progname);
+				return -1;
+			}
+			break;
+		case 's':
+			if (parse_app_server(optarg, g_startup_param.server_ip,
+					&g_startup_param.server_port) != 0) {
+				usage(progname);
+				return -1;
+			}
+			break;
 		default:
+			usage(progname);
+			return -1;
 			break;
 		}
 	}
 
+	RTE_LOG(INFO, APP, "application arguments value. (process id = %d, config = %s, server = %s:%d)\n",
+			g_startup_param.process_id,
+			config_file_path,
+			g_startup_param.server_ip,
+			g_startup_param.server_port);
 	return 0;
 }
 
@@ -364,7 +436,16 @@ get_if_area(enum port_type if_type, int if_no)
 static void
 init_if_info(void)
 {
+	int port_cnt;
 	memset(&g_if_info, 0x00, sizeof(g_if_info));
+	for (port_cnt = 0; port_cnt < RTE_MAX_ETHPORTS; port_cnt++) {
+		g_if_info.nic_patchs[port_cnt].rx_core_no   = -1;
+		g_if_info.nic_patchs[port_cnt].tx_core_no   = -1;
+		g_if_info.vhost_patchs[port_cnt].rx_core_no = -1;
+		g_if_info.vhost_patchs[port_cnt].tx_core_no = -1;
+		g_if_info.ring_patchs[port_cnt].rx_core_no  = -1;
+		g_if_info.ring_patchs[port_cnt].tx_core_no  = -1;
+	}
 }
 
 /*
@@ -376,11 +457,13 @@ init_core_info(void)
 	memset(&g_core_info, 0x00, sizeof(g_core_info));
 	int core_cnt, port_cnt;
 	for (core_cnt = 0; core_cnt < SPP_CONFIG_CORE_MAX; core_cnt++) {
+		g_core_info[core_cnt].lcore_id = core_cnt;
 		for (port_cnt = 0; port_cnt < RTE_MAX_ETHPORTS; port_cnt++) {
 			g_core_info[core_cnt].rx_ports[port_cnt].if_type = UNDEF;
 			g_core_info[core_cnt].tx_ports[port_cnt].if_type = UNDEF;
 		}
 	}
+	memset(g_change_core, 0x00, sizeof(g_change_core));
 }
 
 /*
@@ -440,7 +523,8 @@ set_form_proc_info(struct spp_config_area *config)
 			}
 
 			/* IF情報からCORE情報を変更する場合用に設定 */
-			patch_info->rx_core = &core_info->rx_ports[rx_start + rx_cnt];
+			patch_info->rx_core_no = core_cnt;
+			patch_info->rx_core    = &core_info->rx_ports[rx_start + rx_cnt];
 		}
 
 		/* Set TX port */
@@ -464,7 +548,8 @@ set_form_proc_info(struct spp_config_area *config)
 			}
 
 			/* IF情報からCORE情報を変更する場合用に設定 */
-			patch_info->tx_core = &core_info->tx_ports[tx_start + tx_cnt];
+			patch_info->tx_core_no = core_cnt;
+			patch_info->tx_core    = &core_info->tx_ports[tx_start + tx_cnt];
 		}
 	}
 
@@ -508,7 +593,8 @@ set_from_classifier_table(struct spp_config_area *config)
 
 		/* CORE情報側にもMACアドレスの情報設定 */
 		/* MACアドレスは送信側のみに影響する為、送信側のみ設定 */
-		patch_info->mac_info = mac_table;
+		patch_info->mac_addr = mac_table->mac_addr;
+		strcpy(patch_info->mac_addr_str, mac_table->mac_addr_str);
 		if (unlikely(patch_info->tx_core != NULL)) {
 			patch_info->tx_core->mac_addr = mac_table->mac_addr;
 			strcpy(patch_info->tx_core->mac_addr_str, mac_table->mac_addr_str);
@@ -864,6 +950,8 @@ ut_main(int argc, char *argv[])
 #else
 		{
 #endif
+			/* コマンド受付追加予定箇所           */
+			/* 戻り値等があれば、判定文も追加予定 */
 			sleep(1);
 
 #ifdef SPP_RINGLATENCYSTATS_ENABLE /* RING滞留時間 */
@@ -896,3 +984,163 @@ ut_main(int argc, char *argv[])
 	RTE_LOG(INFO, APP, "spp_vf exit.\n");
 	return ret;
 }
+
+/*
+ * Get process ID
+ */
+int
+spp_get_process_id(void)
+{
+	return g_startup_param.process_id;
+}
+
+/*
+ * Check the MAC address used on the interface
+ */
+static int
+check_mac_used_interface(uint64_t mac_addr, enum port_type *if_type, int *if_no)
+{
+	int cnt = 0;
+	for (cnt = 0; cnt < RTE_MAX_ETHPORTS; cnt++) {
+		if (unlikely(g_if_info.nic_patchs[cnt].mac_addr == mac_addr)) {
+			*if_type = PHY;
+			*if_no = cnt;
+			return 0;
+		}
+		if (unlikely(g_if_info.vhost_patchs[cnt].mac_addr == mac_addr)) {
+			*if_type = VHOST;
+			*if_no = cnt;
+			return 0;
+		}
+		if (unlikely(g_if_info.ring_patchs[cnt].mac_addr == mac_addr)) {
+			*if_type = RING;
+			*if_no = cnt;
+			return 0;
+		}
+	}
+	return -1;
+}
+
+/*
+ * Update Classifier_table
+ */
+int
+spp_update_classifier_table(
+		enum spp_classifier_type type,
+		const char *data,
+		struct spp_config_port_info *port)
+{
+	enum port_type if_type = UNDEF;
+        int if_no = 0;
+	struct patch_info *patch_info = NULL;
+	int64_t ret_mac = 0;
+	uint64_t mac_addr = 0;
+	int ret_used = 0;
+
+	if (type == SPP_CLASSIFIER_TYPE_MAC) {
+		RTE_LOG(DEBUG, APP, "update_classifier_table ( type = mac, data = %s, port = %d:%d )\n",
+				data, port->if_type, port->if_no);
+
+		ret_mac = spp_config_change_mac_str_to_int64(data);
+		if (unlikely(ret_mac == -1)) {
+			RTE_LOG(ERR, APP, "MAC address format error. ( mac = %s )\n", data);
+			return SPP_RET_NG;
+		}
+
+		mac_addr = (uint64_t)ret_mac;
+
+		ret_used = check_mac_used_interface(mac_addr, &if_type, &if_no);
+		if (port->if_type == UNDEF) {
+			/* Delete(unuse) */
+			if (ret_used < 0) {
+				RTE_LOG(DEBUG, APP, "No MAC address. ( mac = %s )\n", data);
+				return SPP_RET_OK;
+			}
+
+			patch_info = get_if_area(if_type, if_no);
+			if (unlikely(patch_info == NULL)) {
+				RTE_LOG(ERR, APP, "No port. ( port = %d:%d )\n", port->if_type, port->if_no);
+				return SPP_RET_NG;
+			}
+
+			patch_info->mac_addr = 0;
+			memset(patch_info->mac_addr_str, 0x00, SPP_CONFIG_STR_LEN);
+			if (patch_info->tx_core != NULL) {
+				patch_info->tx_core->mac_addr = 0;
+				memset(patch_info->tx_core->mac_addr_str, 0x00, SPP_CONFIG_STR_LEN);
+			}
+		}
+		else
+		{
+			/* Setting */
+			if (unlikely(ret_used == 0)) {
+				if (likely(port->if_type == if_type) && likely(port->if_no == if_no)) {
+					RTE_LOG(DEBUG, APP, "Same MAC address and port. ( mac = %s, port = %d:%d )\n",
+							data, if_type, if_no);
+					return SPP_RET_OK;
+				}
+				else
+				{
+					RTE_LOG(ERR, APP, "MAC address in used. ( mac = %s )\n", data);
+					return SPP_RET_USED_MAC;
+				}
+			}
+
+			patch_info = get_if_area(port->if_type, port->if_no);
+			if (unlikely(patch_info == NULL)) {
+				RTE_LOG(ERR, APP, "No port. ( port = %d:%d )\n", port->if_type, port->if_no);
+				return SPP_RET_NG;
+			}
+
+			if (unlikely(patch_info->use_flg != 0)) {
+				RTE_LOG(ERR, APP, "Port not added. ( port = %d:%d )\n", port->if_type, port->if_no);
+				return SPP_RET_NOT_ADD_PORT;
+			}
+
+			if (unlikely(patch_info->mac_addr != 0)) {
+				RTE_LOG(ERR, APP, "Port in used. ( port = %d:%d )\n", port->if_type, port->if_no);
+				return SPP_RET_USED_PORT;
+			}
+
+			patch_info->mac_addr = mac_addr;
+			strcpy(patch_info->mac_addr_str, data);
+			if (patch_info->tx_core != NULL) {
+				patch_info->tx_core->mac_addr = mac_addr;
+				strcpy(patch_info->tx_core->mac_addr_str, data);
+			}
+		}
+	}
+
+	/* 更新コマンドで設定した場合、コア毎に変更有無を保持 */
+	g_change_core[patch_info->tx_core_no] = 1;
+	return SPP_RET_OK;
+}
+
+/*
+ * Flush SPP component
+ */
+int
+spp_flush(void)
+{
+	int core_cnt = 0;
+	int ret_classifier = 0;
+	struct spp_core_info *core_info = NULL;
+
+	for(core_cnt = 0; core_cnt < SPP_CONFIG_CORE_MAX; core_cnt++) {
+		if (g_change_core[core_cnt] == 0)
+			continue;
+
+		core_info = &g_core_info[core_cnt];
+		if (core_info->type == SPP_CONFIG_CLASSIFIER_MAC) {
+//			ret_classifier = spp_classifier_mac_update(core_info);
+			if (unlikely(ret_classifier < 0)) {
+				RTE_LOG(ERR, APP, "Flush error. ( component = classifier_mac)\n");
+				return SPP_RET_NG;
+			}
+		}
+	}
+
+	/* 更新完了により変更したコアをクリア */
+	memset(g_change_core, 0x00, sizeof(g_change_core));
+	return SPP_RET_OK;
+}
diff --git a/src/vf/spp_vf.h b/src/vf/spp_vf.h
index c0faa57..f9707d7 100644
--- a/src/vf/spp_vf.h
+++ b/src/vf/spp_vf.h
@@ -4,6 +4,8 @@
 #include "common.h"
 #include "spp_config.h"
 
+#define SPP_PROCESS_MAX 128
+
 /*
  * State on core
  */
@@ -15,10 +17,29 @@ enum spp_core_status {
 };
 
 /*
+ * Classifier Type
+ */
+enum spp_classifier_type {
+	SPP_CLASSIFIER_TYPE_NONE,
+	SPP_CLASSIFIER_TYPE_MAC
+};
+
+/*
+ * API Return value
+ */
+enum spp_return_value {
+	SPP_RET_OK = 0,
+	SPP_RET_NG = -1,
+	SPP_RET_USED_MAC = -2,
+	SPP_RET_NOT_ADD_PORT = -3,
+	SPP_RET_USED_PORT = -4
+};
+
+/*
  * Port info on core
  */
 struct spp_core_port_info {
-	enum		port_type if_type;
+	enum port_type	if_type;
 	int		if_no;
 	int		dpdk_port;
 	uint64_t	mac_addr;
@@ -29,6 +50,7 @@ struct spp_core_port_info {
  * Core info
  */
 struct spp_core_info {
+	unsigned int lcore_id;
 	volatile enum spp_core_status status;
 	enum spp_core_type type;
 	int	num_rx_port;
@@ -37,4 +59,27 @@ struct spp_core_info {
 	struct spp_core_port_info tx_ports[RTE_MAX_ETHPORTS];
 };
 
+/*
+ * Get process ID
+ * RETURN : PROCESS ID(0~127)
+ */
+int spp_get_process_id(void);
+
+/*
+ * Update Classifier_table
+ * OK : SPP_RET_OK(0)
+ * NG : SPP_RET_NG(-1)
+ *    : SPP_RET_USED_MAC(-2)
+ *    : SPP_RET_NOT_ADD_PORT(-3)
+ *    : SPP_RET_USED_PORT(-4)
+ */
+int spp_update_classifier_table(enum spp_classifier_type type, const char *data, struct spp_config_port_info *port);
+
+/*
+ * Flush SPP component
+ * OK : SPP_RET_OK(0)
+ * NG : SPP_RET_NG(-1)
+ */
+int spp_flush(void);
+
 #endif /* __SPP_VF_H__ */
-- 
1.9.1

  parent reply	other threads:[~2017-12-28  4:56 UTC|newest]

Thread overview: 97+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-25  4:41 [spp] Proposal - spp_vf(SR-IOV like feature) addition to SPP Nakamura Hioryuki
2017-12-26  1:54 ` Yasufumi Ogawa
2017-12-28  4:55   ` [spp] [PATCH 01/57] spp_vf: add vf functions x-fn-spp
2017-12-28  8:49     ` Yasufumi Ogawa
2017-12-28  4:55   ` [spp] [PATCH 02/57] spp_vf: support multi process x-fn-spp
2018-02-07 16:50     ` Ferruh Yigit
2018-02-08  1:21       ` Yasufumi Ogawa
2018-02-08  6:44       ` [spp] [spp 02168] " Nakamura Hioryuki
2017-12-28  4:55   ` [spp] [PATCH 03/57] spp_vf: comment out check of using cores x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 04/57] spp_vf: modify classifier for upd command x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 05/57] spp_vf: add procedure that mac address is null x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 06/57] spp_vf: change config format for upd command x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 07/57] spp_vf: fix compiler warning in classifier_mac.c x-fn-spp
2017-12-28  4:55   ` x-fn-spp [this message]
2017-12-28  4:55   ` [spp] [PATCH 09/57] spp_vf: add functions of command acceptance x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 10/57] spp_vf: add command acceptance calling x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 11/57] spp_vf: fix compiler warning in command_proc.c x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 12/57] " x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 13/57] spp_vf: refactor command acceptance/decode x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 14/57] spp_vf: fix return value overwrite problem x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 15/57] spp_vf: initialize message buffer x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 16/57] spp_vf: add const keyword to parameter x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 17/57] spp_vf: fix wrong comparison operator x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 18/57] spp_vf: fix wrong variable to be assigned x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 19/57] spp_vf: refactor parsing server ip address x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 20/57] spp_vf: fix error in command decode x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 21/57] spp_vf: fix comparison operator in spp_vf.c x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 22/57] spp_vf: check upper limit to the number of process x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 23/57] spp_vf: display usage message x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 24/57] spp_vf: split command processing source file x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 25/57] spp_vf: add new log and line break x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 26/57] spp_vf: support get-process-id command x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 27/57] spp_vf: update socket creation procedure x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 28/57] spp_vf: change log level and add line break x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 29/57] spp_vf: replace unsupported jansson api x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 30/57] spp_vf: change order of command result in json object x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 31/57] spp_vf: use prediction keywords x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 32/57] spp_vf: fix wrong comparison x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 33/57] spp_vf: update sending error status x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 34/57] spp_vf: modify conditional statement x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 35/57] spp_vf: add proc on receiving l2 multicast x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 36/57] spp_vf: extend limit on number of usable cores x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 37/57] spp_vf: add restart procedure for vhost client x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 38/57] spp_vf: fix classifier mbuf handling x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 39/57] spp_vf: add status command x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 40/57] spp_vf: add output source information in error log x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 41/57] spp_vf: change function names x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 42/57] spp_vf: change how to request commands x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 43/57] spp_vf: update command decode procedure x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 44/57] spp_vf: remove debug log output procedures x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 45/57] spp_vf: improve command_decoder program code x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 46/57] spp_vf: fix a bug in status command x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 47/57] spp_vf: add spp_vf.py instead of spp.py x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 48/57] spp_vf: refactor for commnets in spp_vf.c x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 49/57] spp_vf: refactor comments in classifier_mac.c x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 50/57] spp_vf: refactor comments in spp_forward.c x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 51/57] spp_vf: refactor for commnets in spp_config.c x-fn-spp
2017-12-28  4:55   ` [spp] [PATCH 52/57] spp_vf: refactor no self-explanatory comments x-fn-spp
2017-12-28  4:56   ` [spp] [PATCH 53/57] spp_vf: correct typo of function name x-fn-spp
2017-12-28  4:56   ` [spp] [PATCH 54/57] spp_vf: support new command x-fn-spp
2017-12-28  4:56   ` [spp] [PATCH 55/57] spp_vf: add display of status command x-fn-spp
2017-12-28  4:56   ` [spp] [PATCH 56/57] spp_vf: fix " x-fn-spp
2017-12-28  4:56   ` [spp] [PATCH 57/57] spp_vf: fix l2 multicast packet forwarding x-fn-spp
2018-01-15 11:04 ` [spp] Proposal - spp_vf(SR-IOV like feature) addition to SPP Ferruh Yigit
2018-01-16  5:16   ` [spp] [PATCH 01/30] doc: add setup guide x-fn-spp
2018-01-19  0:52     ` Yasufumi Ogawa
2018-01-22 14:37       ` Ferruh Yigit
2018-01-23  0:25         ` Yasufumi Ogawa
2018-01-16  5:16   ` [spp] [PATCH 02/30] doc: add how_to_use.md x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 03/30] doc: add config_manual.md x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 04/30] doc: add spp_vf.md x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 05/30] doc: revise spp_vf.md x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 06/30] doc: add config section x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 07/30] doc: update jp setup manual x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 08/30] doc: modify figure in spp_vf_overview x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 09/30] doc: fix " x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 10/30] doc: fix figure in overview x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 11/30] doc: add sample usage x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 12/30] doc: revice path descs x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 13/30] doc: add network configuration diagram x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 14/30] doc: update user account x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 15/30] doc: update descriptions for todo x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 16/30] doc: add description for explanation section x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 17/30] doc: add spp_sample_usage_svg in docs/spp_vf/ x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 18/30] doc: add explanation for terminating spp app x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 19/30] doc: add explanations on options of spp x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 20/30] doc: update description for the latest spp version x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 21/30] doc: update description on dpdk version x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 22/30] doc: fix vm setup procedure for network config x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 23/30] doc: update jansson installation procedure x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 24/30] doc: fix required network configuration x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 25/30] doc: add how to use vhost-user support x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 26/30] doc: add references to hugepages and isolcpus x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 27/30] doc: remove description on classifier_table x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 28/30] doc: fix typos and erros in texts x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 29/30] doc: update sample config section x-fn-spp
2018-01-16  5:16   ` [spp] [PATCH 30/30] doc: align figure title position x-fn-spp

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=201712280456.vBS4u5T4010939@imss03.silk.ntt-tx.co.jp \
    --to=x-fn-spp@sl.ntt-tx.co.jp \
    --cc=spp@dpdk.org \
    /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).