From: x-fn-spp@sl.ntt-tx.co.jp
To: ferruh.yigit@intel.com, ogawa.yasufumi@lab.ntt.co.jp
Cc: spp@dpdk.org
Subject: [spp] [PATCH 21/23] spp_vf: add vlantag command check flag
Date: Wed, 21 Nov 2018 10:35:56 +0900 [thread overview]
Message-ID: <201811210136.wAL1a1be009709@imss03.silk.ntt-tx.co.jp> (raw)
In-Reply-To: <20181121013558.8869-1-x-fn-spp@sl.ntt-tx.co.jp>
From: Hideyuki Yamashita <yamashita.hideyuki@po.ntt-tx.co.jp>
Add a flag to override VLAN tag. If it is disabled, `port add` command
is failed to. This update is for allowing to execute `add_vlantag' even
if existing port.
Signed-off-by: Hideyuki Yamashita <yamashita.hideyuki@po.ntt-tx.co.jp>
Signed-off-by: Naoki Takada <takada.naoki@lab.ntt.co.jp>
---
src/vf/common/command_dec.c | 305 +++++++++++++++++++++++++-----------
1 file changed, 216 insertions(+), 89 deletions(-)
diff --git a/src/vf/common/command_dec.c b/src/vf/common/command_dec.c
index 9a49185..82cd619 100644
--- a/src/vf/common/command_dec.c
+++ b/src/vf/common/command_dec.c
@@ -14,34 +14,34 @@
#define RTE_LOGTYPE_SPP_COMMAND_PROC RTE_LOGTYPE_USER1
/* command string */
-#define SPP_COMMAND_CLASSFIER_TABLE_STR "classifier_table"
-#define SPP_COMMAND_GET_CLIENT_ID_STR "_get_client_id"
-#define SPP_COMMAND_STATUS_STR "status"
-#define SPP_COMMAND_EXIT_STR "exit"
-#define SPP_COMMAND_COMPONENT_STR "component"
-#define SPP_COMMAND_PORT_STR "port"
+#define SPP_COMMAND_CLASSFIER_TABLE_STR "classifier_table"
+#define SPP_COMMAND_GET_CLIENT_ID_STR "_get_client_id"
+#define SPP_COMMAND_STATUS_STR "status"
+#define SPP_COMMAND_EXIT_STR "exit"
+#define SPP_COMMAND_COMPONENT_STR "component"
+#define SPP_COMMAND_PORT_STR "port"
/* classifiler_type string */
-#define SPP_CLASSIFLER_NONE_STR "none"
-#define SPP_CLASSIFLER_MAC_STR "mac"
-#define SPP_CLASSIFLER_VLAN_STR "vlan"
+#define SPP_CLASSIFLER_NONE_STR "none"
+#define SPP_CLASSIFLER_MAC_STR "mac"
+#define SPP_CLASSIFLER_VLAN_STR "vlan"
/* command action string */
-#define SPP_ACTION_NONE_STR "none"
-#define SPP_ACTION_START_STR "start"
-#define SPP_ACTION_STOP_STR "stop"
-#define SPP_ACTION_ADD_STR "add"
-#define SPP_ACTION_DEL_STR "del"
+#define SPP_ACTION_NONE_STR "none"
+#define SPP_ACTION_START_STR "start"
+#define SPP_ACTION_STOP_STR "stop"
+#define SPP_ACTION_ADD_STR "add"
+#define SPP_ACTION_DEL_STR "del"
/* port rx/tx string */
-#define SPP_PORT_RXTX_NONE_STR "none"
-#define SPP_PORT_RXTX_RX_STR "rx"
-#define SPP_PORT_RXTX_TX_STR "tx"
+#define SPP_PORT_RXTX_NONE_STR "none"
+#define SPP_PORT_RXTX_RX_STR "rx"
+#define SPP_PORT_RXTX_TX_STR "tx"
/* port ability string */
-#define SPP_ABILITY_NONE_STR "none"
-#define SPP_ABILITY_ADD_VLANTAG_STR "add_vlantag"
-#define SPP_ABILITY_DEL_VLANTAG_STR "del_vlantag"
+#define SPP_ABILITY_NONE_STR "none"
+#define SPP_ABILITY_ADD_VLANTAG_STR "add_vlantag"
+#define SPP_ABILITY_DEL_VLANTAG_STR "del_vlantag"
/*
* classifier type string list
@@ -344,7 +344,8 @@ decode_core_value(void *output, const char *arg_val)
/* decoding procedure of action for component command */
static int
-decode_component_action_value(void *output, const char *arg_val)
+decode_component_action_value(void *output, const char *arg_val,
+ int allow_override __attribute__ ((unused)))
{
int ret = SPP_RET_OK;
ret = get_arrary_index(arg_val, COMMAND_ACTION_STRINGS);
@@ -369,7 +370,8 @@ decode_component_action_value(void *output, const char *arg_val)
/* decoding procedure of action for component command */
static int
-decode_component_name_value(void *output, const char *arg_val)
+decode_component_name_value(void *output, const char *arg_val,
+ int allow_override __attribute__ ((unused)))
{
int ret = SPP_RET_OK;
struct spp_command_component *component = output;
@@ -390,7 +392,8 @@ decode_component_name_value(void *output, const char *arg_val)
/* decoding procedure of core id for component command */
static int
-decode_component_core_value(void *output, const char *arg_val)
+decode_component_core_value(void *output, const char *arg_val,
+ int allow_override __attribute__ ((unused)))
{
struct spp_command_component *component = output;
@@ -403,7 +406,8 @@ decode_component_core_value(void *output, const char *arg_val)
/* decoding procedure of type for component command */
static int
-decode_component_type_value(void *output, const char *arg_val)
+decode_component_type_value(void *output, const char *arg_val,
+ int allow_override __attribute__ ((unused)))
{
enum spp_component_type org_type, set_type;
struct spp_command_component *component = output;
@@ -435,7 +439,8 @@ decode_component_type_value(void *output, const char *arg_val)
/* decoding procedure of action for port command */
static int
-decode_port_action_value(void *output, const char *arg_val)
+decode_port_action_value(void *output, const char *arg_val,
+ int allow_override __attribute__ ((unused)))
{
int ret = SPP_RET_OK;
ret = get_arrary_index(arg_val, COMMAND_ACTION_STRINGS);
@@ -460,7 +465,7 @@ decode_port_action_value(void *output, const char *arg_val)
/* decoding procedure of port for port command */
static int
-decode_port_port_value(void *output, const char *arg_val)
+decode_port_port_value(void *output, const char *arg_val, int allow_override)
{
int ret = SPP_RET_NG;
struct spp_port_index tmp_port;
@@ -470,17 +475,20 @@ decode_port_port_value(void *output, const char *arg_val)
if (ret < SPP_RET_OK)
return SPP_RET_NG;
- if ((port->action == SPP_CMD_ACTION_ADD) &&
- (spp_check_used_port(tmp_port.iface_type,
- tmp_port.iface_no,
- SPP_PORT_RXTX_RX) >= 0) &&
- (spp_check_used_port(tmp_port.iface_type,
- tmp_port.iface_no,
- SPP_PORT_RXTX_TX) >= 0)) {
- RTE_LOG(ERR, SPP_COMMAND_PROC,
+ /* add vlantag command check */
+ if (allow_override == 0) {
+ if ((port->action == SPP_CMD_ACTION_ADD) &&
+ (spp_check_used_port(tmp_port.iface_type,
+ tmp_port.iface_no,
+ SPP_PORT_RXTX_RX) >= 0) &&
+ (spp_check_used_port(tmp_port.iface_type,
+ tmp_port.iface_no,
+ SPP_PORT_RXTX_TX) >= 0)) {
+ RTE_LOG(ERR, SPP_COMMAND_PROC,
"Port in used. (port command) val=%s\n",
arg_val);
- return SPP_RET_NG;
+ return SPP_RET_NG;
+ }
}
port->port.iface_type = tmp_port.iface_type;
@@ -490,7 +498,7 @@ decode_port_port_value(void *output, const char *arg_val)
/* decoding procedure of rxtx type for port command */
static int
-decode_port_rxtx_value(void *output, const char *arg_val)
+decode_port_rxtx_value(void *output, const char *arg_val, int allow_override)
{
int ret = SPP_RET_OK;
struct spp_command_port *port = output;
@@ -502,13 +510,16 @@ decode_port_rxtx_value(void *output, const char *arg_val)
return SPP_RET_NG;
}
- if ((port->action == SPP_CMD_ACTION_ADD) &&
- (spp_check_used_port(port->port.iface_type,
+ /* add vlantag command check */
+ if (allow_override == 0) {
+ if ((port->action == SPP_CMD_ACTION_ADD) &&
+ (spp_check_used_port(port->port.iface_type,
port->port.iface_no, ret) >= 0)) {
- RTE_LOG(ERR, SPP_COMMAND_PROC,
+ RTE_LOG(ERR, SPP_COMMAND_PROC,
"Port in used. (port command) val=%s\n",
arg_val);
- return SPP_RET_NG;
+ return SPP_RET_NG;
+ }
}
port->rxtx = ret;
@@ -517,7 +528,8 @@ decode_port_rxtx_value(void *output, const char *arg_val)
/* decoding procedure of component name for port command */
static int
-decode_port_name_value(void *output, const char *arg_val)
+decode_port_name_value(void *output, const char *arg_val,
+ int allow_override __attribute__ ((unused)))
{
int ret = SPP_RET_OK;
@@ -531,9 +543,10 @@ decode_port_name_value(void *output, const char *arg_val)
return decode_str_value(output, arg_val);
}
-/* decoding procedure of port ability for port command */
+/* decoding procedure of vlan operation for port command */
static int
-decode_port_ability_value(void *output, const char *arg_val)
+decode_port_vlan_operation(void *output, const char *arg_val,
+ int allow_override __attribute__ ((unused)))
{
int ret = SPP_RET_OK;
struct spp_command_port *port = output;
@@ -552,29 +565,62 @@ decode_port_ability_value(void *output, const char *arg_val)
ability->rxtx = port->rxtx;
break;
case SPP_PORT_ABILITY_OPE_ADD_VLANTAG:
- if (ability->data.vlantag.pcp == 0) {
- ret = get_int_value(&ability->data.vlantag.vid,
- arg_val, 0, ETH_VLAN_ID_MAX);
- if (unlikely(ret < 0)) {
- RTE_LOG(ERR, SPP_COMMAND_PROC,
- "Bad VLAN ID. val=%s\n",
- arg_val);
- return SPP_RET_NG;
- }
- ability->data.vlantag.pcp = -1;
- } else {
- ret = get_int_value(&ability->data.vlantag.pcp,
- arg_val, 0, SPP_VLAN_PCP_MAX);
- if (unlikely(ret < 0)) {
- RTE_LOG(ERR, SPP_COMMAND_PROC,
- "Bad VLAN PCP. val=%s\n",
- arg_val);
- return SPP_RET_NG;
- }
+ /* Nothing to do. */
+ break;
+ default:
+ /* Not used. */
+ break;
+ }
+
+ return SPP_RET_OK;
+}
+
+/* decoding procedure of vid for port command */
+static int
+decode_port_vid(void *output, const char *arg_val,
+ int allow_override __attribute__ ((unused)))
+{
+ int ret = SPP_RET_OK;
+ struct spp_command_port *port = output;
+ struct spp_port_ability *ability = &port->ability;
+
+ switch (ability->ope) {
+ case SPP_PORT_ABILITY_OPE_ADD_VLANTAG:
+ ret = get_int_value(&ability->data.vlantag.vid,
+ arg_val, 0, ETH_VLAN_ID_MAX);
+ if (unlikely(ret < SPP_RET_OK)) {
+ RTE_LOG(ERR, SPP_COMMAND_PROC,
+ "Bad VLAN ID. val=%s\n", arg_val);
+ return SPP_RET_NG;
}
+ ability->data.vlantag.pcp = -1;
break;
- case SPP_PORT_ABILITY_OPE_DEL_VLANTAG:
- /* Nothing to do. */
+ default:
+ /* Not used. */
+ break;
+ }
+
+ return SPP_RET_OK;
+}
+
+/* decoding procedure of pcp for port command */
+static int
+decode_port_pcp(void *output, const char *arg_val,
+ int allow_override __attribute__ ((unused)))
+{
+ int ret = SPP_RET_OK;
+ struct spp_command_port *port = output;
+ struct spp_port_ability *ability = &port->ability;
+
+ switch (ability->ope) {
+ case SPP_PORT_ABILITY_OPE_ADD_VLANTAG:
+ ret = get_int_value(&ability->data.vlantag.pcp,
+ arg_val, 0, SPP_VLAN_PCP_MAX);
+ if (unlikely(ret < SPP_RET_OK)) {
+ RTE_LOG(ERR, SPP_COMMAND_PROC,
+ "Bad VLAN PCP. val=%s\n", arg_val);
+ return SPP_RET_NG;
+ }
break;
default:
/* Not used. */
@@ -586,7 +632,8 @@ decode_port_ability_value(void *output, const char *arg_val)
/* decoding procedure of mac address string */
static int
-decode_mac_addr_str_value(void *output, const char *arg_val)
+decode_mac_addr_str_value(void *output, const char *arg_val,
+ int allow_override __attribute__ ((unused)))
{
int64_t ret = SPP_RET_OK;
const char *str_val = arg_val;
@@ -608,7 +655,8 @@ decode_mac_addr_str_value(void *output, const char *arg_val)
/* decoding procedure of action for classifier_table command */
static int
-decode_classifier_action_value(void *output, const char *arg_val)
+decode_classifier_action_value(void *output, const char *arg_val,
+ int allow_override __attribute__ ((unused)))
{
int ret = SPP_RET_OK;
ret = get_arrary_index(arg_val, COMMAND_ACTION_STRINGS);
@@ -631,7 +679,8 @@ decode_classifier_action_value(void *output, const char *arg_val)
/* decoding procedure of type for classifier_table command */
static int
-decode_classifier_type_value(void *output, const char *arg_val)
+decode_classifier_type_value(void *output, const char *arg_val,
+ int allow_override __attribute__ ((unused)))
{
int ret = SPP_RET_OK;
ret = get_arrary_index(arg_val, CLASSIFILER_TYPE_STRINGS);
@@ -648,7 +697,8 @@ decode_classifier_type_value(void *output, const char *arg_val)
/* decoding procedure of vlan id for classifier_table command */
static int
-decode_classifier_vid_value(void *output, const char *arg_val)
+decode_classifier_vid_value(void *output, const char *arg_val,
+ int allow_override __attribute__ ((unused)))
{
int ret = SPP_RET_NG;
ret = get_int_value(output, arg_val, 0, ETH_VLAN_ID_MAX);
@@ -662,7 +712,8 @@ decode_classifier_vid_value(void *output, const char *arg_val)
/* decoding procedure of port for classifier_table command */
static int
-decode_classifier_port_value(void *output, const char *arg_val)
+decode_classifier_port_value(void *output, const char *arg_val,
+ int allow_override __attribute__ ((unused)))
{
int ret = SPP_RET_OK;
struct spp_command_classifier_table *classifier_table = output;
@@ -717,7 +768,7 @@ decode_classifier_port_value(void *output, const char *arg_val)
struct decode_parameter_list {
const char *name; /* Parameter name */
size_t offset; /* Offset value of struct spp_command */
- int (*func)(void *output, const char *arg_val);
+ int (*func)(void *output, const char *arg_val, int allow_override);
/* Pointer to parameter handling function */
};
@@ -834,30 +885,31 @@ parameter_list[][SPP_CMD_MAX_PARAMETERS] = {
.func = decode_port_name_value
},
{
- .name = "port ability 1",
+ .name = "port vlan operation",
.offset = offsetof(struct spp_command, spec.port),
- .func = decode_port_ability_value
+ .func = decode_port_vlan_operation
},
{
- .name = "port ability 2",
+ .name = "port vid",
.offset = offsetof(struct spp_command, spec.port),
- .func = decode_port_ability_value
+ .func = decode_port_vid
},
{
- .name = "port ability 3",
+ .name = "port pcp",
.offset = offsetof(struct spp_command, spec.port),
- .func = decode_port_ability_value
+ .func = decode_port_pcp
},
DECODE_PARAMETER_LIST_EMPTY,
},
{ DECODE_PARAMETER_LIST_EMPTY }, /* termination */
};
-/* check by list for each command line parameter */
+/* check by list for each command line parameter component */
static int
-decode_command_parameter_in_list(struct spp_command_request *request,
+decode_command_parameter_component(struct spp_command_request *request,
int argc, char *argv[],
- struct spp_command_decode_error *error)
+ struct spp_command_decode_error *error,
+ int maxargc __attribute__ ((unused)))
{
int ret = SPP_RET_OK;
int ci = request->commands[0].type;
@@ -867,7 +919,7 @@ decode_command_parameter_in_list(struct spp_command_request *request,
list = ¶meter_list[ci][pi-1];
ret = (*list->func)((void *)
((char *)&request->commands[0]+list->offset),
- argv[pi]);
+ argv[pi], 0);
if (unlikely(ret < 0)) {
RTE_LOG(ERR, SPP_COMMAND_PROC,
"Bad value. command=%s, name=%s, "
@@ -880,31 +932,105 @@ decode_command_parameter_in_list(struct spp_command_request *request,
return SPP_RET_OK;
}
+/* check by list for each command line parameter clssfier_table */
+static int
+decode_command_parameter_cls_table(struct spp_command_request *request,
+ int argc, char *argv[],
+ struct spp_command_decode_error *error,
+ int maxargc)
+{
+ return decode_command_parameter_component(request,
+ argc,
+ argv,
+ error,
+ maxargc);
+}
+/* check by list for each command line parameter clssfier_table(vlan) */
+static int
+decode_command_parameter_cls_table_vlan(struct spp_command_request *request,
+ int argc, char *argv[],
+ struct spp_command_decode_error *error,
+ int maxargc __attribute__ ((unused)))
+{
+ int ret = SPP_RET_OK;
+ int ci = request->commands[0].type;
+ int pi = 0;
+ struct decode_parameter_list *list = NULL;
+ for (pi = 1; pi < argc; pi++) {
+ list = ¶meter_list[ci][pi-1];
+ ret = (*list->func)((void *)
+ ((char *)&request->commands[0]+list->offset),
+ argv[pi], 0);
+ if (unlikely(ret < SPP_RET_OK)) {
+ RTE_LOG(ERR, SPP_COMMAND_PROC, "Bad value. "
+ "command=%s, name=%s, index=%d, value=%s\n",
+ argv[0], list->name, pi, argv[pi]);
+ return set_string_value_decode_error(error, argv[pi],
+ list->name);
+ }
+ }
+ return SPP_RET_OK;
+}
+
+/* check by list for each command line parameter port */
+static int
+decode_command_parameter_port(struct spp_command_request *request,
+ int argc, char *argv[],
+ struct spp_command_decode_error *error,
+ int maxargc)
+{
+ int ret = SPP_RET_OK;
+ int ci = request->commands[0].type;
+ int pi = 0;
+ struct decode_parameter_list *list = NULL;
+ int flag = 0;
+
+ /* check add vlatag */
+ if (argc == maxargc)
+ flag = 1;
+
+ for (pi = 1; pi < argc; pi++) {
+ list = ¶meter_list[ci][pi-1];
+ ret = (*list->func)((void *)
+ ((char *)&request->commands[0]+list->offset),
+ argv[pi], flag);
+ if (unlikely(ret < SPP_RET_OK)) {
+ RTE_LOG(ERR, SPP_COMMAND_PROC, "Bad value. "
+ "command=%s, name=%s, index=%d, value=%s\n",
+ argv[0], list->name, pi, argv[pi]);
+ return set_string_value_decode_error(error, argv[pi],
+ list->name);
+ }
+ }
+ return SPP_RET_OK;
+}
+
/* command list for decoding */
struct decode_command_list {
const char *name; /* Command name */
int param_min; /* Min number of parameters */
int param_max; /* Max number of parameters */
int (*func)(struct spp_command_request *request, int argc,
- char *argv[], struct spp_command_decode_error *error);
+ char *argv[], struct spp_command_decode_error *error,
+ int maxargc);
/* Pointer to command handling function */
};
/* command list */
static struct decode_command_list command_list[] = {
{ SPP_COMMAND_CLASSFIER_TABLE_STR, 5, 5,
- decode_command_parameter_in_list },
- /* classifier_table(mac) */
+ decode_command_parameter_cls_table },
+ /* classifier_table(mac) */
{ SPP_COMMAND_CLASSFIER_TABLE_STR, 6, 6,
- decode_command_parameter_in_list },
+ decode_command_parameter_cls_table_vlan },
/* classifier_table(vlan) */
{ SPP_COMMAND_GET_CLIENT_ID_STR, 1, 1, NULL }, /* _get_client_id */
- { SPP_COMMAND_STATUS_STR, 1, 1, NULL }, /* status */
- { SPP_COMMAND_EXIT_STR, 1, 1, NULL }, /* exit */
+ { SPP_COMMAND_STATUS_STR, 1, 1, NULL }, /* status */
+ { SPP_COMMAND_EXIT_STR, 1, 1, NULL }, /* exit */
{ SPP_COMMAND_COMPONENT_STR, 3, 5,
- decode_command_parameter_in_list }, /* component */
+ decode_command_parameter_component }, /* component */
{ SPP_COMMAND_PORT_STR, 5, 8,
- decode_command_parameter_in_list }, /* port */
+ decode_command_parameter_port }, /* port */
{ "", 0, 0, NULL } /* termination */
};
@@ -947,7 +1073,8 @@ decode_command_in_list(struct spp_command_request *request,
request->commands[0].type = i;
if (list->func != NULL)
- return (*list->func)(request, argc, argv, error);
+ return (*list->func)(request, argc, argv, error,
+ list->param_max);
return SPP_RET_OK;
}
--
2.18.0
next prev parent reply other threads:[~2018-11-21 1:41 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20181121013558.8869-1-x-fn-spp@sl.ntt-tx.co.jp>
2018-11-21 1:35 ` [spp] [PATCH 01/23] spp_vf: fix invalid code for max chars x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 02/23] spp_vf: move common source and header files x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 03/23] spp_vf: change include path x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 04/23] spp_vf: update Makefile for common files x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 05/23] spp_vf: move functions to common directory x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 06/23] spp_vf: move defines to common dir x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 07/23] spp_vf: move functions for decode " x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 08/23] spp_vf: move defines " x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 09/23] spp_vf: move functions to command_proc.c x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 10/23] spp_vf: add management data registration x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 11/23] spp_vf: change reference of management data x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 12/23] spp_vf: change return values to explain result x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 13/23] spp_vf: define terms of commands as consts x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 14/23] spp_vf: remove unnecessary includes x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 15/23] spp_vf: add include header files x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 16/23] spp_vf: update comments for header file x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 17/23] spp_vf: update makefile of spp_vf x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 18/23] spp_vf: add check num of ports before forwarding x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 19/23] spp_vf: add flag for classifier table x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 20/23] spp_vf: add checking the number of ports x-fn-spp
2018-11-21 1:35 ` x-fn-spp [this message]
2018-11-21 1:35 ` [spp] [PATCH 22/23] spp_vf: simplify changing VLAN tag x-fn-spp
2018-11-21 1:35 ` [spp] [PATCH 23/23] spp_vf: add SPP_VF_MODULE preprocessor directive 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=201811210136.wAL1a1be009709@imss03.silk.ntt-tx.co.jp \
--to=x-fn-spp@sl.ntt-tx.co.jp \
--cc=ferruh.yigit@intel.com \
--cc=ogawa.yasufumi@lab.ntt.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).