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
next prev 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).