Soft Patch Panel
 help / color / mirror / Atom feed
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 = &parameter_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 = &parameter_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 = &parameter_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

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