[dpdk-dev] [PATCH 39/40] examples/pipeline: add l2fwd with MAC swap example

Cristian Dumitrescu cristian.dumitrescu at intel.com
Wed Aug 26 17:14:44 CEST 2020


Add L2 Forwarding example with MAC destination and source address swap
to the pipeline application. Example command line:
./build/pipeline -l0-1 -- -s ./examples/l2fwd_macswp.cli

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu at intel.com>
---
 examples/pipeline/Makefile                    |   2 +
 examples/pipeline/cli.c                       |   4 +
 examples/pipeline/example_l2fwd_macswp.c      | 146 ++++++++++++++++++
 examples/pipeline/examples/l2fwd_macswp.cli   |  25 +++
 .../pipeline/examples/l2fwd_macswp_pcap.cli   |  20 +++
 examples/pipeline/meson.build                 |   1 +
 6 files changed, 198 insertions(+)
 create mode 100644 examples/pipeline/example_l2fwd_macswp.c
 create mode 100644 examples/pipeline/examples/l2fwd_macswp.cli
 create mode 100644 examples/pipeline/examples/l2fwd_macswp_pcap.cli

diff --git a/examples/pipeline/Makefile b/examples/pipeline/Makefile
index 405978ced..df5176296 100644
--- a/examples/pipeline/Makefile
+++ b/examples/pipeline/Makefile
@@ -11,6 +11,8 @@ SRCS-y += main.c
 SRCS-y += obj.c
 SRCS-y += thread.c
 SRCS-y += example_l2fwd.c
+SRCS-y += example_l2fwd_macswp.c
+
 
 # Build using pkg-config variables if possible
 ifeq ($(shell pkg-config --exists libdpdk && echo 0),0)
diff --git a/examples/pipeline/cli.c b/examples/pipeline/cli.c
index a54cd79ff..9547e1b4c 100644
--- a/examples/pipeline/cli.c
+++ b/examples/pipeline/cli.c
@@ -731,6 +731,8 @@ static const char cmd_pipeline_build_help[] =
 "pipeline <pipeline_name> build <app>\n";
 
 int pipeline_setup_l2fwd(struct rte_swx_pipeline *p);
