aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-dpdk
diff options
context:
space:
mode:
authorMatias Elo <matias.elo@nokia.com>2021-07-08 09:07:13 +0300
committerGitHub <noreply@github.com>2021-07-08 09:07:13 +0300
commit6c7ac017886e2f1f63a27871254326d7cd1b48d1 (patch)
treea89fd543bacd9483642ebc27517ff59577ba55ad /platform/linux-dpdk
parent3a7a24023021f5959dd2f00fe83cf2635bf25c2d (diff)
parent75b2e7ed219c2f087b7068c4e8b708d475c9026a (diff)
Merge ODP v1.30.0.0v1.30.0.0_DPDK_19.11
Merge ODP linux-generic v1.30.0.0 into ODP-DPDK.
Diffstat (limited to 'platform/linux-dpdk')
-rw-r--r--platform/linux-dpdk/Makefile.am2
-rw-r--r--platform/linux-dpdk/include/odp/api/plat/time_inlines.h55
-rw-r--r--platform/linux-dpdk/include/odp_packet_io_internal.h7
-rw-r--r--platform/linux-dpdk/m4/configure.m42
-rw-r--r--platform/linux-dpdk/m4/odp_libconfig.m42
-rw-r--r--platform/linux-dpdk/odp_packet.c1
-rw-r--r--platform/linux-dpdk/odp_pool.c2
-rw-r--r--platform/linux-dpdk/odp_queue_basic.c4
-rw-r--r--platform/linux-dpdk/odp_queue_eventdev.c4
-rw-r--r--platform/linux-dpdk/odp_system_info.c2
-rw-r--r--platform/linux-dpdk/odp_time.c14
-rw-r--r--platform/linux-dpdk/odp_timer.c14
-rw-r--r--platform/linux-dpdk/test/Makefile.am31
-rw-r--r--platform/linux-dpdk/test/example/Makefile.am2
-rw-r--r--platform/linux-dpdk/test/example/ipsec_api/Makefile.am23
-rw-r--r--platform/linux-dpdk/test/example/ipsec_api/pktio_env66
-rw-r--r--platform/linux-dpdk/test/example/ipsec_crypto/Makefile.am23
-rw-r--r--platform/linux-dpdk/test/example/ipsec_crypto/pktio_env72
-rw-r--r--platform/linux-dpdk/test/sched-basic.conf2
19 files changed, 283 insertions, 45 deletions
diff --git a/platform/linux-dpdk/Makefile.am b/platform/linux-dpdk/Makefile.am
index 6967be8cf..8cdb84b15 100644
--- a/platform/linux-dpdk/Makefile.am
+++ b/platform/linux-dpdk/Makefile.am
@@ -259,7 +259,7 @@ __LIB__libodp_dpdk_la_SOURCES += arch/aarch64/odp_atomic.c \
arch/default/odp_hash_crc32.c \
arch/aarch64/odp_sysinfo_parse.c
odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/cpu_inlines.h \
- arch/default/odp/api/abi/cpu_time.h \
+ arch/aarch64/odp/api/abi/cpu_time.h \
arch/aarch64/odp/api/abi/hash_crc32.h
if !ODP_ABI_COMPAT
odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/atomic_generic.h \
diff --git a/platform/linux-dpdk/include/odp/api/plat/time_inlines.h b/platform/linux-dpdk/include/odp/api/plat/time_inlines.h
index 5032b0fcb..c007c5ce9 100644
--- a/platform/linux-dpdk/include/odp/api/plat/time_inlines.h
+++ b/platform/linux-dpdk/include/odp/api/plat/time_inlines.h
@@ -1,5 +1,5 @@
/* Copyright (c) 2018, Linaro Limited
- * Copyright (c) 2020, Nokia
+ * Copyright (c) 2020-2021, Nokia
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
@@ -21,11 +21,13 @@
#define _ODP_TIME_GIGA_HZ 1000000000ULL
typedef odp_time_t (*time_cur_fn)(void);
+typedef odp_time_t (*time_cur_strict_fn)(void);
typedef uint64_t (*time_res_fn)(void);
typedef struct time_handler_ {
- time_cur_fn time_cur;
- time_res_fn time_res;
+ time_cur_fn time_cur;
+ time_cur_strict_fn time_cur_strict;
+ time_res_fn time_res;
} time_handler_t;
@@ -58,11 +60,28 @@ static inline odp_time_t _odp_time_cur_gen(void)
return _odp_timespec_cur();
}
+static inline odp_time_t _odp_time_cur_gen_strict(void)
+{
+ if (_odp_time_glob.use_hw) {
+ odp_time_t time;
+
+ time.count = _odp_cpu_global_time_strict() - _odp_time_glob.hw_start;
+ return time;
+ }
+
+ return _odp_timespec_cur();
+}
+
static inline odp_time_t _odp_time_cur(void)
{
return _odp_time_glob.handler.time_cur();
}
+static inline odp_time_t _odp_time_cur_strict(void)
+{
+ return _odp_time_glob.handler.time_cur_strict();
+}
+
static inline uint64_t _odp_time_hw_to_ns(odp_time_t time)
{
uint64_t nsec;
@@ -96,6 +115,12 @@ static inline uint64_t _odp_time_convert_to_ns(odp_time_t time)
#define odp_time_to_ns __odp_time_to_ns
#define odp_time_local_ns __odp_time_local_ns
#define odp_time_global_ns __odp_time_global_ns
+
+ #define odp_time_local_strict __odp_time_local_strict
+ #define odp_time_global_strict __odp_time_global_strict
+ #define odp_time_local_strict_ns __odp_time_local_strict_ns
+ #define odp_time_global_strict_ns __odp_time_global_strict_ns
+
#define odp_time_cmp __odp_time_cmp
#define odp_time_diff __odp_time_diff
#define odp_time_sum __odp_time_sum
@@ -114,9 +139,14 @@ _ODP_INLINE odp_time_t odp_time_global(void)
return _odp_time_cur();
}
-_ODP_INLINE uint64_t odp_time_to_ns(odp_time_t time)
+_ODP_INLINE odp_time_t odp_time_local_strict(void)
{
- return _odp_time_convert_to_ns(time);
+ return _odp_time_cur_strict();
+}
+
+_ODP_INLINE odp_time_t odp_time_global_strict(void)
+{
+ return _odp_time_cur_strict();
}
_ODP_INLINE uint64_t odp_time_local_ns(void)
@@ -129,6 +159,21 @@ _ODP_INLINE uint64_t odp_time_global_ns(void)
return _odp_time_convert_to_ns(_odp_time_cur());
}
+_ODP_INLINE uint64_t odp_time_local_strict_ns(void)
+{
+ return _odp_time_convert_to_ns(_odp_time_cur_strict());
+}
+
+_ODP_INLINE uint64_t odp_time_global_strict_ns(void)
+{
+ return _odp_time_convert_to_ns(_odp_time_cur_strict());
+}
+
+_ODP_INLINE uint64_t odp_time_to_ns(odp_time_t time)
+{
+ return _odp_time_convert_to_ns(time);
+}
+
_ODP_INLINE int odp_time_cmp(odp_time_t t2, odp_time_t t1)
{
if (odp_likely(t2.u64 > t1.u64))
diff --git a/platform/linux-dpdk/include/odp_packet_io_internal.h b/platform/linux-dpdk/include/odp_packet_io_internal.h
index e52eb9840..0d2782101 100644
--- a/platform/linux-dpdk/include/odp_packet_io_internal.h
+++ b/platform/linux-dpdk/include/odp_packet_io_internal.h
@@ -32,6 +32,7 @@ extern "C" {
#include <linux/if_ether.h>
#include <sys/select.h>
+#include <inttypes.h>
#define PKTIO_MAX_QUEUES 64
#define PKTIO_LSO_PROFILES 16
@@ -218,7 +219,7 @@ static inline pktio_entry_t *get_pktio_entry(odp_pktio_t pktio)
return NULL;
if (odp_unlikely(_odp_typeval(pktio) > ODP_CONFIG_PKTIO_ENTRIES)) {
- ODP_DBG("pktio limit %d/%d exceed\n",
+ ODP_DBG("pktio limit %" PRIuPTR "/%d exceed\n",
_odp_typeval(pktio), ODP_CONFIG_PKTIO_ENTRIES);
return NULL;
}
@@ -274,6 +275,10 @@ _odp_sock_recv_mq_tmo_try_int_driven(const struct odp_pktin_queue_t queues[],
return 0;
}
+/* Setup PKTOUT with single queue for TM */
+int _odp_pktio_pktout_tm_config(odp_pktio_t pktio_hdl,
+ odp_pktout_queue_t *queue, bool reconf);
+
#ifdef __cplusplus
}
#endif
diff --git a/platform/linux-dpdk/m4/configure.m4 b/platform/linux-dpdk/m4/configure.m4
index 3d50f2edc..1e6e8306c 100644
--- a/platform/linux-dpdk/m4/configure.m4
+++ b/platform/linux-dpdk/m4/configure.m4
@@ -83,6 +83,8 @@ AC_CONFIG_FILES([platform/linux-dpdk/Makefile
platform/linux-dpdk/test/example/Makefile
platform/linux-dpdk/test/example/classifier/Makefile
platform/linux-dpdk/test/example/generator/Makefile
+ platform/linux-dpdk/test/example/ipsec_api/Makefile
+ platform/linux-dpdk/test/example/ipsec_crypto/Makefile
platform/linux-dpdk/test/example/l2fwd_simple/Makefile
platform/linux-dpdk/test/example/l3fwd/Makefile
platform/linux-dpdk/test/example/packet/Makefile
diff --git a/platform/linux-dpdk/m4/odp_libconfig.m4 b/platform/linux-dpdk/m4/odp_libconfig.m4
index f56946ec5..f2aa36946 100644
--- a/platform/linux-dpdk/m4/odp_libconfig.m4
+++ b/platform/linux-dpdk/m4/odp_libconfig.m4
@@ -3,7 +3,7 @@
##########################################################################
m4_define([_odp_config_version_generation], [0])
m4_define([_odp_config_version_major], [1])
-m4_define([_odp_config_version_minor], [11])
+m4_define([_odp_config_version_minor], [12])
m4_define([_odp_config_version],
[_odp_config_version_generation._odp_config_version_major._odp_config_version_minor])
diff --git a/platform/linux-dpdk/odp_packet.c b/platform/linux-dpdk/odp_packet.c
index 8030728dd..b0225629d 100644
--- a/platform/linux-dpdk/odp_packet.c
+++ b/platform/linux-dpdk/odp_packet.c
@@ -400,6 +400,7 @@ int odp_packet_trunc_head(odp_packet_t *pkt, uint32_t len, void **data_ptr,
_copy_head_metadata(newhead, mb);
prev->next = NULL;
rte_pktmbuf_free(mb);
+ mb = newhead;
*pkt = (odp_packet_t)newhead;
packet_hdr(*pkt)->buf_hdr.totsize -= totsize_change;
} else {
diff --git a/platform/linux-dpdk/odp_pool.c b/platform/linux-dpdk/odp_pool.c
index 24c9c2aec..3ac6abd03 100644
--- a/platform/linux-dpdk/odp_pool.c
+++ b/platform/linux-dpdk/odp_pool.c
@@ -679,7 +679,7 @@ odp_pool_t odp_pool_create(const char *name, const odp_pool_param_t *params)
event_type = ODP_EVENT_PACKET;
ODP_DBG("type: packet, name: %s, num: %u, len: %u, blk_size: %u, "
- "uarea_size: %d, hdr_size: %d\n", pool_name, num, params->pkt.len,
+ "uarea_size: %d, hdr_size: %zu\n", pool_name, num, params->pkt.len,
blk_size, params->pkt.uarea_size, hdr_size);
break;
case ODP_POOL_TIMEOUT:
diff --git a/platform/linux-dpdk/odp_queue_basic.c b/platform/linux-dpdk/odp_queue_basic.c
index 4a4388b2b..7145fb2ce 100644
--- a/platform/linux-dpdk/odp_queue_basic.c
+++ b/platform/linux-dpdk/odp_queue_basic.c
@@ -166,7 +166,7 @@ static int queue_init_global(void)
queue_capa(&capa, 0);
ODP_DBG("... done.\n");
- ODP_DBG(" queue_entry_t size %u\n", sizeof(queue_entry_t));
+ ODP_DBG(" queue_entry_t size %zu\n", sizeof(queue_entry_t));
ODP_DBG(" max num queues %u\n", capa.max_queues);
ODP_DBG(" max queue size %u\n", capa.plain.max_size);
ODP_DBG(" max num lockfree %u\n", capa.plain.lockfree.max_num);
@@ -697,7 +697,7 @@ static void queue_print(odp_queue_t handle)
if (!odp_pktio_info(queue->s.pktout.pktio, &pktio_info))
ODP_PRINT(" pktout %s\n", pktio_info.name);
}
- ODP_PRINT(" timers %" PRIu32 "\n",
+ ODP_PRINT(" timers %" PRIu64 "\n",
odp_atomic_load_u64(&queue->s.num_timers));
ODP_PRINT(" status %s\n",
queue->s.status == QUEUE_STATUS_READY ? "ready" :
diff --git a/platform/linux-dpdk/odp_queue_eventdev.c b/platform/linux-dpdk/odp_queue_eventdev.c
index 5233031f6..96baffa6f 100644
--- a/platform/linux-dpdk/odp_queue_eventdev.c
+++ b/platform/linux-dpdk/odp_queue_eventdev.c
@@ -558,7 +558,7 @@ static int queue_init_global(void)
queue_capa(&capa, 0);
- ODP_DBG(" queue_entry_t size %u\n", sizeof(queue_entry_t));
+ ODP_DBG(" queue_entry_t size %zu\n", sizeof(queue_entry_t));
ODP_DBG(" max num queues %u\n", capa.max_queues);
ODP_DBG(" max plain queue size %u\n", capa.plain.max_size);
ODP_DBG(" max num lockfree %u\n", capa.plain.lockfree.max_num);
@@ -1048,7 +1048,7 @@ static void queue_print(odp_queue_t handle)
if (!odp_pktio_info(queue->s.pktout.pktio, &pktio_info))
ODP_PRINT(" pktout %s\n", pktio_info.name);
}
- ODP_PRINT(" timers %" PRIu32 "\n",
+ ODP_PRINT(" timers %" PRIu64 "\n",
odp_atomic_load_u64(&queue->s.num_timers));
ODP_PRINT(" status %s\n",
queue->s.status == QUEUE_STATUS_READY ? "ready" :
diff --git a/platform/linux-dpdk/odp_system_info.c b/platform/linux-dpdk/odp_system_info.c
index b48275233..af07f387a 100644
--- a/platform/linux-dpdk/odp_system_info.c
+++ b/platform/linux-dpdk/odp_system_info.c
@@ -95,7 +95,7 @@ static uint64_t default_huge_page_size(void)
while (fgets(str, sizeof(str), file) != NULL) {
if (sscanf(str, "Hugepagesize: %8lu kB", &sz) == 1) {
- ODP_DBG("defaut hp size is %" PRIu64 " kB\n", sz);
+ ODP_DBG("default hp size is %lu kB\n", sz);
fclose(file);
return (uint64_t)sz * 1024;
}
diff --git a/platform/linux-dpdk/odp_time.c b/platform/linux-dpdk/odp_time.c
index 59aaf1c1a..1f3fb2719 100644
--- a/platform/linux-dpdk/odp_time.c
+++ b/platform/linux-dpdk/odp_time.c
@@ -1,4 +1,5 @@
/* Copyright (c) 2013-2018, Linaro Limited
+ * Copyright (c) 2021, Nokia
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
@@ -17,6 +18,7 @@
#include <odp/api/plat/time_inlines.h>
#include <rte_config.h>
+#include <rte_atomic.h>
#include <rte_cycles.h>
ODP_STATIC_ASSERT(_ODP_TIMESPEC_SIZE >= (sizeof(struct timespec)),
@@ -148,6 +150,16 @@ static inline odp_time_t time_cur_dpdk(void)
return time;
}
+static inline odp_time_t time_cur_dpdk_strict(void)
+{
+ odp_time_t time;
+
+ rte_mb();
+ time.u64 = rte_get_timer_cycles() - _odp_time_glob.hw_start;
+
+ return time;
+}
+
static inline uint64_t time_res_dpdk(void)
{
return rte_get_timer_hz();
@@ -259,6 +271,7 @@ int _odp_time_init_global(void)
if (is_dpdk_timer_cycles_support()) {
_odp_time_glob.handler.time_cur = time_cur_dpdk;
+ _odp_time_glob.handler.time_cur_strict = time_cur_dpdk_strict;
_odp_time_glob.handler.time_res = time_res_dpdk;
_odp_time_glob.hw_freq_hz = time_res_dpdk();
_odp_time_glob.use_hw = 1;
@@ -270,6 +283,7 @@ int _odp_time_init_global(void)
}
_odp_time_glob.handler.time_cur = _odp_time_cur_gen;
+ _odp_time_glob.handler.time_cur_strict = _odp_time_cur_gen_strict;
_odp_time_glob.handler.time_res = time_res;
if (_odp_cpu_has_global_time()) {
diff --git a/platform/linux-dpdk/odp_timer.c b/platform/linux-dpdk/odp_timer.c
index 28b4b17a9..b5367b4c2 100644
--- a/platform/linux-dpdk/odp_timer.c
+++ b/platform/linux-dpdk/odp_timer.c
@@ -259,8 +259,8 @@ int odp_timer_capability(odp_timer_clk_src_t clk_src,
{
uint64_t min_tmo = tmo_ticks_to_ns_round_up(MIN_TMO_CYCLES);
- if (clk_src != ODP_CLOCK_CPU) {
- ODP_ERR("Clock source not supported\n");
+ if (clk_src != ODP_CLOCK_DEFAULT) {
+ ODP_ERR("Only ODP_CLOCK_DEFAULT supported. Requested %i.\n", clk_src);
return -1;
}
@@ -289,8 +289,8 @@ int odp_timer_res_capability(odp_timer_clk_src_t clk_src,
{
uint64_t min_tmo = tmo_ticks_to_ns_round_up(MIN_TMO_CYCLES);
- if (clk_src != ODP_CLOCK_CPU) {
- ODP_ERR("Only CPU clock source supported\n");
+ if (clk_src != ODP_CLOCK_DEFAULT) {
+ ODP_ERR("Only ODP_CLOCK_DEFAULT supported. Requested %i.\n", clk_src);
return -1;
}
@@ -655,7 +655,7 @@ retry:
ODP_DBG(" cur_tick %" PRIu64 ", abs_tick %" PRIu64 "\n",
cur_tick, abs_tick);
ODP_DBG(" num_retry %i\n", num_retry);
- return ODP_TIMER_TOOEARLY;
+ return ODP_TIMER_TOO_NEAR;
}
odp_ticketlock_lock(&timer->lock);
@@ -665,7 +665,7 @@ retry:
odp_ticketlock_unlock(&timer->lock);
/* Event missing, or timer already expired and
* enqueued the event. */
- return ODP_TIMER_NOEVENT;
+ return ODP_TIMER_FAIL;
}
if (odp_unlikely(rte_timer_reset(&timer->rte_timer, rel_tick, SINGLE,
@@ -699,7 +699,7 @@ retry:
/* Timer was just about to expire. Too late to reset this timer.
* Return code is NOEVENT, even when application did give
* an event. */
- return ODP_TIMER_NOEVENT;
+ return ODP_TIMER_FAIL;
}
if (event) {
diff --git a/platform/linux-dpdk/test/Makefile.am b/platform/linux-dpdk/test/Makefile.am
index b21fd5314..1496c0558 100644
--- a/platform/linux-dpdk/test/Makefile.am
+++ b/platform/linux-dpdk/test/Makefile.am
@@ -1,10 +1,17 @@
include $(top_srcdir)/test/Makefile.inc
TESTS_ENVIRONMENT += TEST_DIR=${top_builddir}/test/validation
+if WITH_OPENSSL
+TESTS_ENVIRONMENT += WITH_OPENSSL=1
+else
+TESTS_ENVIRONMENT += WITH_OPENSSL=0
+endif
+
SUBDIRS =
+TESTS =
if test_vald
-TESTS = validation/api/pktio/pktio_run.sh
+TESTS += validation/api/pktio/pktio_run.sh
test_SCRIPTS = $(dist_check_SCRIPTS)
@@ -36,25 +43,3 @@ if test_installdir
installcheck-local:
$(DESTDIR)/$(testdir)/run-test.sh $(TESTNAME)
endif
-
-# If building out-of-tree, make check will not copy the scripts and data to the
-# $(builddir) assuming that all commands are run locally. However this prevents
-# running tests on a remote target using LOG_COMPILER.
-# So copy all script and data files explicitly here.
-all-local:
- if [ "x$(srcdir)" != "x$(builddir)" ]; then \
- for f in $(dist_check_SCRIPTS); do \
- if [ -e $(srcdir)/$$f ]; then \
- mkdir -p $(builddir)/$$(dirname $$f); \
- cp -f $(srcdir)/$$f $(builddir)/$$f; \
- fi \
- done \
- fi
-clean-local:
- if [ "x$(srcdir)" != "x$(builddir)" ]; then \
- for f in $(dist_check_SCRIPTS); do \
- rm -f $(builddir)/$$f; \
- done \
- fi
-
-.NOTPARALLEL:
diff --git a/platform/linux-dpdk/test/example/Makefile.am b/platform/linux-dpdk/test/example/Makefile.am
index 22b254cd7..947647cd4 100644
--- a/platform/linux-dpdk/test/example/Makefile.am
+++ b/platform/linux-dpdk/test/example/Makefile.am
@@ -1,6 +1,8 @@
SUBDIRS = \
classifier \
generator \
+ ipsec_api \
+ ipsec_crypto \
l2fwd_simple \
l3fwd \
packet \
diff --git a/platform/linux-dpdk/test/example/ipsec_api/Makefile.am b/platform/linux-dpdk/test/example/ipsec_api/Makefile.am
new file mode 100644
index 000000000..101c97cdf
--- /dev/null
+++ b/platform/linux-dpdk/test/example/ipsec_api/Makefile.am
@@ -0,0 +1,23 @@
+EXTRA_DIST = pktio_env
+
+# If building out-of-tree, make check will not copy the scripts and data to the
+# $(builddir) assuming that all commands are run locally. However this prevents
+# running tests on a remote target using LOG_COMPILER.
+# So copy all script and data files explicitly here.
+all-local:
+ if [ "x$(srcdir)" != "x$(builddir)" ]; then \
+ for f in $(EXTRA_DIST); do \
+ if [ -e $(srcdir)/$$f ]; then \
+ mkdir -p $(builddir)/$$(dirname $$f); \
+ cp -f $(srcdir)/$$f $(builddir)/$$f; \
+ fi \
+ done \
+ fi
+clean-local:
+ if [ "x$(srcdir)" != "x$(builddir)" ]; then \
+ for f in $(EXTRA_DIST); do \
+ rm -f $(builddir)/$$f; \
+ done \
+ fi
+
+.NOTPARALLEL:
diff --git a/platform/linux-dpdk/test/example/ipsec_api/pktio_env b/platform/linux-dpdk/test/example/ipsec_api/pktio_env
new file mode 100644
index 000000000..c647f6bf2
--- /dev/null
+++ b/platform/linux-dpdk/test/example/ipsec_api/pktio_env
@@ -0,0 +1,66 @@
+#!/bin/sh
+#
+# Copyright (C) 2021, Marvell
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+# Script to setup interfaces used for running application on linux-dpdk.
+#
+# ipsec_api application uses two loop devices loop0 and loop1.
+#
+
+if [ "$0" == "$BASH_SOURCE" ]; then
+ echo "Error: Platform specific env file has to be sourced."
+ exit 1
+fi
+
+# Absolute path to the .env file.
+LINUX_ENV_PATH=$PWD/../../platform/linux-dpdk/test
+
+TESTENV="tests-linux-dpdk.env"
+
+if [ -f $LINUX_ENV_PATH/$TESTENV ]; then
+ source $LINUX_ENV_PATH/$TESTENV
+else
+ echo "BUG: unable to find $TESTENV!"
+ echo "$TESTENV has to be in following directory: "
+ echo " $LINUX_ENV_PATH"
+ exit 1
+fi
+
+# Skip IPsec example tests when there's no OpenSSL.
+if [ -n "$WITH_OPENSSL" ] && [ ${WITH_OPENSSL} -eq 0 ]; then
+ echo "Crypto not supported. Skipping."
+ exit 77
+fi
+
+IF0=p7p1
+IF1=p8p1
+
+NEXT_HOP_MAC0=08:00:27:76:B5:E0
+NEXT_HOP_MAC1=08:00:27:F5:8B:DB
+
+LIF0=loop1
+LIF1=loop2
+
+IF_LIST=$LIF0,$LIF1
+ROUTE_IF_INB=$LIF0
+ROUTE_IF_OUTB=$LIF1
+OUT_IF=$LIF1
+IN_IF=$LIF0
+
+validate_result()
+{
+ return 0
+}
+
+setup_interfaces()
+{
+ return 0
+}
+
+cleanup_interfaces()
+{
+ return 0
+}
diff --git a/platform/linux-dpdk/test/example/ipsec_crypto/Makefile.am b/platform/linux-dpdk/test/example/ipsec_crypto/Makefile.am
new file mode 100644
index 000000000..101c97cdf
--- /dev/null
+++ b/platform/linux-dpdk/test/example/ipsec_crypto/Makefile.am
@@ -0,0 +1,23 @@
+EXTRA_DIST = pktio_env
+
+# If building out-of-tree, make check will not copy the scripts and data to the
+# $(builddir) assuming that all commands are run locally. However this prevents
+# running tests on a remote target using LOG_COMPILER.
+# So copy all script and data files explicitly here.
+all-local:
+ if [ "x$(srcdir)" != "x$(builddir)" ]; then \
+ for f in $(EXTRA_DIST); do \
+ if [ -e $(srcdir)/$$f ]; then \
+ mkdir -p $(builddir)/$$(dirname $$f); \
+ cp -f $(srcdir)/$$f $(builddir)/$$f; \
+ fi \
+ done \
+ fi
+clean-local:
+ if [ "x$(srcdir)" != "x$(builddir)" ]; then \
+ for f in $(EXTRA_DIST); do \
+ rm -f $(builddir)/$$f; \
+ done \
+ fi
+
+.NOTPARALLEL:
diff --git a/platform/linux-dpdk/test/example/ipsec_crypto/pktio_env b/platform/linux-dpdk/test/example/ipsec_crypto/pktio_env
new file mode 100644
index 000000000..1c6e7d172
--- /dev/null
+++ b/platform/linux-dpdk/test/example/ipsec_crypto/pktio_env
@@ -0,0 +1,72 @@
+#!/bin/sh
+#
+# Copyright (C) 2021, Marvell
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+# Script to setup interfaces used for running application on linux-dpdk.
+#
+# ipsec_api application uses two loop devices loop0 and loop1.
+#
+
+if [ "$0" == "$BASH_SOURCE" ]; then
+ echo "Error: Platform specific env file has to be sourced."
+ exit 1
+fi
+
+# Absolute path to the .env file.
+LINUX_ENV_PATH=$PWD/../../platform/linux-dpdk/test
+
+TESTENV="tests-linux-dpdk.env"
+
+if [ -f $LINUX_ENV_PATH/$TESTENV ]; then
+ source $LINUX_ENV_PATH/$TESTENV
+else
+ echo "BUG: unable to find $TESTENV!"
+ echo "$TESTENV has to be in following directory: "
+ echo " $LINUX_ENV_PATH"
+ exit 1
+fi
+
+# Skip IPsec example tests when there's no OpenSSL.
+if [ -n "$WITH_OPENSSL" ] && [ ${WITH_OPENSSL} -eq 0 ]; then
+ echo "Crypto not supported. Skipping."
+ exit 77
+fi
+
+# Skip live and router mode tests.
+if [ ${IPSEC_APP_MODE} -eq 1 ] || [ ${IPSEC_APP_MODE} -eq 2 ]; then
+ echo "Live / Router mode test. Skipping."
+ exit 77
+fi
+
+IF0=p7p1
+IF1=p8p1
+
+NEXT_HOP_MAC0=08:00:27:76:B5:E0
+NEXT_HOP_MAC1=08:00:27:F5:8B:DB
+
+LIF0=loop1
+LIF1=loop2
+
+IF_LIST=$LIF0,$LIF1
+ROUTE_IF_INB=$LIF0
+ROUTE_IF_OUTB=$LIF1
+OUT_IF=$LIF1
+IN_IF=$LIF0
+
+validate_result()
+{
+ return 0
+}
+
+setup_interfaces()
+{
+ return 0
+}
+
+cleanup_interfaces()
+{
+ return 0
+}
diff --git a/platform/linux-dpdk/test/sched-basic.conf b/platform/linux-dpdk/test/sched-basic.conf
index c54089a0d..8a46a3ccc 100644
--- a/platform/linux-dpdk/test/sched-basic.conf
+++ b/platform/linux-dpdk/test/sched-basic.conf
@@ -1,6 +1,6 @@
# Mandatory fields
odp_implementation = "linux-dpdk"
-config_file_version = "0.1.11"
+config_file_version = "0.1.12"
sched_basic: {
# Test scheduler with an odd spread value