+int pipeline_setup_l2fwd_macswp(struct rte_swx_pipeline *p);
+
 static void
 cmd_pipeline_build(char **tokens,
 	uint32_t n_tokens,
@@ -757,6 +759,8 @@ cmd_pipeline_build(char **tokens,
 	app = tokens[3];
 	if (!strcmp(app, "l2fwd"))
 		status = pipeline_setup_l2fwd(p->p);
+	else if (!strcmp(app, "l2fwd_macswp"))
+		status = pipeline_setup_l2fwd_macswp(p->p);
 	else {
 		snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
 		return;
diff --git a/examples/pipeline/example_l2fwd_macswp.c b/examples/pipeline/example_l2fwd_macswp.c
new file mode 100644
index 000000000..7922a75aa
--- /dev/null
+++ b/examples/pipeline/example_l2fwd_macswp.c
@@ -0,0 +1,146 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2020 Intel Corporation
+ */
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <rte_common.h>
+
+#include "rte_swx_pipeline.h"
+#include "rte_swx_port_ethdev.h"
+#include "rte_swx_port_source_sink.h"
+#include "rte_swx_table_em.h"
+
+#define CHECK(condition)                                                       \
+do {                                                                           \
+	if (!(condition)) {                                                    \
+		printf("Error in function %s at line %d\n",                    \
+			__FUNCTION__, __LINE__);                               \
+		return -1;                                                     \
+	}                                                                      \
+} while (0)
+
+/*
+ * Packet headers.
+ */
+static struct rte_swx_field_params ethernet_type[] = {
+	{"dst_addr", 48},
+	{"src_addr", 48},
+	{"ether_type", 16},
+};
+
+/*
+ * Packet meta-data.
+ */
+static struct rte_swx_field_params metadata_type[] = {
+	{"port", 32},
+	{"addr", 48},
+};
+
+/*
+ * Actions.
+ */
+static const char *action_macswp_instructions[] = {
+	"mov m.addr h.ethernet.dst_addr",
+	"mov h.ethernet.dst_addr h.ethernet.src_addr",
+	"mov h.ethernet.src_addr m.addr",
+	"return",
+};
+
+/*
+ * Tables.
+ */
+static const char *table_stub_actions[] = {"macswp"};
+
+static struct rte_swx_pipeline_table_params table_stub_params = {
+	/* Match. */
+	.fields = NULL,
+	.n_fields = 0,
+
+	/* Action. */
+	.action_names = table_stub_actions,
+	.n_actions = RTE_DIM(table_stub_actions),
+	.default_action_name = "macswp",
+	.default_action_data = NULL,
+	.default_action_is_const = 0,
+};
+
+/*
+ * Pipeline.
+ */
+static const char *pipeline_instructions[] = {
+	"rx m.port",
+	"extract h.ethernet",
+	"table stub",
+	"xor m.port 1",
+	"emit h.ethernet",
+	"tx m.port",
+};
+
+int
+pipeline_setup_l2fwd_macswp(struct rte_swx_pipeline *p);
+
+int
+pipeline_setup_l2fwd_macswp(struct rte_swx_pipeline *p)
+{
+	int err;
+
+	/*
+	 * Packet headers.
+	 */
+	err = rte_swx_pipeline_struct_type_register(p,
+		"ethernet_type",
+		ethernet_type,
+		RTE_DIM(ethernet_type));
+	CHECK(!err);
+
+	err = rte_swx_pipeline_packet_header_register(p,
+		"ethernet",
+		"ethernet_type");
+	CHECK(!err);
+
+	/*
+	 * Packet meta-data.
+	 */
+	err = rte_swx_pipeline_struct_type_register(p,
+		"metadata_type",
+		metadata_type,
+		RTE_DIM(metadata_type));
+	CHECK(!err);
+
+	err = rte_swx_pipeline_packet_metadata_register(p,
+		"metadata_type");
+	CHECK(!err);
+
+	/*
+	 * Actions.
+	 */
+	err = rte_swx_pipeline_action_config(p,
+		"macswp",
+		NULL,
+		action_macswp_instructions,
+		RTE_DIM(action_macswp_instructions));
+	CHECK(!err);
+
+	/*
+	 * Tables.
+	 */
+	err = rte_swx_pipeline_table_config(p,
+		"stub",
+		&table_stub_params,
+		NULL,
+		NULL,
+		0);
+	CHECK(!err);
+
+	/*
+	 * Pipeline.
+	 */
+	err = rte_swx_pipeline_instructions_config(p,
+		pipeline_instructions,
+		RTE_DIM(pipeline_instructions));
+	CHECK(!err);
+
+	return 0;
+}
diff --git a/examples/pipeline/examples/l2fwd_macswp.cli b/examples/pipeline/examples/l2fwd_macswp.cli
new file mode 100644
index 000000000..c5eb23d18
--- /dev/null
+++ b/examples/pipeline/examples/l2fwd_macswp.cli
@@ -0,0 +1,25 @@
+; SPDX-License-Identifier: BSD-3-Clause
+; Copyright(c) 2010-2020 Intel Corporation
+
+mempool MEMPOOL0 buffer 2304 pool 32K cache 256 cpu 0
+
+link LINK0 dev 0000:18:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
+link LINK1 dev 0000:18:00.1 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
+link LINK2 dev 0000:3b:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
+link LINK3 dev 0000:3b:00.1 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
+
+pipeline PIPELINE0 create 0
+
+pipeline PIPELINE0 port in 0 link LINK0 rxq 0 bsz 32
+pipeline PIPELINE0 port in 1 link LINK1 rxq 0 bsz 32
+pipeline PIPELINE0 port in 2 link LINK2 rxq 0 bsz 32
+pipeline PIPELINE0 port in 3 link LINK3 rxq 0 bsz 32
+
+pipeline PIPELINE0 port out 0 link LINK0 txq 0 bsz 32
+pipeline PIPELINE0 port out 1 link LINK1 txq 0 bsz 32
+pipeline PIPELINE0 port out 2 link LINK2 txq 0 bsz 32
+pipeline PIPELINE0 port out 3 link LINK3 txq 0 bsz 32
+
+pipeline PIPELINE0 build l2fwd_macswp
+
+thread 1 pipeline PIPELINE0 enable
diff --git a/examples/pipeline/examples/l2fwd_macswp_pcap.cli b/examples/pipeline/examples/l2fwd_macswp_pcap.cli
new file mode 100644
index 000000000..76c3071e3
--- /dev/null
+++ b/examples/pipeline/examples/l2fwd_macswp_pcap.cli
@@ -0,0 +1,20 @@
+; SPDX-License-Identifier: BSD-3-Clause
+; Copyright(c) 2010-2020 Intel Corporation
+
+mempool MEMPOOL0 buffer 2304 pool 32K cache 256 cpu 0
+
+pipeline PIPELINE0 create 0
+
+pipeline PIPELINE0 port in 0 source MEMPOOL0 ./examples/packet.pcap
+pipeline PIPELINE0 port in 1 source MEMPOOL0 ./examples/packet.pcap
+pipeline PIPELINE0 port in 2 source MEMPOOL0 ./examples/packet.pcap
+pipeline PIPELINE0 port in 3 source MEMPOOL0 ./examples/packet.pcap
+
+pipeline PIPELINE0 port out 0 sink none
+pipeline PIPELINE0 port out 1 sink none
+pipeline PIPELINE0 port out 2 sink none
+pipeline PIPELINE0 port out 3 sink none
+
+pipeline PIPELINE0 build l2fwd_macswp
+
+thread 1 pipeline PIPELINE0 enable
diff --git a/examples/pipeline/meson.build b/examples/pipeline/meson.build
index b16de3714..b13f04e01 100644
--- a/examples/pipeline/meson.build
+++ b/examples/pipeline/meson.build
@@ -16,4 +16,5 @@ sources = files(
 	'obj.c',
 	'thread.c',
 	'example_l2fwd.c',
+	'example_l2fwd_macswp.c',
 )
-- 
2.17.1



More information about the dev mailing list