From patchwork Tue Jun 14 06:07:05 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yi He X-Patchwork-Id: 69969 Delivered-To: patch@linaro.org Received: by 10.140.106.246 with SMTP id e109csp1885530qgf; Mon, 13 Jun 2016 23:09:01 -0700 (PDT) X-Received: by 10.55.155.18 with SMTP id d18mr18904884qke.103.1465884541402; Mon, 13 Jun 2016 23:09:01 -0700 (PDT) Return-Path: Received: from lists.linaro.org (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTP id m62si4391364qkd.162.2016.06.13.23.09.00; Mon, 13 Jun 2016 23:09:01 -0700 (PDT) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) client-ip=54.225.227.206; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=pass (p=NONE dis=NONE) header.from=linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id ABF8468627; Tue, 14 Jun 2016 06:09:00 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id D54C16861E; Tue, 14 Jun 2016 06:07:45 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id AD04868620; Tue, 14 Jun 2016 06:07:32 +0000 (UTC) Received: from mail-pf0-f171.google.com (mail-pf0-f171.google.com [209.85.192.171]) by lists.linaro.org (Postfix) with ESMTPS id 31C0A6861A for ; Tue, 14 Jun 2016 06:07:23 +0000 (UTC) Received: by mail-pf0-f171.google.com with SMTP id 62so53956858pfd.1 for ; Mon, 13 Jun 2016 23:07:23 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=KvnDeOVsUhLpTmnUBKBZ6A/W59zKkUGGr14eWn/7W0Y=; b=LL87t3KuTQ419qO34SPF6hmVzewoWwgoFDnM7i9u3RnJM5bI9kkK3YqmmRBadkgx05 LQ2U/dNyx8j6/we0MwxUgqMppu01XzflYB3nuKdsA+vkTTC2wJ8uZIQBZw0ZtgKSgG9h CYTzm9w472B+iaaNyAf9/MhKixCn4K5Exy54GnnsbrZkbywZXhkYYv+KbGa7G/6Nm1sn 0DD3kP/+gz1W2t1w5vDeZ+8m6QDcyb1SuSpXYQoohNsnHH5VHK2rxHu3apClMo6kFpg5 +2QZpt6FxANFbM3SdvNN7Y20J261ch3MZZ1ay/8llcTHA1E9wQmj3/ynA65XclYQolBX 3D7Q== X-Gm-Message-State: ALyK8tL41iWrGAnHqEGIybRJsw33prvYNb4bn7w+DuXEB8imSqq3P86AzSQkoSUJ1P3LJIqznBE= X-Received: by 10.98.157.135 with SMTP id a7mr1827150pfk.117.1465884440009; Mon, 13 Jun 2016 23:07:20 -0700 (PDT) Received: from ubuntu.heyii.co (ubuntu.heyii.co. [45.32.66.203]) by smtp.googlemail.com with ESMTPSA id o193sm22198064pfo.12.2016.06.13.23.07.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 13 Jun 2016 23:07:19 -0700 (PDT) From: Yi He To: lng-odp@lists.linaro.org Date: Tue, 14 Jun 2016 06:07:05 +0000 Message-Id: <1465884425-17958-1-git-send-email-yi.he@linaro.org> X-Mailer: git-send-email 1.9.1 X-Topics: patch Subject: [lng-odp] [PATCH] linux-gen: move platform tests into test suite X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" Move platform tests from odp/platform/linux-generic/test into test suite at odp/test/platform/linux-generic. Signed-off-by: Yi He --- ./scripts/checkpatch.pl error should be ignored in this case: ERROR: do not set execute permissions for source files #5672: FILE: test/platform/linux-generic/run-test Makefile.am | 1 - configure.ac | 2 +- platform/linux-generic/m4/configure.m4 | 7 +- platform/linux-generic/test/.gitignore | 3 - platform/linux-generic/test/Makefile.am | 74 ----- platform/linux-generic/test/Makefile.inc | 16 - platform/linux-generic/test/pktio/.gitignore | 2 - platform/linux-generic/test/pktio/Makefile.am | 15 - platform/linux-generic/test/pktio/pktio_env | 120 ------- platform/linux-generic/test/pktio/pktio_run.sh | 125 ------- .../linux-generic/test/pktio/pktio_run_dpdk.sh | 95 ------ .../linux-generic/test/pktio/pktio_run_netmap.sh | 123 ------- .../linux-generic/test/pktio/pktio_run_pcap.sh | 36 -- platform/linux-generic/test/pktio/pktio_run_tap.sh | 119 ------- platform/linux-generic/test/pktio_ipc/.gitignore | 2 - platform/linux-generic/test/pktio_ipc/Makefile.am | 20 -- platform/linux-generic/test/pktio_ipc/ipc_common.c | 162 --------- platform/linux-generic/test/pktio_ipc/ipc_common.h | 90 ----- platform/linux-generic/test/pktio_ipc/pktio_ipc1.c | 329 ------------------- platform/linux-generic/test/pktio_ipc/pktio_ipc2.c | 197 ----------- .../linux-generic/test/pktio_ipc/pktio_ipc_run.sh | 72 ---- platform/linux-generic/test/ring/.gitignore | 1 - platform/linux-generic/test/ring/Makefile.am | 14 - platform/linux-generic/test/ring/ring_basic.c | 361 --------------------- platform/linux-generic/test/ring/ring_main.c | 12 - platform/linux-generic/test/ring/ring_stress.c | 244 -------------- platform/linux-generic/test/ring/ring_suites.c | 74 ----- platform/linux-generic/test/ring/ring_suites.h | 34 -- platform/linux-generic/test/run-test | 67 ---- platform/linux-generic/test/shmem/.gitignore | 2 - platform/linux-generic/test/shmem/Makefile.am | 20 -- platform/linux-generic/test/shmem/shmem.h | 21 -- platform/linux-generic/test/shmem/shmem_common.h | 23 -- platform/linux-generic/test/shmem/shmem_linux.c | 159 --------- platform/linux-generic/test/shmem/shmem_linux.h | 9 - platform/linux-generic/test/shmem/shmem_odp.c | 75 ----- platform/linux-generic/test/shmem/shmem_odp.h | 7 - test/Makefile.am | 4 +- test/performance/Makefile.am | 3 - test/performance/odp_l2fwd_run.sh | 4 +- test/platform/linux-generic/.gitignore | 3 + test/platform/linux-generic/Makefile.am | 49 +++ test/platform/linux-generic/Makefile.inc | 16 + test/platform/linux-generic/m4/configure.m4 | 5 + test/platform/linux-generic/pktio/.gitignore | 2 + test/platform/linux-generic/pktio/Makefile.am | 17 + test/platform/linux-generic/pktio/pktio_env | 120 +++++++ test/platform/linux-generic/pktio/pktio_run.sh | 128 ++++++++ .../platform/linux-generic/pktio/pktio_run_dpdk.sh | 100 ++++++ .../linux-generic/pktio/pktio_run_netmap.sh | 125 +++++++ .../platform/linux-generic/pktio/pktio_run_pcap.sh | 41 +++ test/platform/linux-generic/pktio/pktio_run_tap.sh | 124 +++++++ test/platform/linux-generic/pktio_ipc/.gitignore | 2 + test/platform/linux-generic/pktio_ipc/Makefile.am | 15 + test/platform/linux-generic/pktio_ipc/ipc_common.c | 162 +++++++++ test/platform/linux-generic/pktio_ipc/ipc_common.h | 90 +++++ test/platform/linux-generic/pktio_ipc/pktio_ipc1.c | 329 +++++++++++++++++++ test/platform/linux-generic/pktio_ipc/pktio_ipc2.c | 197 +++++++++++ .../linux-generic/pktio_ipc/pktio_ipc_run.sh | 77 +++++ test/platform/linux-generic/ring/.gitignore | 1 + test/platform/linux-generic/ring/Makefile.am | 13 + test/platform/linux-generic/ring/ring_basic.c | 361 +++++++++++++++++++++ test/platform/linux-generic/ring/ring_main.c | 12 + test/platform/linux-generic/ring/ring_stress.c | 244 ++++++++++++++ test/platform/linux-generic/ring/ring_suites.c | 74 +++++ test/platform/linux-generic/ring/ring_suites.h | 34 ++ test/platform/linux-generic/run-test | 67 ++++ test/platform/linux-generic/shmem/.gitignore | 2 + test/platform/linux-generic/shmem/Makefile.am | 20 ++ test/platform/linux-generic/shmem/shmem.h | 21 ++ test/platform/linux-generic/shmem/shmem_common.h | 23 ++ test/platform/linux-generic/shmem/shmem_linux.c | 159 +++++++++ test/platform/linux-generic/shmem/shmem_linux.h | 9 + test/platform/linux-generic/shmem/shmem_odp.c | 75 +++++ test/platform/linux-generic/shmem/shmem_odp.h | 7 + test/validation/Makefile.am | 35 +- 76 files changed, 2764 insertions(+), 2739 deletions(-) delete mode 100644 platform/linux-generic/test/.gitignore delete mode 100644 platform/linux-generic/test/Makefile.am delete mode 100644 platform/linux-generic/test/Makefile.inc delete mode 100644 platform/linux-generic/test/pktio/.gitignore delete mode 100644 platform/linux-generic/test/pktio/Makefile.am delete mode 100644 platform/linux-generic/test/pktio/pktio_env delete mode 100755 platform/linux-generic/test/pktio/pktio_run.sh delete mode 100755 platform/linux-generic/test/pktio/pktio_run_dpdk.sh delete mode 100755 platform/linux-generic/test/pktio/pktio_run_netmap.sh delete mode 100755 platform/linux-generic/test/pktio/pktio_run_pcap.sh delete mode 100755 platform/linux-generic/test/pktio/pktio_run_tap.sh delete mode 100644 platform/linux-generic/test/pktio_ipc/.gitignore delete mode 100644 platform/linux-generic/test/pktio_ipc/Makefile.am delete mode 100644 platform/linux-generic/test/pktio_ipc/ipc_common.c delete mode 100644 platform/linux-generic/test/pktio_ipc/ipc_common.h delete mode 100644 platform/linux-generic/test/pktio_ipc/pktio_ipc1.c delete mode 100644 platform/linux-generic/test/pktio_ipc/pktio_ipc2.c delete mode 100755 platform/linux-generic/test/pktio_ipc/pktio_ipc_run.sh delete mode 100644 platform/linux-generic/test/ring/.gitignore delete mode 100644 platform/linux-generic/test/ring/Makefile.am delete mode 100644 platform/linux-generic/test/ring/ring_basic.c delete mode 100644 platform/linux-generic/test/ring/ring_main.c delete mode 100644 platform/linux-generic/test/ring/ring_stress.c delete mode 100644 platform/linux-generic/test/ring/ring_suites.c delete mode 100644 platform/linux-generic/test/ring/ring_suites.h delete mode 100755 platform/linux-generic/test/run-test delete mode 100644 platform/linux-generic/test/shmem/.gitignore delete mode 100644 platform/linux-generic/test/shmem/Makefile.am delete mode 100644 platform/linux-generic/test/shmem/shmem.h delete mode 100644 platform/linux-generic/test/shmem/shmem_common.h delete mode 100644 platform/linux-generic/test/shmem/shmem_linux.c delete mode 100644 platform/linux-generic/test/shmem/shmem_linux.h delete mode 100644 platform/linux-generic/test/shmem/shmem_odp.c delete mode 100644 platform/linux-generic/test/shmem/shmem_odp.h create mode 100644 test/platform/linux-generic/.gitignore create mode 100644 test/platform/linux-generic/Makefile.am create mode 100644 test/platform/linux-generic/Makefile.inc create mode 100644 test/platform/linux-generic/m4/configure.m4 create mode 100644 test/platform/linux-generic/pktio/.gitignore create mode 100644 test/platform/linux-generic/pktio/Makefile.am create mode 100644 test/platform/linux-generic/pktio/pktio_env create mode 100755 test/platform/linux-generic/pktio/pktio_run.sh create mode 100755 test/platform/linux-generic/pktio/pktio_run_dpdk.sh create mode 100755 test/platform/linux-generic/pktio/pktio_run_netmap.sh create mode 100755 test/platform/linux-generic/pktio/pktio_run_pcap.sh create mode 100755 test/platform/linux-generic/pktio/pktio_run_tap.sh create mode 100644 test/platform/linux-generic/pktio_ipc/.gitignore create mode 100644 test/platform/linux-generic/pktio_ipc/Makefile.am create mode 100644 test/platform/linux-generic/pktio_ipc/ipc_common.c create mode 100644 test/platform/linux-generic/pktio_ipc/ipc_common.h create mode 100644 test/platform/linux-generic/pktio_ipc/pktio_ipc1.c create mode 100644 test/platform/linux-generic/pktio_ipc/pktio_ipc2.c create mode 100755 test/platform/linux-generic/pktio_ipc/pktio_ipc_run.sh create mode 100644 test/platform/linux-generic/ring/.gitignore create mode 100644 test/platform/linux-generic/ring/Makefile.am create mode 100644 test/platform/linux-generic/ring/ring_basic.c create mode 100644 test/platform/linux-generic/ring/ring_main.c create mode 100644 test/platform/linux-generic/ring/ring_stress.c create mode 100644 test/platform/linux-generic/ring/ring_suites.c create mode 100644 test/platform/linux-generic/ring/ring_suites.h create mode 100755 test/platform/linux-generic/run-test create mode 100644 test/platform/linux-generic/shmem/.gitignore create mode 100644 test/platform/linux-generic/shmem/Makefile.am create mode 100644 test/platform/linux-generic/shmem/shmem.h create mode 100644 test/platform/linux-generic/shmem/shmem_common.h create mode 100644 test/platform/linux-generic/shmem/shmem_linux.c create mode 100644 test/platform/linux-generic/shmem/shmem_linux.h create mode 100644 test/platform/linux-generic/shmem/shmem_odp.c create mode 100644 test/platform/linux-generic/shmem/shmem_odp.h diff --git a/Makefile.am b/Makefile.am index 2129472..625748a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -9,7 +9,6 @@ AM_DISTCHECK_CONFIGURE_FLAGS = --enable-test-cpp \ SUBDIRS = @platform_with_platform@ \ helper \ test \ - @platform_with_platform_test@ \ helper/test \ doc \ example \ diff --git a/configure.ac b/configure.ac index a12f984..f4e53ad 100644 --- a/configure.ac +++ b/configure.ac @@ -107,7 +107,6 @@ AC_ARG_WITH([platform], AC_SUBST([with_platform]) AC_SUBST([platform_with_platform], ["platform/${with_platform}"]) -AC_SUBST([platform_with_platform_test], ["platform/${with_platform}/test"]) ########################################################################## # Run platform specific checks and settings @@ -116,6 +115,7 @@ IMPLEMENTATION_NAME="" if test "${with_platform}" == "linux-generic"; then m4_include([./platform/linux-generic/m4/configure.m4]) + m4_include([./test/platform/linux-generic/m4/configure.m4]) IMPLEMENTATION_NAME="odp-linux" else echo "UNSUPPORTED PLATFORM: ${with_platform}" diff --git a/platform/linux-generic/m4/configure.m4 b/platform/linux-generic/m4/configure.m4 index 5380046..1b1b883 100644 --- a/platform/linux-generic/m4/configure.m4 +++ b/platform/linux-generic/m4/configure.m4 @@ -36,9 +36,4 @@ m4_include([platform/linux-generic/m4/odp_dpdk.m4]) m4_include([platform/linux-generic/m4/odp_ipc.m4]) m4_include([platform/linux-generic/m4/odp_schedule.m4]) -AC_CONFIG_FILES([platform/linux-generic/Makefile - platform/linux-generic/test/Makefile - platform/linux-generic/test/shmem/Makefile - platform/linux-generic/test/pktio/Makefile - platform/linux-generic/test/pktio_ipc/Makefile - platform/linux-generic/test/ring/Makefile]) +AC_CONFIG_FILES([platform/linux-generic/Makefile]) diff --git a/platform/linux-generic/test/.gitignore b/platform/linux-generic/test/.gitignore deleted file mode 100644 index 5dabf91..0000000 --- a/platform/linux-generic/test/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.log -*.trs -tests-validation.env diff --git a/platform/linux-generic/test/Makefile.am b/platform/linux-generic/test/Makefile.am deleted file mode 100644 index 2d58c57..0000000 --- a/platform/linux-generic/test/Makefile.am +++ /dev/null @@ -1,74 +0,0 @@ -include $(top_srcdir)/test/Makefile.inc -TESTS_ENVIRONMENT += TEST_DIR=${top_builddir}/test/validation - -ODP_MODULES = pktio \ - ring \ - shmem - -if test_vald -TESTS = pktio/pktio_run.sh \ - pktio/pktio_run_tap.sh \ - ring/ring_main$(EXEEXT) \ - shmem/shmem_linux \ - ${top_builddir}/test/validation/atomic/atomic_main$(EXEEXT) \ - ${top_builddir}/test/validation/barrier/barrier_main$(EXEEXT) \ - ${top_builddir}/test/validation/buffer/buffer_main$(EXEEXT) \ - ${top_builddir}/test/validation/classification/classification_main$(EXEEXT) \ - ${top_builddir}/test/validation/cpumask/cpumask_main$(EXEEXT) \ - ${top_builddir}/test/validation/crypto/crypto_main$(EXEEXT) \ - ${top_builddir}/test/validation/errno/errno_main$(EXEEXT) \ - ${top_builddir}/test/validation/hash/hash_main$(EXEEXT) \ - ${top_builddir}/test/validation/init/init_main_ok$(EXEEXT) \ - ${top_builddir}/test/validation/init/init_main_abort$(EXEEXT) \ - ${top_builddir}/test/validation/init/init_main_log$(EXEEXT) \ - ${top_builddir}/test/validation/lock/lock_main$(EXEEXT) \ - ${top_builddir}/test/validation/packet/packet_main$(EXEEXT) \ - ${top_builddir}/test/validation/pool/pool_main$(EXEEXT) \ - ${top_builddir}/test/validation/queue/queue_main$(EXEEXT) \ - ${top_builddir}/test/validation/random/random_main$(EXEEXT) \ - ${top_builddir}/test/validation/scheduler/scheduler_main$(EXEEXT) \ - ${top_builddir}/test/validation/std_clib/std_clib_main$(EXEEXT) \ - ${top_builddir}/test/validation/thread/thread_main$(EXEEXT) \ - ${top_builddir}/test/validation/time/time_main$(EXEEXT) \ - ${top_builddir}/test/validation/timer/timer_main$(EXEEXT) \ - ${top_builddir}/test/validation/traffic_mngr/traffic_mngr_main$(EXEEXT) \ - ${top_builddir}/test/validation/shmem/shmem_main$(EXEEXT) \ - ${top_builddir}/test/validation/system/system_main$(EXEEXT) - -SUBDIRS = $(ODP_MODULES) - -if HAVE_PCAP -TESTS += pktio/pktio_run_pcap.sh -endif -if PKTIO_IPC -TESTS += pktio_ipc/pktio_ipc_run.sh -SUBDIRS += pktio_ipc -endif -if netmap_support -TESTS += pktio/pktio_run_netmap.sh -endif -if PKTIO_DPDK -TESTS += pktio/pktio_run_dpdk.sh -endif -endif - -TEST_EXTENSIONS = .sh - -dist_check_SCRIPTS = run-test tests-validation.env $(LOG_COMPILER) - -test_SCRIPTS = $(dist_check_SCRIPTS) - -tests-validation.env: - echo "TESTS=\"$(TESTS)\"" > $@ - echo "$(TESTS_ENVIRONMENT)" >> $@ - echo "$(LOG_COMPILER)" >> $@ - -if test_installdir -installcheck-local: - $(DESTDIR)/$(testdir)/run-test -endif - -#performance tests refer to pktio_env -if test_perf -SUBDIRS = pktio -endif diff --git a/platform/linux-generic/test/Makefile.inc b/platform/linux-generic/test/Makefile.inc deleted file mode 100644 index 80b66ae..0000000 --- a/platform/linux-generic/test/Makefile.inc +++ /dev/null @@ -1,16 +0,0 @@ -# The following definitions may be used by platform tests that wish to -# build specific ODP applications, (i.e those whose do more than validation -# test wrapping) - -AM_LDFLAGS += -static - -LIBCUNIT_COMMON = $(top_builddir)/test/validation/common/libcunit_common.la -LIB = $(top_builddir)/lib -LIBODP = $(LIB)/libodphelper-linux.la $(LIB)/libodp-linux.la - -INCCUNIT_COMMON = -I$(top_srcdir)/test/validation/common -INCODP = -I$(top_srcdir)/test \ - -I$(top_srcdir)/platform/@with_platform@/include \ - -I$(top_srcdir)/platform/@with_platform@/arch/$(ARCH_DIR) \ - -I$(top_srcdir)/include \ - -I$(top_srcdir)/helper/include diff --git a/platform/linux-generic/test/pktio/.gitignore b/platform/linux-generic/test/pktio/.gitignore deleted file mode 100644 index 7e563b8..0000000 --- a/platform/linux-generic/test/pktio/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.log -*.trs diff --git a/platform/linux-generic/test/pktio/Makefile.am b/platform/linux-generic/test/pktio/Makefile.am deleted file mode 100644 index 4a14343..0000000 --- a/platform/linux-generic/test/pktio/Makefile.am +++ /dev/null @@ -1,15 +0,0 @@ -dist_check_SCRIPTS = pktio_env \ - pktio_run.sh \ - pktio_run_tap.sh - -if HAVE_PCAP -dist_check_SCRIPTS += pktio_run_pcap.sh -endif -if netmap_support -dist_check_SCRIPTS += pktio_run_netmap.sh -endif -if PKTIO_DPDK -dist_check_SCRIPTS += pktio_run_dpdk.sh -endif - -test_SCRIPTS = $(dist_check_SCRIPTS) diff --git a/platform/linux-generic/test/pktio/pktio_env b/platform/linux-generic/test/pktio/pktio_env deleted file mode 100644 index 345b5bd..0000000 --- a/platform/linux-generic/test/pktio/pktio_env +++ /dev/null @@ -1,120 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2015, Linaro Limited -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause -# -# Test script wrapper for running ODP pktio apps on linux-generic. -# -# For linux-generic the default behavior is to create two pairs of -# virtual Ethernet interfaces and provide the names of these via -# environment variables to pktio apps, the interfaces will be removed -# before the script exits. -# -# Note that the creation of virtual Ethernet devices depends on having -# CONFIG_VETH enabled in the kernel, if not enabled the env setup will be skipped. -# -# Network set up -# IF0 <---> IF1 -# IF2 <---> IF3 -IF0=pktiop0p1 -IF1=pktiop1p0 -IF2=pktiop2p3 -IF3=pktiop3p2 - -if [ "$0" = "$BASH_SOURCE" ]; then - echo "Error: Platform specific env file has to be sourced." -fi - -check_for_root() -{ - if [ "$(id -u)" != "0" ]; then - echo "check_for_root(): need to be root to setup VETH" - return 1 - fi - return 0 -} - -# wait for a network interface's operational state to be "up" -wait_for_iface_up() -{ - iface=$1 - cnt=0 - - while [ $cnt -lt 50 ]; do - read operstate < /sys/class/net/$iface/operstate - - if [ $? -ne 0 ]; then - break - elif [ "$operstate" = "up" ]; then - return 0 - fi - - sleep 0.1 - cnt=`expr $cnt + 1` - done - - return 1 -} - -setup_pktio_env() -{ - echo "pktio: setting up test interfaces $IF0, $IF1, $IF2, $IF3." - - check_for_root - if [ $? -ne 0 ]; then - return 1 - fi - - for iface in $IF0 $IF1 $IF2 $IF3; do - ip link show $iface 2> /dev/null - if [ $? -eq 0 ]; then - echo "pktio: interface $iface already exist $?" - return 2 - fi - done - - if [ "$1" = "clean" ]; then - trap cleanup_pktio_env EXIT - fi - - ip link add $IF0 type veth peer name $IF1 - if [ $? -ne 0 ]; then - echo "pktio: error: unable to create veth pair" - return 3 - fi - ip link add $IF2 type veth peer name $IF3 - if [ $? -ne 0 ]; then - echo "pktio: error: unable to create veth pair" - return 4 - fi - - for iface in $IF0 $IF1 $IF2 $IF3; do - ip link set $iface mtu 9216 up - ifconfig $iface -arp - done - - # check that the interface has come up before starting the test - for iface in $IF0 $IF1 $IF2 $IF3; do - wait_for_iface_up $iface - if [ $? -ne 0 ]; then - echo "pktio: interface $iface failed to come up" - return 5 - fi - done -} - -cleanup_pktio_env() -{ - echo "pktio: removing test interfaces $IF0, $IF1, $IF2, $IF3" - check_for_root - if [ $? -ne 0 ]; then - return 1 - fi - - for iface in $IF0 $IF1 $IF2 $IF3; do - ip link del $iface 2> /dev/null - done - return 0 -} diff --git a/platform/linux-generic/test/pktio/pktio_run.sh b/platform/linux-generic/test/pktio/pktio_run.sh deleted file mode 100755 index 1dc1f44..0000000 --- a/platform/linux-generic/test/pktio/pktio_run.sh +++ /dev/null @@ -1,125 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2015, Linaro Limited -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause -# - -# Proceed the pktio tests. This script expects at least one argument: -# setup) setup the pktio test environment -# cleanup) cleanup the pktio test environment -# run) run the pktio tests (setup, run, cleanup) -# extra arguments are passed unchanged to the test itself (pktio_main) -# Without arguments, "run" is assumed and no extra argument is passed to the -# test (legacy mode). -# - -# directories where pktio_main binary can be found: -# -in the validation dir when running make check (intree or out of tree) -# -in the script directory, when running after 'make install', or -# -in the validation when running standalone (./pktio_run) intree. -# -in the current directory. -# running stand alone out of tree requires setting PATH -PATH=${TEST_DIR}/pktio:$PATH -PATH=$(dirname $0):$PATH -PATH=$(dirname $0)/../../../../test/validation/pktio:$PATH -PATH=.:$PATH - -pktio_main_path=$(which pktio_main${EXEEXT}) -if [ -x "$pktio_main_path" ] ; then - echo "running with pktio_main: $pktio_run_path" -else - echo "cannot find pktio_main: please set you PATH for it." -fi - -# directory where platform test sources are, including scripts -TEST_SRC_DIR=$(dirname $0) - -# exit codes expected by automake for skipped tests -TEST_SKIPPED=77 - -# Use installed pktio env or for make check take it from platform directory -if [ -f "./pktio_env" ]; then - . ./pktio_env -elif [ -f ${TEST_SRC_DIR}/pktio_env ]; then - . ${TEST_SRC_DIR}/pktio_env -else - echo "BUG: unable to find pktio_env!" - echo "pktio_env has to be in current directory or in platform/\$ODP_PLATFORM/test." - echo "ODP_PLATFORM=\"$ODP_PLATFORM\"" - exit 1 -fi - -run_test() -{ - local ret=0 - - # environment variables are used to control which socket method is - # used, so try each combination to ensure decent coverage. - for distype in MMAP MMSG; do - unset ODP_PKTIO_DISABLE_SOCKET_${distype} - done - - # this script doesn't support testing with netmap - export ODP_PKTIO_DISABLE_NETMAP=y - - for distype in SKIP MMAP; do - if [ "$disabletype" != "SKIP" ]; then - export ODP_PKTIO_DISABLE_SOCKET_${distype}=y - fi - pktio_main${EXEEXT} $* - if [ $? -ne 0 ]; then - ret=1 - fi - done - - if [ $ret -ne 0 ]; then - echo "!!! FAILED !!!" - fi - - return $ret -} - -run() -{ - echo "pktio: using 'loop' device" - pktio_main${EXEEXT} $* - loop_ret=$? - - # need to be root to run tests with real interfaces - if [ "$(id -u)" != "0" ]; then - exit $ret - fi - - if [ "$ODP_PKTIO_IF0" = "" ]; then - # no interfaces specified, use default veth interfaces - # setup by the pktio_env script - setup_pktio_env clean - if [ $? != 0 ]; then - echo "Failed to setup test environment, skipping test." - exit $TEST_SKIPPED - fi - export ODP_PKTIO_IF0=$IF0 - export ODP_PKTIO_IF1=$IF1 - fi - - run_test - ret=$? - - [ $ret = 0 ] && ret=$loop_ret - - exit $ret -} - -if [ $# != 0 ]; then - action=$1 - shift -fi - -case "$action" in - setup) setup_pktio_env ;; - cleanup) cleanup_pktio_env ;; - run) run ;; - *) run ;; -esac diff --git a/platform/linux-generic/test/pktio/pktio_run_dpdk.sh b/platform/linux-generic/test/pktio/pktio_run_dpdk.sh deleted file mode 100755 index fd552c6..0000000 --- a/platform/linux-generic/test/pktio/pktio_run_dpdk.sh +++ /dev/null @@ -1,95 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2016, Linaro Limited -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause -# - -# Proceed the pktio tests. This script expects at least one argument: -# setup) setup the pktio test environment -# cleanup) cleanup the pktio test environment -# run) run the pktio tests (setup, run, cleanup) -# extra arguments are passed unchanged to the test itself (pktio_main) -# Without arguments, "run" is assumed and no extra argument is passed to the -# test (legacy mode). -# - -# directories where pktio_main binary can be found: -# -in the validation dir when running make check (intree or out of tree) -# -in the script directory, when running after 'make install', or -# -in the validation when running standalone (./pktio_run) intree. -# -in the current directory. -# running stand alone out of tree requires setting PATH -PATH=${TEST_DIR}/pktio:$PATH -PATH=$(dirname $0):$PATH -PATH=$(dirname $0)/../../../../test/validation/pktio:$PATH -PATH=.:$PATH - -pktio_main_path=$(which pktio_main${EXEEXT}) -if [ -x "$pktio_main_path" ] ; then - echo "running with pktio_main: $pktio_run_path" -else - echo "cannot find pktio_main: please set you PATH for it." -fi - -# directory where platform test sources are, including scripts -TEST_SRC_DIR=$(dirname $0) - -# exit codes expected by automake for skipped tests -TEST_SKIPPED=77 - -# Use installed pktio env or for make check take it from platform directory -if [ -f "./pktio_env" ]; then - . ./pktio_env -elif [ -f ${TEST_SRC_DIR}/pktio_env ]; then - . ${TEST_SRC_DIR}/pktio_env -else - echo "BUG: unable to find pktio_env!" - echo "pktio_env has to be in current directory or in platform/\$ODP_PLATFORM/test." - echo "ODP_PLATFORM=\"$ODP_PLATFORM\"" - exit 1 -fi - -run_test() -{ - local ret=0 - - pktio_main${EXEEXT} $* - ret=$? - if [ $ret -ne 0 ]; then - echo "!!! FAILED !!!" - fi - - exit $ret -} - -run() -{ - # need to be root to set the interface. - if [ "$(id -u)" != "0" ]; then - echo "pktio: need to be root to setup DPDK interfaces." - return $TEST_SKIPPED - fi - - if [ "$ODP_PKTIO_IF0" = "" ]; then - setup_pktio_env clean - export ODP_PKTIO_DPDK_PARAMS="--vdev eth_pcap0,iface=$IF0 --vdev eth_pcap1,iface=$IF1" - export ODP_PKTIO_IF0=0 - export ODP_PKTIO_IF1=1 - fi - - run_test -} - -if [ $# != 0 ]; then - action=$1 - shift -fi - -case "$1" in - setup) setup_pktio_env ;; - cleanup) cleanup_pktio_env ;; - run) run ;; - *) run ;; -esac diff --git a/platform/linux-generic/test/pktio/pktio_run_netmap.sh b/platform/linux-generic/test/pktio/pktio_run_netmap.sh deleted file mode 100755 index b651ea3..0000000 --- a/platform/linux-generic/test/pktio/pktio_run_netmap.sh +++ /dev/null @@ -1,123 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2016, Linaro Limited -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause -# - -# any parameter passed as arguments to this script is passed unchanged to -# the test itself (pktio_main) - -# directories where pktio_main binary can be found: -# -in the validation dir when running make check (intree or out of tree) -# -in the script directory, when running after 'make install', or -# -in the validation when running standalone (./pktio_run) intree. -# -in the current directory. -# running stand alone out of tree requires setting PATH -PATH=${TEST_DIR}/pktio:$PATH -PATH=$(dirname $0):$PATH -PATH=$(dirname $0)/../../../../test/validation/pktio:$PATH -PATH=.:$PATH - -pktio_main_path=$(which pktio_main${EXEEXT}) -if [ -x "$pktio_main_path" ] ; then - echo "running with pktio_main: $pktio_main_path" -else - echo "cannot find pktio_main: please set you PATH for it." -fi - -# directory where platform test sources are, including scripts -TEST_SRC_DIR=$(dirname $0) - -# exit codes expected by automake for skipped tests -TEST_SKIPPED=77 - -# Use installed pktio env or for make check take it from the test directory -if [ -f "./pktio_env" ]; then - . ./pktio_env -elif [ -f ${TEST_SRC_DIR}/pktio_env ]; then - . ${TEST_SRC_DIR}/pktio_env -else - echo "ERROR: unable to find pktio_env!" - echo "pktio_env has to be in current directory or in ${TEST_SRC_DIR}" - exit 1 -fi - -run_test() -{ - local ret=0 - - pktio_main${EXEEXT} $* - ret=$? - - if [ $ret -ne 0 ]; then - echo "!!! FAILED !!!" - fi - - return $ret -} - -run_test_vale() -{ - # use two vale ports on the same switch - export ODP_PKTIO_IF0=valetest:0 - export ODP_PKTIO_IF1=valetest:1 - run_test - return $? -} - -run_test_pipe() -{ - # use a netmap pipe - export ODP_PKTIO_IF0=valetest:0{0 - export ODP_PKTIO_IF1=valetest:0}0 - run_test - return $? -} - -run_test_veth() -{ - if [ "$(lsmod | grep veth)" = "" ]; then - echo "netmap enabled veth module not loaded, skipping test." - return 0 - fi - - setup_pktio_env clean - export ODP_PKTIO_IF0=$IF0 - export ODP_PKTIO_IF1=$IF1 - run_test - return $? -} - -run() -{ - local ret=0 - - # need to be root to run these tests - if [ "$(id -u)" != "0" ]; then - echo "netmap tests must be run as root, skipping test." - exit $TEST_SKIPPED - fi - - if [ "$(lsmod | grep netmap)" = "" ]; then - echo "netmap kernel module not loaded, skipping test." - exit $TEST_SKIPPED - fi - - if [ "$ODP_PKTIO_IF0" != "" ]; then - run_test - ret=$? - else - run_test_vale - r=$?; [ $ret = 0 ] && ret=$r - run_test_pipe - r=$?; [ $ret = 0 ] && ret=$r - run_test_veth - r=$?; [ $ret = 0 ] && ret=$r - fi - - exit $ret -} - -run diff --git a/platform/linux-generic/test/pktio/pktio_run_pcap.sh b/platform/linux-generic/test/pktio/pktio_run_pcap.sh deleted file mode 100755 index 51716fb..0000000 --- a/platform/linux-generic/test/pktio/pktio_run_pcap.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2015, Linaro Limited -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause -# - -# any parameter passed as arguments to this script is passed unchanged to -# the test itself (pktio_main) - -# directories where pktio_main binary can be found: -# -in the validation dir when running make check (intree or out of tree) -# -in the script directory, when running after 'make install', or -# -in the validation when running standalone intree. -# -in the current directory. -# running stand alone out of tree requires setting PATH -PATH=${TEST_DIR}/pktio:$PATH -PATH=$(dirname $0):$PATH -PATH=$(dirname $0)/../../../../test/validation/pktio:$PATH -PATH=.:$PATH - -pktio_main_path=$(which pktio_main${EXEEXT}) -if [ -x "$pktio_main_path" ] ; then - echo "running with $pktio_main_path" -else - echo "cannot find pktio_main${EXEEXT}: please set you PATH for it." -fi - -PCAP_FNAME=vald.pcap -export ODP_PKTIO_IF0="pcap:out=${PCAP_FNAME}" -export ODP_PKTIO_IF1="pcap:in=${PCAP_FNAME}" -pktio_main${EXEEXT} $* -ret=$? -rm -f ${PCAP_FNAME} -exit $ret diff --git a/platform/linux-generic/test/pktio/pktio_run_tap.sh b/platform/linux-generic/test/pktio/pktio_run_tap.sh deleted file mode 100755 index 1150158..0000000 --- a/platform/linux-generic/test/pktio/pktio_run_tap.sh +++ /dev/null @@ -1,119 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2015, Ilya Maximets -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause -# - - -# any parameter passed as arguments to this script is passed unchanged to -# the test itself (pktio_main) - -# directories where pktio_main binary can be found: -# -in the validation dir when running make check (intree or out of tree) -# -in the script directory, when running after 'make install', or -# -in the validation when running standalone intree. -# -in the current directory. -# running stand alone out of tree requires setting PATH -PATH=${TEST_DIR}/pktio:$PATH -PATH=$(dirname $0):$PATH -PATH=$(dirname $0)/../../../../test/validation/pktio:$PATH -PATH=.:$PATH - -pktio_main_path=$(which pktio_main${EXEEXT}) -if [ -x "$pktio_main_path" ] ; then - echo "running with $pktio_main_path" -else - echo "cannot find pktio_main${EXEEXT}: please set you PATH for it." -fi - -# exit code expected by automake for skipped tests -TEST_SKIPPED=77 - -TAP_BASE_NAME=iotap_vald -IF0=${TAP_BASE_NAME}0 -IF1=${TAP_BASE_NAME}1 -BR=${TAP_BASE_NAME}_br - -export ODP_PKTIO_IF0="tap:$IF0" -export ODP_PKTIO_IF1="tap:$IF1" - -tap_cleanup() -{ - ret=$? - - for iface in $IF0 $IF1; do - ip link set dev $iface nomaster - done - - ip link delete $BR type bridge - - for iface in $IF0 $IF1; do - ip tuntap del mode tap $iface - done - - trap - EXIT - exit $ret -} - -tap_setup() -{ - if [ "$(id -u)" != "0" ]; then - echo "pktio: need to be root to setup TAP interfaces." - return $TEST_SKIPPED - fi - - for iface in $IF0 $IF1 $BR; do - ip link show $iface 2> /dev/null - if [ $? -eq 0 ]; then - echo "pktio: interface $iface already exist $?" - return 2 - fi - done - - trap tap_cleanup EXIT - - for iface in $IF0 $IF1; do - ip tuntap add mode tap $iface - if [ $? -ne 0 ]; then - echo "pktio: error: unable to create TAP device $iface" - return 3 - fi - done - - ip link add name $BR type bridge - if [ $? -ne 0 ]; then - echo "pktio: error: unable to create bridge $BR" - return 3 - fi - - for iface in $IF0 $IF1; do - ip link set dev $iface master $BR - if [ $? -ne 0 ]; then - echo "pktio: error: unable to add $iface to bridge $BR" - return 4 - fi - done - - for iface in $IF0 $IF1 $BR; do - ifconfig $iface -arp - sysctl -w net.ipv6.conf.${iface}.disable_ipv6=1 - ip link set dev $iface mtu 9216 up - done - - return 0 -} - -tap_setup -ret=$? -if [ $ret -ne 0 ]; then - echo "pktio: tap_setup() FAILED!" - exit $TEST_SKIPPED -fi - -# Using ODP_WAIT_FOR_NETWORK to prevent fail if tap still not enabled in bridge -ODP_WAIT_FOR_NETWORK=yes pktio_main${EXEEXT} $* -ret=$? - -exit $ret diff --git a/platform/linux-generic/test/pktio_ipc/.gitignore b/platform/linux-generic/test/pktio_ipc/.gitignore deleted file mode 100644 index 49ee4fd..0000000 --- a/platform/linux-generic/test/pktio_ipc/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -pktio_ipc1 -pktio_ipc2 diff --git a/platform/linux-generic/test/pktio_ipc/Makefile.am b/platform/linux-generic/test/pktio_ipc/Makefile.am deleted file mode 100644 index 8858bd2..0000000 --- a/platform/linux-generic/test/pktio_ipc/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -include $(top_srcdir)/test/Makefile.inc -TESTS_ENVIRONMENT += TEST_DIR=${top_builddir}/test/validation - -test_PROGRAMS = pktio_ipc1\ - pktio_ipc2 - -pktio_ipc1_CFLAGS = $(AM_CFLAGS) -I${top_srcdir}/example -pktio_ipc1_LDFLAGS = $(AM_LDFLAGS) -static -pktio_ipc2_CFLAGS = $(AM_CFLAGS) -I${top_srcdir}/example -pktio_ipc2_LDFLAGS = $(AM_LDFLAGS) -static - -noinst_HEADERS = $(top_srcdir)/test/test_debug.h - -dist_pktio_ipc1_SOURCES = pktio_ipc1.c ipc_common.c -dist_pktio_ipc2_SOURCES = pktio_ipc2.c ipc_common.c - -EXTRA_DIST = ipc_common.h - -dist_check_SCRIPTS = pktio_ipc_run.sh -test_SCRIPTS = $(dist_check_SCRIPTS) diff --git a/platform/linux-generic/test/pktio_ipc/ipc_common.c b/platform/linux-generic/test/pktio_ipc/ipc_common.c deleted file mode 100644 index 2ee326e..0000000 --- a/platform/linux-generic/test/pktio_ipc/ipc_common.c +++ /dev/null @@ -1,162 +0,0 @@ -/* Copyright (c) 2015, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "ipc_common.h" - -/** Run time in seconds */ -int run_time_sec; -int ipc_name_space; - -int ipc_odp_packet_sendall(odp_pktio_t pktio, - odp_packet_t pkt_tbl[], int num) -{ - int ret; - int sent = 0; - odp_time_t start_time; - odp_time_t end_time; - odp_time_t wait; - odp_pktout_queue_t pktout; - - start_time = odp_time_local(); - wait = odp_time_local_from_ns(ODP_TIME_SEC_IN_NS); - end_time = odp_time_sum(start_time, wait); - - if (odp_pktout_queue(pktio, &pktout, 1) != 1) { - EXAMPLE_ERR("no output queue\n"); - return -1; - } - - while (sent != num) { - ret = odp_pktout_send(pktout, &pkt_tbl[sent], num - sent); - if (ret < 0) - return -1; - - sent += ret; - - if (odp_time_cmp(end_time, odp_time_local()) < 0) - return -1; - } - - return 0; -} - -odp_pktio_t create_pktio(odp_pool_t pool) -{ - odp_pktio_param_t pktio_param; - odp_pktio_t ipc_pktio; - - odp_pktio_param_init(&pktio_param); - - printf("pid: %d, create IPC pktio\n", getpid()); - ipc_pktio = odp_pktio_open("ipc_pktio", pool, &pktio_param); - if (ipc_pktio == ODP_PKTIO_INVALID) - EXAMPLE_ABORT("Error: ipc pktio create failed.\n"); - - if (odp_pktin_queue_config(ipc_pktio, NULL)) { - EXAMPLE_ERR("Input queue config failed\n"); - return ODP_PKTIO_INVALID; - } - - if (odp_pktout_queue_config(ipc_pktio, NULL)) { - EXAMPLE_ERR("Output queue config failed\n"); - return ODP_PKTIO_INVALID; - } - - return ipc_pktio; -} - -/** - * Parse and store the command line arguments - * - * @param argc argument count - * @param argv[] argument vector - * @param appl_args Store application arguments here - */ -void parse_args(int argc, char *argv[]) -{ - int opt; - int long_index; - static struct option longopts[] = { - {"time", required_argument, NULL, 't'}, - {"ns", required_argument, NULL, 'n'}, /* ipc name space */ - {"help", no_argument, NULL, 'h'}, /* return 'h' */ - {NULL, 0, NULL, 0} - }; - - run_time_sec = 0; /* loop forever if time to run is 0 */ - ipc_name_space = 0; - - while (1) { - opt = getopt_long(argc, argv, "+t:n:h", - longopts, &long_index); - - if (opt == -1) - break; /* No more options */ - - switch (opt) { - case 't': - run_time_sec = atoi(optarg); - break; - case 'n': - ipc_name_space = atoi(optarg); - break; - case 'h': - usage(argv[0]); - exit(EXIT_SUCCESS); - break; - default: - break; - } - } - - optind = 1; /* reset 'extern optind' from the getopt lib */ - - if (!ipc_name_space) { - usage(argv[0]); - exit(1); - } -} - -/** - * Print system and application info - */ -void print_info(char *progname) -{ - printf("\n" - "ODP system info\n" - "---------------\n" - "ODP API version: %s\n" - "CPU model: %s\n" - "\n", - odp_version_api_str(), odp_cpu_model_str()); - - printf("Running ODP appl: \"%s\"\n" - "-----------------\n" - "Using IF: %s\n", - progname, pktio_name); - printf("\n\n"); - fflush(NULL); -} - -/** - * Prinf usage information - */ -void usage(char *progname) -{ - printf("\n" - "Usage: %s OPTIONS\n" - " E.g. -n ipc_name_space %s -t seconds\n" - "\n" - "OpenDataPlane odp-linux ipc test application.\n" - "\n" - "Mandatory OPTIONS:\n" - " -n, --ns IPC name space ID /dev/shm/odp--objname.\n" - "Optional OPTIONS\n" - " -h, --help Display help and exit.\n" - " -t, --time Time to run in seconds.\n" - "\n", NO_PATH(progname), NO_PATH(progname) - ); -} diff --git a/platform/linux-generic/test/pktio_ipc/ipc_common.h b/platform/linux-generic/test/pktio_ipc/ipc_common.h deleted file mode 100644 index 7bc483f..0000000 --- a/platform/linux-generic/test/pktio_ipc/ipc_common.h +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright (c) 2015, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#define _POSIX_C_SOURCE 200809L -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - -/** @def SHM_PKT_POOL_SIZE - * @brief Size of the shared memory block - */ -#define SHM_PKT_POOL_SIZE 8192 - -/** @def SHM_PKT_POOL_BUF_SIZE - * @brief Buffer size of the packet pool buffer - */ -#define SHM_PKT_POOL_BUF_SIZE 1856 - -/** @def MAX_PKT_BURST - * @brief Maximum number of packet bursts - */ -#define MAX_PKT_BURST 16 - -/** Get rid of path in filename - only for unix-type paths using '/' */ -#define NO_PATH(file_name) (strrchr((file_name), '/') ? \ - strrchr((file_name), '/') + 1 : (file_name)) - -#define TEST_SEQ_MAGIC 0x92749451 -#define TEST_SEQ_MAGIC_2 0x81638340 - -#define TEST_ALLOC_MAGIC 0x1234adcd - -/** magic number and sequence at start of packet payload */ -typedef struct ODP_PACKED { - odp_u32be_t magic; - odp_u32be_t seq; -} pkt_head_t; - -/** magic number at end of packet payload */ -typedef struct ODP_PACKED { - odp_u32be_t magic; -} pkt_tail_t; - -/** Application argument */ -char *pktio_name; - -/** Run time in seconds */ -int run_time_sec; - -/** IPC name space id /dev/shm/odp-nsid-objname */ -int ipc_name_space; - -/* helper funcs */ -void parse_args(int argc, char *argv[]); -void print_info(char *progname); -void usage(char *progname); - -/** - * Create a ipc pktio handle. - * - * @param pool Pool to associate with device for packet RX/TX - * - * @return The handle of the created pktio object. - * @retval ODP_PKTIO_INVALID if the create fails. - */ -odp_pktio_t create_pktio(odp_pool_t pool); - -/** Spin and send all packet from table - * - * @param pktio pktio device - * @param pkt_tbl packets table - * @param num number of packets - */ -int ipc_odp_packet_sendall(odp_pktio_t pktio, - odp_packet_t pkt_tbl[], int num); diff --git a/platform/linux-generic/test/pktio_ipc/pktio_ipc1.c b/platform/linux-generic/test/pktio_ipc/pktio_ipc1.c deleted file mode 100644 index a4eed88..0000000 --- a/platform/linux-generic/test/pktio_ipc/pktio_ipc1.c +++ /dev/null @@ -1,329 +0,0 @@ -/* Copyright (c) 2015, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "ipc_common.h" - -/** - * @file - * @example pktio_ipc1.c ODP IPC example application. - * This application works in pair with pktio_ipc2 application. - * It opens ipc pktio, allocates packets, sets magic number and - * sends packets to ipc pktio. Then app reads packets and checks - * that magic number was properly updated and there is no packet - * loss (i.e. sequesce counter continiusly incrementing.) - */ - -/** - * Packet IO loopback worker thread using bursts from/to IO resources - * - * @param arg thread arguments of type 'thread_args_t *' - */ -static int pktio_run_loop(odp_pool_t pool) -{ - int thr; - int pkts; - odp_pktio_t ipc_pktio; - odp_packet_t pkt_tbl[MAX_PKT_BURST]; - uint64_t cnt = 0; /* increasing counter on each send packet */ - uint64_t cnt_recv = 0; /* increasing counter to validate - cnt on receive */ - uint64_t stat_pkts = 0; - uint64_t stat_pkts_alloc = 0; - uint64_t stat_pkts_prev = 0; - uint64_t stat_errors = 0; - odp_time_t start_cycle; - odp_time_t current_cycle; - odp_time_t cycle; - odp_time_t diff; - odp_time_t wait; - int ret; - odp_pktin_queue_t pktin; - - thr = odp_thread_id(); - - ipc_pktio = odp_pktio_lookup("ipc_pktio"); - if (ipc_pktio == ODP_PKTIO_INVALID) { - EXAMPLE_ERR(" [%02i] Error: lookup of pktio %s failed\n", - thr, "ipc_pktio"); - return -2; - } - printf(" [%02i] looked up ipc_pktio:%02" PRIu64 ", burst mode\n", - thr, odp_pktio_to_u64(ipc_pktio)); - - wait = odp_time_local_from_ns(run_time_sec * ODP_TIME_SEC_IN_NS); - start_cycle = odp_time_local(); - current_cycle = start_cycle; - - if (odp_pktin_queue(ipc_pktio, &pktin, 1) != 1) { - EXAMPLE_ERR("no input queue\n"); - return -1; - } - - /* start ipc pktio, i.e. wait until other process connects */ - for (;;) { - if (run_time_sec) { - cycle = odp_time_local(); - diff = odp_time_diff(cycle, start_cycle); - if (odp_time_cmp(wait, diff) < 0) { - printf("timeout exit, run_time_sec %d\n", - run_time_sec); - goto exit; - } - } - - ret = odp_pktio_start(ipc_pktio); - if (!ret) - break; - } - - /* packets loop */ - for (;;) { - int i; - - /* 1. exit loop if time specified */ - if (run_time_sec) { - cycle = odp_time_local(); - diff = odp_time_diff(cycle, start_cycle); - if (odp_time_cmp(wait, diff) < 0) { - EXAMPLE_DBG("exit after %d seconds\n", - run_time_sec); - break; - } - } - - /* 2. Receive packets back from ipc_pktio, validate magic - * number sequence counter and free that packet - */ - while (1) { - pkts = odp_pktin_recv(pktin, pkt_tbl, MAX_PKT_BURST); - if (pkts <= 0) - break; - - for (i = 0; i < pkts; i++) { - odp_packet_t pkt = pkt_tbl[i]; - pkt_head_t head; - pkt_tail_t tail; - size_t off; - - off = odp_packet_l4_offset(pkt); - if (off == ODP_PACKET_OFFSET_INVALID) - EXAMPLE_ABORT("invalid l4 offset\n"); - - off += ODPH_UDPHDR_LEN; - ret = odp_packet_copy_to_mem(pkt, off, - sizeof(head), - &head); - if (ret) { - stat_errors++; - odp_packet_free(pkt); - EXAMPLE_DBG("error\n"); - continue; - } - - if (head.magic == TEST_ALLOC_MAGIC) { - stat_pkts_alloc++; - odp_packet_free(pkt); - continue; - } - - if (head.magic != TEST_SEQ_MAGIC_2) { - stat_errors++; - odp_packet_free(pkt); - EXAMPLE_DBG("error\n"); - continue; - } - - off = odp_packet_len(pkt) - sizeof(pkt_tail_t); - ret = odp_packet_copy_to_mem(pkt, off, - sizeof(tail), - &tail); - if (ret) { - stat_errors++; - odp_packet_free(pkt); - continue; - } - - if (tail.magic != TEST_SEQ_MAGIC) { - stat_errors++; - odp_packet_free(pkt); - continue; - } - - cnt_recv++; - - if (head.seq != cnt_recv) { - stat_errors++; - odp_packet_free(pkt); - EXAMPLE_DBG("head.seq %d - " - "cnt_recv %" PRIu64 "" - " = %" PRIu64 "\n", - head.seq, cnt_recv, - head.seq - cnt_recv); - cnt_recv = head.seq; - continue; - } - - stat_pkts++; - odp_packet_free(pkt); - } - } - - /* 3. emulate that pkts packets were received */ - odp_random_data((uint8_t *)&pkts, sizeof(pkts), 0); - pkts = ((pkts & 0xffff) % MAX_PKT_BURST) + 1; - - for (i = 0; i < pkts; i++) { - odp_packet_t pkt; - - pkt = odp_packet_alloc(pool, SHM_PKT_POOL_BUF_SIZE); - if (pkt == ODP_PACKET_INVALID) - break; - - odp_packet_l4_offset_set(pkt, 30); - pkt_tbl[i] = pkt; - } - - /* exit if no packets allocated */ - if (i == 0) { - EXAMPLE_DBG("unable to alloc packet pkts %d/%d\n", - i, pkts); - break; - } - - pkts = i; - - /* 4. Copy counter and magic numbers to that packets */ - for (i = 0; i < pkts; i++) { - pkt_head_t head; - pkt_tail_t tail; - size_t off; - odp_packet_t pkt = pkt_tbl[i]; - - off = odp_packet_l4_offset(pkt); - if (off == ODP_PACKET_OFFSET_INVALID) - EXAMPLE_ABORT("packet L4 offset not set"); - - head.magic = TEST_SEQ_MAGIC; - head.seq = cnt++; - - off += ODPH_UDPHDR_LEN; - ret = odp_packet_copy_from_mem(pkt, off, sizeof(head), - &head); - if (ret) - EXAMPLE_ABORT("unable to copy in head data"); - - tail.magic = TEST_SEQ_MAGIC; - off = odp_packet_len(pkt) - sizeof(pkt_tail_t); - ret = odp_packet_copy_from_mem(pkt, off, sizeof(tail), - &tail); - if (ret) - EXAMPLE_ABORT("unable to copy in tail data"); - } - - /* 5. Send packets to ipc_pktio */ - ret = ipc_odp_packet_sendall(ipc_pktio, pkt_tbl, pkts); - if (ret < 0) { - EXAMPLE_DBG("unable to sending to ipc pktio\n"); - break; - } - - cycle = odp_time_local(); - diff = odp_time_diff(cycle, current_cycle); - if (odp_time_cmp(odp_time_local_from_ns(ODP_TIME_SEC_IN_NS), - diff) < 0) { - current_cycle = cycle; - printf("\rpkts: %" PRIu64 ", alloc %" PRIu64 "," - " errors %" PRIu64 ", pps %" PRIu64 ".", - stat_pkts, stat_pkts_alloc, stat_errors, - (stat_pkts + stat_pkts_alloc - stat_pkts_prev)); - fflush(stdout); - stat_pkts_prev = stat_pkts + stat_pkts_alloc; - } - } - - /* cleanup and exit */ - ret = odp_pktio_stop(ipc_pktio); - if (ret) { - EXAMPLE_DBG("odp_pktio_stop error %d\n", ret); - return -1; - } - -exit: - ret = odp_pktio_close(ipc_pktio); - if (ret) { - EXAMPLE_DBG("odp_pktio_close error %d\n", ret); - return -1; - } - - ret = odp_pool_destroy(pool); - if (ret) { - EXAMPLE_DBG("pool_destroy error %d\n", ret); - /* Remote process can end with reference to our local pool. - * Usully it unmaps it clenealy but some time there are some - * pending packets in the pool in case of remote process was - * trapped or did not call odp_pktio_close() correctly and - * release buffers and free buffer from shared rings. - * return -1; - */ - } - - return (stat_errors > 10 || stat_pkts < 1000) ? -1 : 0; -} - -/** - * ODP packet example main function - */ -int main(int argc, char *argv[]) -{ - odp_pool_t pool; - odp_pool_param_t params; - odp_instance_t instance; - odp_platform_init_t plat_idata; - int ret; - - /* Parse and store the application arguments */ - parse_args(argc, argv); - - memset(&plat_idata, 0, sizeof(odp_platform_init_t)); - plat_idata.ipc_ns = ipc_name_space; - - /* Init ODP before calling anything else */ - if (odp_init_global(&instance, NULL, &plat_idata)) { - EXAMPLE_ERR("Error: ODP global init failed.\n"); - exit(EXIT_FAILURE); - } - - /* Init this thread */ - if (odp_init_local(instance, ODP_THREAD_CONTROL)) { - EXAMPLE_ERR("Error: ODP local init failed.\n"); - exit(EXIT_FAILURE); - } - - /* Print both system and application information */ - print_info(NO_PATH(argv[0])); - - /* Create packet pool */ - memset(¶ms, 0, sizeof(params)); - params.pkt.seg_len = SHM_PKT_POOL_BUF_SIZE; - params.pkt.len = SHM_PKT_POOL_BUF_SIZE; - params.pkt.num = SHM_PKT_POOL_SIZE; - params.type = ODP_POOL_PACKET; - - pool = odp_pool_create("packet_pool1", ¶ms); - if (pool == ODP_POOL_INVALID) { - EXAMPLE_ERR("Error: packet pool create failed.\n"); - exit(EXIT_FAILURE); - } - - odp_pool_print(pool); - - create_pktio(pool); - - ret = pktio_run_loop(pool); - - EXAMPLE_DBG("return %d\n", ret); - return ret; -} diff --git a/platform/linux-generic/test/pktio_ipc/pktio_ipc2.c b/platform/linux-generic/test/pktio_ipc/pktio_ipc2.c deleted file mode 100644 index c0c6ff5..0000000 --- a/platform/linux-generic/test/pktio_ipc/pktio_ipc2.c +++ /dev/null @@ -1,197 +0,0 @@ -/* Copyright (c) 2015, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/** - * @file - * - * @example pktio_ipc2.c ODP IPC example application. - * This application works in pair with pktio_ipc1 application. - * It opens ipc pktio, reads packets and updates magic number. - * Also it allocates some packets from internal pool and sends - * to ipc pktio. - */ - -#include "ipc_common.h" - -static int ipc_second_process(void) -{ - odp_pktio_t ipc_pktio; - odp_pool_param_t params; - odp_pool_t pool; - odp_packet_t pkt_tbl[MAX_PKT_BURST]; - odp_packet_t alloc_pkt; - int pkts; - int ret; - int i; - odp_time_t start_cycle; - odp_time_t cycle; - odp_time_t diff; - odp_time_t wait; - uint64_t stat_pkts = 0; - odp_pktin_queue_t pktin; - - /* Create packet pool */ - memset(¶ms, 0, sizeof(params)); - params.pkt.seg_len = SHM_PKT_POOL_BUF_SIZE; - params.pkt.len = SHM_PKT_POOL_BUF_SIZE; - params.pkt.num = SHM_PKT_POOL_SIZE; - params.type = ODP_POOL_PACKET; - - pool = odp_pool_create("packet_pool2", ¶ms); - if (pool == ODP_POOL_INVALID) { - EXAMPLE_ERR("Error: packet pool create failed.\n"); - exit(EXIT_FAILURE); - } - - ipc_pktio = create_pktio(pool); - - wait = odp_time_local_from_ns(run_time_sec * ODP_TIME_SEC_IN_NS); - start_cycle = odp_time_local(); - - if (odp_pktin_queue(ipc_pktio, &pktin, 1) != 1) { - EXAMPLE_ERR("no input queue\n"); - return -1; - } - - /* start ipc pktio, i.e. wait until other process connects */ - for (;;) { - /* 1. exit loop if time specified */ - if (run_time_sec) { - cycle = odp_time_local(); - diff = odp_time_diff(cycle, start_cycle); - if (odp_time_cmp(wait, diff) < 0) { - printf("timeout exit, run_time_sec %d\n", - run_time_sec); - goto exit; - } - } - - ret = odp_pktio_start(ipc_pktio); - if (!ret) - break; - } - - for (;;) { - /* exit loop if time specified */ - if (run_time_sec) { - cycle = odp_time_local(); - diff = odp_time_diff(cycle, start_cycle); - if (odp_time_cmp(wait, diff) < 0) { - EXAMPLE_DBG("exit after %d seconds\n", - run_time_sec); - break; - } - } - - /* recv some packets and change MAGIC to MAGIC_2 */ - pkts = odp_pktin_recv(pktin, pkt_tbl, MAX_PKT_BURST); - if (pkts <= 0) - continue; - - for (i = 0; i < pkts; i++) { - odp_packet_t pkt = pkt_tbl[i]; - pkt_head_t head; - size_t off; - - off = odp_packet_l4_offset(pkt); - if (off == ODP_PACKET_OFFSET_INVALID) - EXAMPLE_ABORT("invalid l4 offset\n"); - - off += ODPH_UDPHDR_LEN; - ret = odp_packet_copy_to_mem(pkt, off, sizeof(head), - &head); - if (ret) - EXAMPLE_ABORT("unable copy out head data"); - - if (head.magic != TEST_SEQ_MAGIC) - EXAMPLE_ABORT("Wrong head magic!"); - - /* Modify magic number in packet */ - head.magic = TEST_SEQ_MAGIC_2; - ret = odp_packet_copy_from_mem(pkt, off, sizeof(head), - &head); - if (ret) - EXAMPLE_ABORT("unable to copy in head data"); - } - - /* send all packets back */ - ret = ipc_odp_packet_sendall(ipc_pktio, pkt_tbl, pkts); - if (ret < 0) - EXAMPLE_ABORT("can not send packets\n"); - stat_pkts += pkts; - - /* alloc packet from local pool, set magic to ALLOC_MAGIC, - * and send it.*/ - alloc_pkt = odp_packet_alloc(pool, SHM_PKT_POOL_BUF_SIZE); - if (alloc_pkt != ODP_PACKET_INVALID) { - pkt_head_t head; - size_t off; - - odp_packet_l4_offset_set(alloc_pkt, 30); - - head.magic = TEST_ALLOC_MAGIC; - - off = odp_packet_l4_offset(alloc_pkt); - off += ODPH_UDPHDR_LEN; - ret = odp_packet_copy_from_mem(alloc_pkt, off, - sizeof(head), - &head); - if (ret) - EXAMPLE_ABORT("unable to copy in head data"); - - pkt_tbl[0] = alloc_pkt; - ret = ipc_odp_packet_sendall(ipc_pktio, pkt_tbl, 1); - if (ret < 0) - EXAMPLE_ABORT("can not send packets\n"); - stat_pkts += 1; - } - } - - /* cleanup and exit */ - ret = odp_pktio_stop(ipc_pktio); - if (ret) { - EXAMPLE_DBG("odp_pktio_stop error %d\n", ret); - return -1; - } - -exit: - ret = odp_pktio_close(ipc_pktio); - if (ret) { - EXAMPLE_DBG("odp_pktio_close error %d\n", ret); - return -1; - } - - ret = odp_pool_destroy(pool); - if (ret) - EXAMPLE_DBG("pool_destroy error %d\n", ret); - - return stat_pkts > 1000 ? 0 : -1; -} - -int main(int argc, char *argv[]) -{ - odp_instance_t instance; - odp_platform_init_t plat_idata; - - /* Parse and store the application arguments */ - parse_args(argc, argv); - - memset(&plat_idata, 0, sizeof(odp_platform_init_t)); - plat_idata.ipc_ns = ipc_name_space; - - if (odp_init_global(&instance, NULL, &plat_idata)) { - EXAMPLE_ERR("Error: ODP global init failed.\n"); - exit(EXIT_FAILURE); - } - - /* Init this thread */ - if (odp_init_local(instance, ODP_THREAD_CONTROL)) { - EXAMPLE_ERR("Error: ODP local init failed.\n"); - exit(EXIT_FAILURE); - } - - return ipc_second_process(); -} diff --git a/platform/linux-generic/test/pktio_ipc/pktio_ipc_run.sh b/platform/linux-generic/test/pktio_ipc/pktio_ipc_run.sh deleted file mode 100755 index 1128002..0000000 --- a/platform/linux-generic/test/pktio_ipc/pktio_ipc_run.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2015, Linaro Limited -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause -# - -# directories where test binary can be found: -# -in the validation dir when running make check (intree or out of tree) -# -in the script directory, when running after 'make install', or -# -in the validation when running standalone (./pktio_ipc_run) intree. -# -in the current directory. -# running stand alone out of tree requires setting PATH -PATH=./pktio_ipc:$PATH -PATH=$(dirname $0):$PATH -PATH=$(dirname $0)/../../../../platform/linux-generic/test/pktio_ipc:$PATH -PATH=.:$PATH - -run() -{ - local ret=0 - IPC_NS=$$ - - #if test was interrupted with CTRL+c than files - #might remain in shm. Needed cleanely delete them. - rm -rf /dev/shm/odp-${IPC_NS}* 2>&1 > /dev/null - - echo "==== run pktio_ipc1 then pktio_ipc2 ====" - pktio_ipc1${EXEEXT} -n ${IPC_NS} -t 30 & - IPC_PID=$! - - pktio_ipc2${EXEEXT} -n ${IPC_NS} -t 10 - ret=$? - # pktio_ipc1 should do clean up and exit just - # after pktio_ipc2 exited. If it does not happen - # kill him in test. - sleep 1 - kill ${IPC_PID} 2>&1 > /dev/null - if [ $? -eq 0 ]; then - rm -rf /dev/shm/odp-${IPC_NS}* 2>&1 > /dev/null - fi - - if [ $ret -ne 0 ]; then - echo "!!!First stage FAILED $ret!!!" - exit $ret - else - echo "First stage PASSED" - fi - - echo "==== run pktio_ipc2 then pktio_ipc1 ====" - pktio_ipc2${EXEEXT} -n ${IPC_NS} -t 10 & - IPC_PID=$! - - pktio_ipc1${EXEEXT} -n ${IPC_NS} -t 20 - ret=$? - (kill ${IPC_PID} 2>&1 > /dev/null) > /dev/null || true - - if [ $ret -ne 0 ]; then - echo "!!! FAILED !!!" - exit $ret - else - echo "Second stage PASSED" - fi - - echo "!!!PASSED!!!" - exit 0 -} - -case "$1" in - *) run ;; -esac diff --git a/platform/linux-generic/test/ring/.gitignore b/platform/linux-generic/test/ring/.gitignore deleted file mode 100644 index 7341a34..0000000 --- a/platform/linux-generic/test/ring/.gitignore +++ /dev/null @@ -1 +0,0 @@ -ring_main diff --git a/platform/linux-generic/test/ring/Makefile.am b/platform/linux-generic/test/ring/Makefile.am deleted file mode 100644 index c086584..0000000 --- a/platform/linux-generic/test/ring/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -include ../Makefile.inc - -noinst_LTLIBRARIES = libtestring.la -libtestring_la_SOURCES = ring_suites.c ring_basic.c ring_stress.c -libtestring_la_CFLAGS = $(AM_CFLAGS) $(INCCUNIT_COMMON) $(INCODP) - -test_PROGRAMS = ring_main$(EXEEXT) -dist_ring_main_SOURCES = ring_main.c - -ring_main_LDFLAGS = $(AM_LDFLAGS) -ring_main_LDADD = libtestring.la $(LIBCUNIT_COMMON) $(LIBODP) - -noinst_HEADERS = ring_suites.h - diff --git a/platform/linux-generic/test/ring/ring_basic.c b/platform/linux-generic/test/ring/ring_basic.c deleted file mode 100644 index 926dc46..0000000 --- a/platform/linux-generic/test/ring/ring_basic.c +++ /dev/null @@ -1,361 +0,0 @@ -/* Copyright (c) 2016, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/** - * @file - * - * ODP ring basic test - */ - -#include -#include -#include - -#include -#include -#include - -#include "ring_suites.h" - -/* labor functions declaration */ -static void __do_basic_burst(_ring_t *r); -static void __do_basic_bulk(_ring_t *r); -static void __do_basic_watermark(_ring_t *r); - -/* dummy object pointers for enqueue and dequeue testing */ -static void **test_enq_data; -static void **test_deq_data; - -/* create two rings: one for single thread usage scenario - * and another for multiple thread usage scenario. - * st - single thread usage scenario - * mt - multiple thread usage scenario - */ -static const char *st_ring_name = "ST basic ring"; -static const char *mt_ring_name = "MT basic ring"; -static _ring_t *st_ring, *mt_ring; - -int ring_test_basic_start(void) -{ - int i = 0; - - /* alloc dummy object pointers for enqueue testing */ - test_enq_data = malloc(RING_SIZE * 2 * sizeof(void *)); - if (NULL == test_enq_data) { - LOG_ERR("failed to allocate basic test enqeue data\n"); - return -1; - } - - for (i = 0; i < RING_SIZE * 2; i++) - test_enq_data[i] = (void *)(unsigned long)i; - - /* alloc dummy object pointers for dequeue testing */ - test_deq_data = malloc(RING_SIZE * 2 * sizeof(void *)); - if (NULL == test_deq_data) { - LOG_ERR("failed to allocate basic test dequeue data\n"); - free(test_enq_data); test_enq_data = NULL; - return -1; - } - - memset(test_deq_data, 0, RING_SIZE * 2 * sizeof(void *)); - return 0; -} - -int ring_test_basic_end(void) -{ - _ring_destroy(st_ring_name); - _ring_destroy(mt_ring_name); - - free(test_enq_data); - free(test_deq_data); - return 0; -} - -/* basic test cases */ -void ring_test_basic_create(void) -{ - /* prove illegal size shall fail */ - st_ring = _ring_create(st_ring_name, ILLEGAL_SIZE, 0); - CU_ASSERT(NULL == st_ring); - CU_ASSERT(EINVAL == __odp_errno); - - /* create ring for single thread usage scenario */ - st_ring = _ring_create(st_ring_name, RING_SIZE, - _RING_F_SP_ENQ | _RING_F_SC_DEQ); - - CU_ASSERT(NULL != st_ring); - CU_ASSERT(_ring_lookup(st_ring_name) == st_ring); - - /* create ring for multiple thread usage scenario */ - mt_ring = _ring_create(mt_ring_name, RING_SIZE, - _RING_SHM_PROC); - - CU_ASSERT(NULL != mt_ring); - CU_ASSERT(_ring_lookup(mt_ring_name) == mt_ring); -} - -void ring_test_basic_burst(void) -{ - /* two rounds to cover both single - * thread and multiple thread APIs - */ - __do_basic_burst(st_ring); - __do_basic_burst(mt_ring); -} - -void ring_test_basic_bulk(void) -{ - __do_basic_bulk(st_ring); - __do_basic_bulk(mt_ring); -} - -void ring_test_basic_watermark(void) -{ - __do_basic_watermark(st_ring); - __do_basic_watermark(mt_ring); -} - -/* labor functions definition */ -static void __do_basic_burst(_ring_t *r) -{ - int result = 0; - unsigned int count = 0; - void * const *source = test_enq_data; - void * const *dest = test_deq_data; - void **enq = NULL, **deq = NULL; - - enq = test_enq_data; deq = test_deq_data; - - /* ring is empty */ - CU_ASSERT(1 == _ring_empty(r)); - - /* enqueue 1 object */ - result = _ring_enqueue_burst(r, enq, 1); - enq += 1; - CU_ASSERT(1 == (result & _RING_SZ_MASK)); - - /* enqueue 2 objects */ - result = _ring_enqueue_burst(r, enq, 2); - enq += 2; - CU_ASSERT(2 == (result & _RING_SZ_MASK)); - - /* enqueue HALF_BULK objects */ - result = _ring_enqueue_burst(r, enq, HALF_BULK); - enq += HALF_BULK; - CU_ASSERT(HALF_BULK == (result & _RING_SZ_MASK)); - - /* ring is neither empty nor full */ - CU_ASSERT(0 == _ring_full(r)); - CU_ASSERT(0 == _ring_empty(r)); - - /* _ring_count() equals enqueued */ - count = (1 + 2 + HALF_BULK); - CU_ASSERT(count == _ring_count(r)); - /* _ring_free_count() equals rooms left */ - count = (RING_SIZE - 1) - count; - CU_ASSERT(count == _ring_free_count(r)); - - /* exceed the size, enquene as many as possible */ - result = _ring_enqueue_burst(r, enq, HALF_BULK); - enq += count; - CU_ASSERT(count == (result & _RING_SZ_MASK)); - CU_ASSERT(1 == _ring_full(r)); - - /* dequeue 1 object */ - result = _ring_dequeue_burst(r, deq, 1); - deq += 1; - CU_ASSERT(1 == (result & _RING_SZ_MASK)); - - /* dequeue 2 objects */ - result = _ring_dequeue_burst(r, deq, 2); - deq += 2; - CU_ASSERT(2 == (result & _RING_SZ_MASK)); - - /* dequeue HALF_BULK objects */ - result = _ring_dequeue_burst(r, deq, HALF_BULK); - deq += HALF_BULK; - CU_ASSERT(HALF_BULK == (result & _RING_SZ_MASK)); - - /* _ring_free_count() equals dequeued */ - count = (1 + 2 + HALF_BULK); - CU_ASSERT(count == _ring_free_count(r)); - /* _ring_count() equals remained left */ - count = (RING_SIZE - 1) - count; - CU_ASSERT(count == _ring_count(r)); - - /* underrun the size, dequeue as many as possible */ - result = _ring_dequeue_burst(r, deq, HALF_BULK); - deq += count; - CU_ASSERT(count == (result & _RING_SZ_MASK)); - CU_ASSERT(1 == _ring_empty(r)); - - /* check data */ - CU_ASSERT(0 == memcmp(source, dest, deq - dest)); - - /* reset dequeue data */ - memset(test_deq_data, 0, RING_SIZE * 2 * sizeof(void *)); -} - -/* incomplete ring API set: strange! - * complement _ring_enqueue/dequeue_bulk to improve coverage - */ -static inline int __ring_enqueue_bulk( - _ring_t *r, void * const *objects, unsigned bulk) -{ - if (r->prod.sp_enqueue) - return _ring_sp_enqueue_bulk(r, objects, bulk); - else - return _ring_mp_enqueue_bulk(r, objects, bulk); -} - -static inline int __ring_dequeue_bulk( - _ring_t *r, void **objects, unsigned bulk) -{ - if (r->cons.sc_dequeue) - return _ring_sc_dequeue_bulk(r, objects, bulk); - else - return _ring_mc_dequeue_bulk(r, objects, bulk); -} - -static void __do_basic_bulk(_ring_t *r) -{ - int result = 0; - unsigned int count = 0; - void * const *source = test_enq_data; - void * const *dest = test_deq_data; - void **enq = NULL, **deq = NULL; - - enq = test_enq_data; deq = test_deq_data; - - /* ring is empty */ - CU_ASSERT(1 == _ring_empty(r)); - - /* enqueue 1 object */ - result = __ring_enqueue_bulk(r, enq, 1); - enq += 1; - CU_ASSERT(0 == result); - - /* enqueue 2 objects */ - result = __ring_enqueue_bulk(r, enq, 2); - enq += 2; - CU_ASSERT(0 == result); - - /* enqueue HALF_BULK objects */ - result = __ring_enqueue_bulk(r, enq, HALF_BULK); - enq += HALF_BULK; - CU_ASSERT(0 == result); - - /* ring is neither empty nor full */ - CU_ASSERT(0 == _ring_full(r)); - CU_ASSERT(0 == _ring_empty(r)); - - /* _ring_count() equals enqueued */ - count = (1 + 2 + HALF_BULK); - CU_ASSERT(count == _ring_count(r)); - /* _ring_free_count() equals rooms left */ - count = (RING_SIZE - 1) - count; - CU_ASSERT(count == _ring_free_count(r)); - - /* exceed the size, enquene shall fail with -ENOBUFS */ - result = __ring_enqueue_bulk(r, enq, HALF_BULK); - CU_ASSERT(-ENOBUFS == result); - - /* fullful the ring */ - result = __ring_enqueue_bulk(r, enq, count); - enq += count; - CU_ASSERT(0 == result); - CU_ASSERT(1 == _ring_full(r)); - - /* dequeue 1 object */ - result = __ring_dequeue_bulk(r, deq, 1); - deq += 1; - CU_ASSERT(0 == result); - - /* dequeue 2 objects */ - result = __ring_dequeue_bulk(r, deq, 2); - deq += 2; - CU_ASSERT(0 == result); - - /* dequeue HALF_BULK objects */ - result = __ring_dequeue_bulk(r, deq, HALF_BULK); - deq += HALF_BULK; - CU_ASSERT(0 == result); - - /* _ring_free_count() equals dequeued */ - count = (1 + 2 + HALF_BULK); - CU_ASSERT(count == _ring_free_count(r)); - /* _ring_count() equals remained left */ - count = (RING_SIZE - 1) - count; - CU_ASSERT(count == _ring_count(r)); - - /* underrun the size, dequeue shall fail with -ENOENT */ - result = __ring_dequeue_bulk(r, deq, HALF_BULK); - CU_ASSERT(-ENOENT == result); - - /* empty the queue */ - result = __ring_dequeue_bulk(r, deq, count); - deq += count; - CU_ASSERT(0 == result); - CU_ASSERT(1 == _ring_empty(r)); - - /* check data */ - CU_ASSERT(0 == memcmp(source, dest, deq - dest)); - - /* reset dequeue data */ - memset(test_deq_data, 0, RING_SIZE * 2 * sizeof(void *)); -} - -void __do_basic_watermark(_ring_t *r) -{ - int result = 0; - void * const *source = test_enq_data; - void * const *dest = test_deq_data; - void **enq = NULL, **deq = NULL; - - enq = test_enq_data; deq = test_deq_data; - - /* bulk = 3/4 watermark to trigger alarm on 2nd enqueue */ - const unsigned watermark = PIECE_BULK; - const unsigned bulk = (watermark / 4) * 3; - - /* watermark cannot exceed ring size */ - result = _ring_set_water_mark(r, ILLEGAL_SIZE); - CU_ASSERT(-EINVAL == result); - - /* set watermark */ - result = _ring_set_water_mark(r, watermark); - CU_ASSERT(0 == result); - - /* 1st enqueue shall succeed */ - result = __ring_enqueue_bulk(r, enq, bulk); - enq += bulk; - CU_ASSERT(0 == result); - - /* 2nd enqueue shall succeed but return -EDQUOT */ - result = __ring_enqueue_bulk(r, enq, bulk); - enq += bulk; - CU_ASSERT(-EDQUOT == result); - - /* dequeue 1st bulk */ - result = __ring_dequeue_bulk(r, deq, bulk); - deq += bulk; - CU_ASSERT(0 == result); - - /* dequeue 2nd bulk */ - result = __ring_dequeue_bulk(r, deq, bulk); - deq += bulk; - CU_ASSERT(0 == result); - - /* check data */ - CU_ASSERT(0 == memcmp(source, dest, deq - dest)); - - /* reset watermark */ - result = _ring_set_water_mark(r, 0); - CU_ASSERT(0 == result); - - /* reset dequeue data */ - memset(test_deq_data, 0, RING_SIZE * 2 * sizeof(void *)); -} diff --git a/platform/linux-generic/test/ring/ring_main.c b/platform/linux-generic/test/ring/ring_main.c deleted file mode 100644 index 7152688..0000000 --- a/platform/linux-generic/test/ring/ring_main.c +++ /dev/null @@ -1,12 +0,0 @@ -/* Copyright (c) 2016, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "ring_suites.h" - -int main(int argc, char *argv[]) -{ - return ring_suites_main(argc, argv); -} diff --git a/platform/linux-generic/test/ring/ring_stress.c b/platform/linux-generic/test/ring/ring_stress.c deleted file mode 100644 index bc61c3e..0000000 --- a/platform/linux-generic/test/ring/ring_stress.c +++ /dev/null @@ -1,244 +0,0 @@ -/* Copyright (c) 2016, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/** - * @file - * - * ODP ring stress test - */ - -#define _GNU_SOURCE - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "ring_suites.h" - -/* There's even number of producer and consumer threads and each thread does - * this many successful enq or deq operations */ -#define NUM_BULK_OP ((RING_SIZE / PIECE_BULK) * 100) - -/* - * Since cunit framework cannot work with multi-threading, ask workers - * to save their results for delayed assertion after thread collection. - */ -static int worker_results[MAX_WORKERS]; - -/* - * Note : make sure that both enqueue and dequeue - * operation starts at same time so to avoid data corruption - * Its because atomic lock will protect only indexes, but if order of - * read or write operation incorrect then data mismatch will happen - * So its resposibility of application develop to take care of order of - * data read or write. - */ -typedef enum { - STRESS_1_1_PRODUCER_CONSUMER, - STRESS_1_N_PRODUCER_CONSUMER, - STRESS_N_1_PRODUCER_CONSUMER, - STRESS_N_M_PRODUCER_CONSUMER -} stress_case_t; - -/* worker function declarations */ -static int stress_worker(void *_data); - -/* global name for later look up in workers' context */ -static const char *ring_name = "stress_ring"; - -/* barrier to run threads at the same time */ -static odp_barrier_t barrier; - -int ring_test_stress_start(void) -{ - _ring_t *r_stress = NULL; - - /* multiple thread usage scenario, thread or process sharable */ - r_stress = _ring_create(ring_name, RING_SIZE, _RING_SHM_PROC); - if (r_stress == NULL) { - LOG_ERR("create ring failed for stress.\n"); - return -1; - } - - return 0; -} - -int ring_test_stress_end(void) -{ - _ring_destroy(ring_name); - return 0; -} - -void ring_test_stress_1_1_producer_consumer(void) -{ - int i = 0; - odp_cpumask_t cpus; - pthrd_arg worker_param; - - /* reset results for delayed assertion */ - memset(worker_results, 0, sizeof(worker_results)); - - /* request 2 threads to run 1:1 stress */ - worker_param.numthrds = odp_cpumask_default_worker(&cpus, 2); - worker_param.testcase = STRESS_1_1_PRODUCER_CONSUMER; - - /* not failure, insufficient resource */ - if (worker_param.numthrds < 2) { - LOG_ERR("insufficient cpu for 1:1 " - "producer/consumer stress.\n"); - return; - } - - odp_barrier_init(&barrier, 2); - - /* kick the workers */ - odp_cunit_thread_create(stress_worker, &worker_param); - - /* collect the results */ - odp_cunit_thread_exit(&worker_param); - - /* delayed assertion due to cunit limitation */ - for (i = 0; i < worker_param.numthrds; i++) - CU_ASSERT(0 == worker_results[i]); -} - -void ring_test_stress_N_M_producer_consumer(void) -{ - int i = 0; - odp_cpumask_t cpus; - pthrd_arg worker_param; - - /* reset results for delayed assertion */ - memset(worker_results, 0, sizeof(worker_results)); - - /* request MAX_WORKERS threads to run N:M stress */ - worker_param.numthrds = - odp_cpumask_default_worker(&cpus, MAX_WORKERS); - worker_param.testcase = STRESS_N_M_PRODUCER_CONSUMER; - - /* not failure, insufficient resource */ - if (worker_param.numthrds < 3) { - LOG_ERR("insufficient cpu for N:M " - "producer/consumer stress.\n"); - return; - } - - /* force even number of threads */ - if (worker_param.numthrds & 0x1) - worker_param.numthrds -= 1; - - odp_barrier_init(&barrier, worker_param.numthrds); - - /* kick the workers */ - odp_cunit_thread_create(stress_worker, &worker_param); - - /* collect the results */ - odp_cunit_thread_exit(&worker_param); - - /* delayed assertion due to cunit limitation */ - for (i = 0; i < worker_param.numthrds; i++) - CU_ASSERT(0 == worker_results[i]); -} - -void ring_test_stress_1_N_producer_consumer(void) -{ -} - -void ring_test_stress_N_1_producer_consumer(void) -{ -} - -void ring_test_stress_ring_list_dump(void) -{ - /* improve code coverage */ - _ring_list_dump(); -} - -/* worker function for multiple producer instances */ -static int do_producer(_ring_t *r) -{ - void *enq[PIECE_BULK]; - int i; - int num = NUM_BULK_OP; - - /* data pattern to be evaluated later in consumer */ - for (i = 0; i < PIECE_BULK; i++) - enq[i] = (void *)(uintptr_t)i; - - while (num) - if (_ring_mp_enqueue_bulk(r, enq, PIECE_BULK) == 0) - num--; - - return 0; -} - -/* worker function for multiple consumer instances */ -static int do_consumer(_ring_t *r) -{ - void *deq[PIECE_BULK]; - int i; - int num = NUM_BULK_OP; - - while (num) { - if (_ring_mc_dequeue_bulk(r, deq, PIECE_BULK) == 0) { - num--; - - /* evaluate the data pattern */ - for (i = 0; i < PIECE_BULK; i++) - CU_ASSERT(deq[i] == (void *)(uintptr_t)i); - } - } - - return 0; -} - -static int stress_worker(void *_data) -{ - pthrd_arg *worker_param = (pthrd_arg *)_data; - _ring_t *r_stress = NULL; - int *result = NULL; - int worker_id = odp_thread_id(); - - /* save the worker result for delayed assertion */ - result = &worker_results[(worker_id % worker_param->numthrds)]; - - /* verify ring lookup in worker context */ - r_stress = _ring_lookup(ring_name); - if (NULL == r_stress) { - LOG_ERR("ring lookup %s not found\n", ring_name); - return (*result = -1); - } - - odp_barrier_wait(&barrier); - - switch (worker_param->testcase) { - case STRESS_1_1_PRODUCER_CONSUMER: - case STRESS_N_M_PRODUCER_CONSUMER: - /* interleaved producer/consumer */ - if (0 == (worker_id % 2)) - *result = do_producer(r_stress); - else if (1 == (worker_id % 2)) - *result = do_consumer(r_stress); - break; - case STRESS_1_N_PRODUCER_CONSUMER: - case STRESS_N_1_PRODUCER_CONSUMER: - default: - LOG_ERR("invalid or not-implemented stress type (%d)\n", - worker_param->testcase); - break; - } - - odp_barrier_wait(&barrier); - - return 0; -} diff --git a/platform/linux-generic/test/ring/ring_suites.c b/platform/linux-generic/test/ring/ring_suites.c deleted file mode 100644 index f321a76..0000000 --- a/platform/linux-generic/test/ring/ring_suites.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (c) 2016, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include -#include -#include - -#include -#include -#include -#include - -#include "ring_suites.h" - -static int ring_suites_init(odp_instance_t *inst) -{ - if (0 != odp_init_global(inst, NULL, NULL)) { - LOG_ERR("error: odp_init_global() failed.\n"); - return -1; - } - if (0 != odp_init_local(*inst, ODP_THREAD_CONTROL)) { - LOG_ERR("error: odp_init_local() failed.\n"); - return -1; - } - - _ring_tailq_init(); - return 0; -} - -static odp_testinfo_t ring_suite_basic[] = { - ODP_TEST_INFO(ring_test_basic_create), - ODP_TEST_INFO(ring_test_basic_burst), - ODP_TEST_INFO(ring_test_basic_bulk), - ODP_TEST_INFO(ring_test_basic_watermark), - ODP_TEST_INFO_NULL, -}; - -static odp_testinfo_t ring_suite_stress[] = { - ODP_TEST_INFO(ring_test_stress_1_1_producer_consumer), - ODP_TEST_INFO(ring_test_stress_1_N_producer_consumer), - ODP_TEST_INFO(ring_test_stress_N_1_producer_consumer), - ODP_TEST_INFO(ring_test_stress_N_M_producer_consumer), - ODP_TEST_INFO(ring_test_stress_ring_list_dump), - ODP_TEST_INFO_NULL, -}; - -static odp_suiteinfo_t ring_suites[] = { - {"ring basic", ring_test_basic_start, - ring_test_basic_end, ring_suite_basic}, - {"ring stress", ring_test_stress_start, - ring_test_stress_end, ring_suite_stress}, - ODP_SUITE_INFO_NULL -}; - -int ring_suites_main(int argc, char *argv[]) -{ - int ret; - - /* let helper collect its own arguments (e.g. --odph_proc) */ - if (odp_cunit_parse_options(argc, argv)) - return -1; - - odp_cunit_register_global_init(ring_suites_init); - - ret = odp_cunit_register(ring_suites); - - if (ret == 0) - ret = odp_cunit_run(); - - return ret; -} diff --git a/platform/linux-generic/test/ring/ring_suites.h b/platform/linux-generic/test/ring/ring_suites.h deleted file mode 100644 index 5fa5b9c..0000000 --- a/platform/linux-generic/test/ring/ring_suites.h +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (c) 2016, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#define RING_SIZE 4096 -#define PIECE_BULK 32 - -#define HALF_BULK (RING_SIZE >> 1) -#define ILLEGAL_SIZE (RING_SIZE | 0x3) - -/* test suite start and stop */ -int ring_test_basic_start(void); -int ring_test_basic_end(void); - -/* basic test cases */ -void ring_test_basic_create(void); -void ring_test_basic_burst(void); -void ring_test_basic_bulk(void); -void ring_test_basic_watermark(void); - -/* test suite start and stop */ -int ring_test_stress_start(void); -int ring_test_stress_end(void); - -/* stress test cases */ -void ring_test_stress_1_1_producer_consumer(void); -void ring_test_stress_1_N_producer_consumer(void); -void ring_test_stress_N_1_producer_consumer(void); -void ring_test_stress_N_M_producer_consumer(void); -void ring_test_stress_ring_list_dump(void); - -int ring_suites_main(int argc, char *argv[]); diff --git a/platform/linux-generic/test/run-test b/platform/linux-generic/test/run-test deleted file mode 100755 index 2bff651..0000000 --- a/platform/linux-generic/test/run-test +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash -# -# Run the ODP test applications and report status in a format that -# matches the automake "make check" output. -# -# The list of tests to be run is obtained by sourcing a file that -# contains an environment variable in the form; -# -# TEST="test_app1 test_app2" -# -# The default behaviour is to run all the tests defined in files -# named tests-*.env in the same directory as this script, but a single -# test definition file can be specified using the TEST_DEF environment -# variable. -# -# Test definition files may optionally also specify a LOG_COMPILER -# which will be invoked as a wrapper to each of the test application -# (as per automake). -# -TDIR=$(dirname $(readlink -f $0)) -PASS=0 -FAIL=0 -SKIP=0 -res=0 - -if [ "$V" != "0" ]; then - verbose=1 -else - verbose=0 - mkdir -p logs -fi - -do_run_tests() { - source $1 - - for tc in $TESTS; do - tc=$(basename $tc) - if [ "$verbose" = "0" ]; then - logfile=logs/${tc}.log - touch $logfile || logfile=/dev/null - $LOG_COMPILER $TDIR/$tc > $logfile 2>&1 - else - $LOG_COMPILER $TDIR/$tc - fi - - tres=$? - case $tres in - 0) echo "PASS: $tc"; let PASS=$PASS+1 ;; - 77) echo "SKIP: $tc"; let SKIP=$SKIP+1 ;; - *) echo "FAIL: $tc"; let FAIL=$FAIL+1; res=1 ;; - esac - done -} - -if [ "$TEST_DEFS" != "" -a -f "$TEST_DEFS" ]; then - do_run_tests $TEST_DEFS -elif [ "$1" != "" ]; then - do_run_tests $TDIR/tests-${1}.env -else - for tenv in $TDIR/tests-*.env; do - do_run_tests $tenv - done -fi - -echo "TEST RESULT: $PASS tests passed, $SKIP skipped, $FAIL failed" - -exit $res diff --git a/platform/linux-generic/test/shmem/.gitignore b/platform/linux-generic/test/shmem/.gitignore deleted file mode 100644 index 7627079..0000000 --- a/platform/linux-generic/test/shmem/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -shmem_linux -shmem_odp diff --git a/platform/linux-generic/test/shmem/Makefile.am b/platform/linux-generic/test/shmem/Makefile.am deleted file mode 100644 index 341747f..0000000 --- a/platform/linux-generic/test/shmem/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -include ../Makefile.inc - -#the main test program is shmem_linux, which, in turn, starts a shmem_odp: -test_PROGRAMS = shmem_linux$(EXEEXT) -test_extra_PROGRAMS = shmem_odp$(EXEEXT) -test_extradir = $(testdir) - -#shmem_linux is stand alone, pure linux (no ODP): -dist_shmem_linux_SOURCES = shmem_linux.c -shmem_linux_LDFLAGS = $(AM_LDFLAGS) -lrt - -#shmem_odp is the odp part: -dist_shmem_odp_SOURCES = shmem_odp.c -shmem_odp_CFLAGS = $(AM_CFLAGS) \ - $(INCCUNIT_COMMON) \ - $(INCODP) -shmem_odp_LDFLAGS = $(AM_LDFLAGS) -shmem_odp_LDADD = $(LIBCUNIT_COMMON) $(LIBODP) - -noinst_HEADERS = shmem_common.h shmem_linux.h shmem_odp.h diff --git a/platform/linux-generic/test/shmem/shmem.h b/platform/linux-generic/test/shmem/shmem.h deleted file mode 100644 index 2368a2e..0000000 --- a/platform/linux-generic/test/shmem/shmem.h +++ /dev/null @@ -1,21 +0,0 @@ -/* Copyright (c) 2016, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _ODP_LINUX_TEST_SHMEM_H_ -#define _ODP_LINUX_TEST_SHMEM_H_ - -#include - -/* test functions: */ -void shmem_test_odp_shm_proc(void); - -/* test arrays: */ -extern odp_testinfo_t shmem_linux_suite[]; - -/* test registry: */ -extern odp_suiteinfo_t shmem_linux_suites[]; - -#endif diff --git a/platform/linux-generic/test/shmem/shmem_common.h b/platform/linux-generic/test/shmem/shmem_common.h deleted file mode 100644 index 16227ec..0000000 --- a/platform/linux-generic/test/shmem/shmem_common.h +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright (c) 2016, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _COMMON_TEST_SHMEM_H_ -#define _COMMON_TEST_SHMEM_H_ - -#define ODP_SHM_NAME "odp_linux_shared_mem" -#define FIFO_NAME_FMT "/tmp/shmem_test_fifo-%d" -#define ALIGN_SIZE (128) -#define TEST_SHARE_FOO (0xf0f0f0f0) -#define TEST_SHARE_BAR (0xf0f0f0f) -#define TEST_FAILURE 'F' -#define TEST_SUCCESS 'S' - -typedef struct { - uint32_t foo; - uint32_t bar; -} test_shared_linux_data_t; - -#endif diff --git a/platform/linux-generic/test/shmem/shmem_linux.c b/platform/linux-generic/test/shmem/shmem_linux.c deleted file mode 100644 index 212a6c1..0000000 --- a/platform/linux-generic/test/shmem/shmem_linux.c +++ /dev/null @@ -1,159 +0,0 @@ -/* Copyright (c) 2016, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* this test makes sure that odp shared memory created with the ODP_SHM_PROC - * flag is visible under linux. It therefore checks both that the device - * name under /dev/shm is correct, and also checks that the memory contents - * is indeed shared. - * we want: - * -the odp test to run using C UNIT - * -the main process to return the correct return code. - * (for the autotools test harness) - * - * To achieve this, the flow of operations is as follows: - * - * linux process (main, non odp) | ODP process - * (shmem_linux.c) | (shmem_odp.c) - * | - * main() | - * forks odp process | allocate shmem - * wait for named pipe creation | populate shmem - * | create named pipe - * read shared memory | wait for test report in fifo - * check if memory contents is OK | - * if OK, write "S" in fifo, else "F" | report success or failure to C-Unit - * wait for child terminaison & status| terminate with usual F/S status - * terminate with same status as child| - * | - * \|/ - * time - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "shmem_linux.h" -#include "shmem_common.h" - -#define ODP_APP_NAME "shmem_odp" /* name of the odp program, in this dir */ -#define DEVNAME_FMT "odp-%d-%s" /* shm device format: odp-- */ -#define MAX_FIFO_WAIT 30 /* Max time waiting for the fifo (sec) */ - -void test_success(char *fifo_name, int fd, pid_t odp_app) -{ - int status; - int nb_char; - char result = TEST_SUCCESS; - /* write "Success" to the FIFO */ - nb_char = write(fd, &result, sizeof(char)); - close(fd); - /* wait for the odp app to terminate */ - waitpid(odp_app, &status, 0); - /* if the write failed, report an error anyway */ - if (nb_char != 1) - status = 1; - unlink(fifo_name); - exit(status); /* the status reported by the odp side is returned */ -} - -void test_failure(char *fifo_name, int fd, pid_t odp_app) -{ - int status; - char result; - - int nb_char __attribute__((unused)); /*ignored: we fail anyway */ - - result = TEST_FAILURE; - /* write "Success" to the FIFO */ - nb_char = write(fd, &result, sizeof(char)); - close(fd); - /* wait for the odp app to terminate */ - waitpid(odp_app, &status, 0); - unlink(fifo_name); - exit(1); /* error */ -} - -int main(int argc __attribute__((unused)), char *argv[]) -{ - char prg_name[PATH_MAX]; - char odp_name[PATH_MAX]; - int nb_sec; - int size; - pid_t odp_app; - char *odp_params = NULL; - char fifo_name[PATH_MAX]; /* fifo for linux->odp feedback */ - int fifo_fd = -1; - char shm_devname[PATH_MAX];/* shared mem device name, under /dev/shm */ - int shm_fd; - test_shared_linux_data_t *addr; - - /* odp app is in the same directory as this file: */ - strncpy(prg_name, argv[0], PATH_MAX - 1); - sprintf(odp_name, "%s/%s", dirname(prg_name), ODP_APP_NAME); - - /* start the ODP application: */ - odp_app = fork(); - if (odp_app < 0) /* error */ - exit(1); - - if (odp_app == 0) /* child */ - execv(odp_name, &odp_params); - - /* wait max 30 sec for the fifo to be created by the ODP side. - * Just die if time expire as there is no fifo to communicate - * through... */ - sprintf(fifo_name, FIFO_NAME_FMT, odp_app); - for (nb_sec = 0; nb_sec < MAX_FIFO_WAIT; nb_sec++) { - fifo_fd = open(fifo_name, O_WRONLY); - if (fifo_fd >= 0) - break; - sleep(1); - } - if (fifo_fd < 0) - exit(1); - printf("pipe found\n"); - - /* the linux named pipe has now been found, meaning that the - * ODP application is up and running, and has allocated shmem. - * check to see if linux can see the created shared memory: */ - - sprintf(shm_devname, DEVNAME_FMT, odp_app, ODP_SHM_NAME); - - /* O_CREAT flag not given => failure if shm_devname does not already - * exist */ - shm_fd = shm_open(shm_devname, O_RDONLY, - S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); - if (shm_fd == -1) - test_failure(fifo_name, shm_fd, odp_app); - - /* we know that the linux generic ODP actually allocates the required - * size + alignment and aligns the returned address after. - * we must do the same here: */ - size = sizeof(test_shared_linux_data_t) + ALIGN_SIZE; - addr = mmap(NULL, size, PROT_READ, MAP_SHARED, shm_fd, 0); - if (addr == MAP_FAILED) - test_failure(fifo_name, shm_fd, odp_app); - - /* perform manual alignment */ - addr = (test_shared_linux_data_t *)((((unsigned long int)addr + - ALIGN_SIZE - 1) / ALIGN_SIZE) * ALIGN_SIZE); - - /* check that we see what the ODP application wrote in the memory */ - if ((addr->foo == TEST_SHARE_FOO) && (addr->bar == TEST_SHARE_BAR)) - test_success(fifo_name, fifo_fd, odp_app); - else - test_failure(fifo_name, fifo_fd, odp_app); -} diff --git a/platform/linux-generic/test/shmem/shmem_linux.h b/platform/linux-generic/test/shmem/shmem_linux.h deleted file mode 100644 index a07a775..0000000 --- a/platform/linux-generic/test/shmem/shmem_linux.h +++ /dev/null @@ -1,9 +0,0 @@ -/* Copyright (c) 2016, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -void test_success(char *fifo_name, int fd, pid_t odp_app); -void test_failure(char *fifo_name, int fd, pid_t odp_app); -int main(int argc, char *argv[]); diff --git a/platform/linux-generic/test/shmem/shmem_odp.c b/platform/linux-generic/test/shmem/shmem_odp.c deleted file mode 100644 index a1f750f..0000000 --- a/platform/linux-generic/test/shmem/shmem_odp.c +++ /dev/null @@ -1,75 +0,0 @@ -/* Copyright (c) 2016, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include "shmem_odp.h" -#include "shmem_common.h" - -#define TEST_SHARE_FOO (0xf0f0f0f0) -#define TEST_SHARE_BAR (0xf0f0f0f) - -void shmem_test_odp_shm_proc(void) -{ - char fifo_name[PATH_MAX]; - int fd; - odp_shm_t shm; - test_shared_data_t *test_shared_data; - char test_result; - - shm = odp_shm_reserve(ODP_SHM_NAME, - sizeof(test_shared_data_t), - ALIGN_SIZE, ODP_SHM_PROC); - CU_ASSERT_FATAL(ODP_SHM_INVALID != shm); - test_shared_data = odp_shm_addr(shm); - CU_ASSERT_FATAL(NULL != test_shared_data); - test_shared_data->foo = TEST_SHARE_FOO; - test_shared_data->bar = TEST_SHARE_BAR; - - odp_mb_full(); - - /* open the fifo: this will indicate to linux process that it can - * start the shmem lookup and check if it sees the data */ - sprintf(fifo_name, FIFO_NAME_FMT, getpid()); - CU_ASSERT_FATAL(mkfifo(fifo_name, 0666) == 0); - - /* read from the fifo: the linux process result: */ - fd = open(fifo_name, O_RDONLY); - CU_ASSERT_FATAL(fd >= 0); - - CU_ASSERT(read(fd, &test_result, sizeof(char)) == 1); - close(fd); - CU_ASSERT_FATAL(test_result == TEST_SUCCESS); - - CU_ASSERT(odp_shm_free(shm) == 0); -} - -odp_testinfo_t shmem_suite[] = { - ODP_TEST_INFO(shmem_test_odp_shm_proc), - ODP_TEST_INFO_NULL, -}; - -odp_suiteinfo_t shmem_suites[] = { - {"Shared Memory", NULL, NULL, shmem_suite}, - ODP_SUITE_INFO_NULL, -}; - -int main(void) -{ - int ret = odp_cunit_register(shmem_suites); - - if (ret == 0) - ret = odp_cunit_run(); - - return ret; -} diff --git a/platform/linux-generic/test/shmem/shmem_odp.h b/platform/linux-generic/test/shmem/shmem_odp.h deleted file mode 100644 index 614bbf8..0000000 --- a/platform/linux-generic/test/shmem/shmem_odp.h +++ /dev/null @@ -1,7 +0,0 @@ -/* Copyright (c) 2016, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -void shmem_test_odp_shm_proc(void); diff --git a/test/Makefile.am b/test/Makefile.am index 4a75364..06da77b 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,5 +1,7 @@ SUBDIRS = performance miscellaneous if cunit_support - SUBDIRS += validation + SUBDIRS += validation @platform_with_platform@ endif + +noinst_HEADERS = $(top_srcdir)/test/test_debug.h diff --git a/test/performance/Makefile.am b/test/performance/Makefile.am index d23bb3e..04e8027 100644 --- a/test/performance/Makefile.am +++ b/test/performance/Makefile.am @@ -23,9 +23,6 @@ odp_crypto_CFLAGS = $(AM_CFLAGS) -I${top_srcdir}/test odp_scheduling_LDFLAGS = $(AM_LDFLAGS) -static odp_scheduling_CFLAGS = $(AM_CFLAGS) -I${top_srcdir}/test -noinst_HEADERS = \ - $(top_srcdir)/test/test_debug.h - dist_odp_crypto_SOURCES = odp_crypto.c dist_odp_scheduling_SOURCES = odp_scheduling.c dist_odp_pktio_perf_SOURCES = odp_pktio_perf.c diff --git a/test/performance/odp_l2fwd_run.sh b/test/performance/odp_l2fwd_run.sh index cab97a8..fc3d05d 100755 --- a/test/performance/odp_l2fwd_run.sh +++ b/test/performance/odp_l2fwd_run.sh @@ -37,8 +37,8 @@ elif [ "$ODP_PLATFORM" = "" ]; then echo "$0: error: ODP_PLATFORM must be defined" # not skipped as this should never happen via "make check" exit 1 -elif [ -f ${TEST_SRC_DIR}/../../platform/$ODP_PLATFORM/test/pktio/pktio_env ]; then - . ${TEST_SRC_DIR}/../../platform/$ODP_PLATFORM/test/pktio/pktio_env +elif [ -f ${TEST_SRC_DIR}/../platform/$ODP_PLATFORM/pktio/pktio_env ]; then + . ${TEST_SRC_DIR}/../platform/$ODP_PLATFORM/pktio/pktio_env else echo "BUG: unable to find pktio_env!" echo "pktio_env has to be in current directory or in platform/\$ODP_PLATFORM/test." diff --git a/test/platform/linux-generic/.gitignore b/test/platform/linux-generic/.gitignore new file mode 100644 index 0000000..5dabf91 --- /dev/null +++ b/test/platform/linux-generic/.gitignore @@ -0,0 +1,3 @@ +*.log +*.trs +tests-validation.env diff --git a/test/platform/linux-generic/Makefile.am b/test/platform/linux-generic/Makefile.am new file mode 100644 index 0000000..1b1e1b5 --- /dev/null +++ b/test/platform/linux-generic/Makefile.am @@ -0,0 +1,49 @@ +include $(top_srcdir)/test/platform/linux-generic/Makefile.inc + +TESTS_ENVIRONMENT += TEST_DIR=${builddir} + +ODP_MODULES = pktio ring shmem + +if test_vald +SUBDIRS = $(ODP_MODULES) + +TESTS = pktio/pktio_run.sh \ + pktio/pktio_run_tap.sh \ + ring/ring_main$(EXEEXT) \ + shmem/shmem_linux + +if HAVE_PCAP +TESTS += pktio/pktio_run_pcap.sh +endif +if PKTIO_IPC +TESTS += pktio_ipc/pktio_ipc_run.sh +SUBDIRS += pktio_ipc +endif +if netmap_support +TESTS += pktio/pktio_run_netmap.sh +endif +if PKTIO_DPDK +TESTS += pktio/pktio_run_dpdk.sh +endif +endif + +TEST_EXTENSIONS = .sh + +dist_check_SCRIPTS = run-test tests-validation.env $(LOG_COMPILER) + +test_SCRIPTS = $(dist_check_SCRIPTS) + +tests-validation.env: + echo "TESTS=\"$(TESTS)\"" > $@ + echo "$(TESTS_ENVIRONMENT)" >> $@ + echo "$(LOG_COMPILER)" >> $@ + +if test_installdir +installcheck-local: + $(DESTDIR)/$(testdir)/run-test +endif + +#performance tests refer to pktio_env +if test_perf +SUBDIRS = pktio +endif diff --git a/test/platform/linux-generic/Makefile.inc b/test/platform/linux-generic/Makefile.inc new file mode 100644 index 0000000..9f36f9d --- /dev/null +++ b/test/platform/linux-generic/Makefile.inc @@ -0,0 +1,16 @@ +include $(top_srcdir)/test/Makefile.inc + +COMMON_DIR = $(top_builddir)/test/validation/common + +#the following option ensure that option '-I.' is not passed to gcc, +#therefore distinguishing between '#include "X"' and '#include '. +#It allows common filenames (such as 'errno.h') to be used locally. +AUTOMAKE_OPTIONS = nostdinc + +AM_CFLAGS += -I$(top_srcdir)/test/validation/common +AM_LDFLAGS += -static + +LIBCUNIT_COMMON = $(COMMON_DIR)/libcunit_common.la +LIBCPUMASK_COMMON = $(COMMON_DIR)/libcpumask_common.la +LIBTHRMASK_COMMON = $(COMMON_DIR)/libthrmask_common.la +LIBODP = $(LIB)/libodphelper-linux.la $(LIB)/libodp-linux.la diff --git a/test/platform/linux-generic/m4/configure.m4 b/test/platform/linux-generic/m4/configure.m4 new file mode 100644 index 0000000..8c3db21 --- /dev/null +++ b/test/platform/linux-generic/m4/configure.m4 @@ -0,0 +1,5 @@ +AC_CONFIG_FILES([test/platform/linux-generic/Makefile + test/platform/linux-generic/shmem/Makefile + test/platform/linux-generic/pktio/Makefile + test/platform/linux-generic/pktio_ipc/Makefile + test/platform/linux-generic/ring/Makefile]) diff --git a/test/platform/linux-generic/pktio/.gitignore b/test/platform/linux-generic/pktio/.gitignore new file mode 100644 index 0000000..7e563b8 --- /dev/null +++ b/test/platform/linux-generic/pktio/.gitignore @@ -0,0 +1,2 @@ +*.log +*.trs diff --git a/test/platform/linux-generic/pktio/Makefile.am b/test/platform/linux-generic/pktio/Makefile.am new file mode 100644 index 0000000..209405d --- /dev/null +++ b/test/platform/linux-generic/pktio/Makefile.am @@ -0,0 +1,17 @@ +include $(top_srcdir)/test/platform/linux-generic/Makefile.inc + +dist_check_SCRIPTS = pktio_env \ + pktio_run.sh \ + pktio_run_tap.sh + +if HAVE_PCAP +dist_check_SCRIPTS += pktio_run_pcap.sh +endif +if netmap_support +dist_check_SCRIPTS += pktio_run_netmap.sh +endif +if PKTIO_DPDK +dist_check_SCRIPTS += pktio_run_dpdk.sh +endif + +test_SCRIPTS = $(dist_check_SCRIPTS) diff --git a/test/platform/linux-generic/pktio/pktio_env b/test/platform/linux-generic/pktio/pktio_env new file mode 100644 index 0000000..345b5bd --- /dev/null +++ b/test/platform/linux-generic/pktio/pktio_env @@ -0,0 +1,120 @@ +#!/bin/sh +# +# Copyright (c) 2015, Linaro Limited +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# +# Test script wrapper for running ODP pktio apps on linux-generic. +# +# For linux-generic the default behavior is to create two pairs of +# virtual Ethernet interfaces and provide the names of these via +# environment variables to pktio apps, the interfaces will be removed +# before the script exits. +# +# Note that the creation of virtual Ethernet devices depends on having +# CONFIG_VETH enabled in the kernel, if not enabled the env setup will be skipped. +# +# Network set up +# IF0 <---> IF1 +# IF2 <---> IF3 +IF0=pktiop0p1 +IF1=pktiop1p0 +IF2=pktiop2p3 +IF3=pktiop3p2 + +if [ "$0" = "$BASH_SOURCE" ]; then + echo "Error: Platform specific env file has to be sourced." +fi + +check_for_root() +{ + if [ "$(id -u)" != "0" ]; then + echo "check_for_root(): need to be root to setup VETH" + return 1 + fi + return 0 +} + +# wait for a network interface's operational state to be "up" +wait_for_iface_up() +{ + iface=$1 + cnt=0 + + while [ $cnt -lt 50 ]; do + read operstate < /sys/class/net/$iface/operstate + + if [ $? -ne 0 ]; then + break + elif [ "$operstate" = "up" ]; then + return 0 + fi + + sleep 0.1 + cnt=`expr $cnt + 1` + done + + return 1 +} + +setup_pktio_env() +{ + echo "pktio: setting up test interfaces $IF0, $IF1, $IF2, $IF3." + + check_for_root + if [ $? -ne 0 ]; then + return 1 + fi + + for iface in $IF0 $IF1 $IF2 $IF3; do + ip link show $iface 2> /dev/null + if [ $? -eq 0 ]; then + echo "pktio: interface $iface already exist $?" + return 2 + fi + done + + if [ "$1" = "clean" ]; then + trap cleanup_pktio_env EXIT + fi + + ip link add $IF0 type veth peer name $IF1 + if [ $? -ne 0 ]; then + echo "pktio: error: unable to create veth pair" + return 3 + fi + ip link add $IF2 type veth peer name $IF3 + if [ $? -ne 0 ]; then + echo "pktio: error: unable to create veth pair" + return 4 + fi + + for iface in $IF0 $IF1 $IF2 $IF3; do + ip link set $iface mtu 9216 up + ifconfig $iface -arp + done + + # check that the interface has come up before starting the test + for iface in $IF0 $IF1 $IF2 $IF3; do + wait_for_iface_up $iface + if [ $? -ne 0 ]; then + echo "pktio: interface $iface failed to come up" + return 5 + fi + done +} + +cleanup_pktio_env() +{ + echo "pktio: removing test interfaces $IF0, $IF1, $IF2, $IF3" + check_for_root + if [ $? -ne 0 ]; then + return 1 + fi + + for iface in $IF0 $IF1 $IF2 $IF3; do + ip link del $iface 2> /dev/null + done + return 0 +} diff --git a/test/platform/linux-generic/pktio/pktio_run.sh b/test/platform/linux-generic/pktio/pktio_run.sh new file mode 100755 index 0000000..4840bb0 --- /dev/null +++ b/test/platform/linux-generic/pktio/pktio_run.sh @@ -0,0 +1,128 @@ +#!/bin/sh +# +# Copyright (c) 2015, Linaro Limited +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# + +# Proceed the pktio tests. This script expects at least one argument: +# setup) setup the pktio test environment +# cleanup) cleanup the pktio test environment +# run) run the pktio tests (setup, run, cleanup) +# extra arguments are passed unchanged to the test itself (pktio_main) +# Without arguments, "run" is assumed and no extra argument is passed to the +# test (legacy mode). +# + +# directory where platform script run-test resides +TEST_DIR="${TEST_DIR:-$PWD}" + +# out-of-tree build searches binaries in build directory +PATH=$TEST_DIR/pktio:$TEST_DIR/../../validation/pktio:$PATH + +# directory where test sources are, including scripts +TEST_SRC_DIR=$(dirname $0) + +# in-tree build searches binaries in source directory +PATH=$TEST_SRC_DIR:$TEST_SRC_DIR/../../../validation/pktio:$PATH + +# run standalone in-tree searches binaries in . +# run standaline out-of-tree requires manually setting PATH +PATH=.:$PATH + +pktio_main_path=$(which pktio_main${EXEEXT}) +if [ -x "$pktio_main_path" ] ; then + echo "running with pktio_main: $pktio_run_path" +else + echo "cannot find pktio_main: please set you PATH for it." +fi + +# exit codes expected by automake for skipped tests +TEST_SKIPPED=77 + +# Use installed pktio env or for make check take it from platform directory +if [ -f "./pktio_env" ]; then + . ./pktio_env +elif [ -f ${TEST_SRC_DIR}/pktio_env ]; then + . ${TEST_SRC_DIR}/pktio_env +else + echo "BUG: unable to find pktio_env!" + echo "pktio_env has to be in current directory" \ + "or in platform/\$ODP_PLATFORM/test." + echo "ODP_PLATFORM=\"$ODP_PLATFORM\"" + exit 1 +fi + +run_test() +{ + local ret=0 + + # environment variables are used to control which socket method is + # used, so try each combination to ensure decent coverage. + for distype in MMAP MMSG; do + unset ODP_PKTIO_DISABLE_SOCKET_${distype} + done + + # this script doesn't support testing with netmap + export ODP_PKTIO_DISABLE_NETMAP=y + + for distype in SKIP MMAP; do + if [ "$disabletype" != "SKIP" ]; then + export ODP_PKTIO_DISABLE_SOCKET_${distype}=y + fi + pktio_main${EXEEXT} $* + if [ $? -ne 0 ]; then + ret=1 + fi + done + + if [ $ret -ne 0 ]; then + echo "!!! FAILED !!!" + fi + + return $ret +} + +run() +{ + echo "pktio: using 'loop' device" + pktio_main${EXEEXT} $* + loop_ret=$? + + # need to be root to run tests with real interfaces + if [ "$(id -u)" != "0" ]; then + exit $ret + fi + + if [ "$ODP_PKTIO_IF0" = "" ]; then + # no interfaces specified, use default veth interfaces + # setup by the pktio_env script + setup_pktio_env clean + if [ $? != 0 ]; then + echo "Failed to setup test environment, skipping test." + exit $TEST_SKIPPED + fi + export ODP_PKTIO_IF0=$IF0 + export ODP_PKTIO_IF1=$IF1 + fi + + run_test + ret=$? + + [ $ret = 0 ] && ret=$loop_ret + + exit $ret +} + +if [ $# != 0 ]; then + action=$1 + shift +fi + +case "$action" in + setup) setup_pktio_env ;; + cleanup) cleanup_pktio_env ;; + run) run ;; + *) run ;; +esac diff --git a/test/platform/linux-generic/pktio/pktio_run_dpdk.sh b/test/platform/linux-generic/pktio/pktio_run_dpdk.sh new file mode 100755 index 0000000..ef5223e --- /dev/null +++ b/test/platform/linux-generic/pktio/pktio_run_dpdk.sh @@ -0,0 +1,100 @@ +#!/bin/sh +# +# Copyright (c) 2016, Linaro Limited +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# + +# Proceed the pktio tests. This script expects at least one argument: +# setup) setup the pktio test environment +# cleanup) cleanup the pktio test environment +# run) run the pktio tests (setup, run, cleanup) +# extra arguments are passed unchanged to the test itself (pktio_main) +# Without arguments, "run" is assumed and no extra argument is passed to the +# test (legacy mode). +# + +# directory where platform script run-test resides +TEST_DIR="${TEST_DIR:-$PWD}" + +# out-of-tree build searches binaries in build directory +PATH=$TEST_DIR/pktio:$TEST_DIR/../../validation/pktio:$PATH + +# directory where test sources are, including scripts +TEST_SRC_DIR=$(dirname $0) + +# in-tree build searches binaries in source directory +PATH=$TEST_SRC_DIR:$TEST_SRC_DIR/../../../validation/pktio:$PATH + +# run standalone in-tree searches binaries in . +# run standaline out-of-tree requires manually setting PATH +PATH=.:$PATH + +pktio_main_path=$(which pktio_main${EXEEXT}) +if [ -x "$pktio_main_path" ] ; then + echo "running with pktio_main: $pktio_run_path" +else + echo "cannot find pktio_main: please set you PATH for it." +fi + +# exit codes expected by automake for skipped tests +TEST_SKIPPED=77 + +# Use installed pktio env or for make check take it from platform directory +if [ -f "./pktio_env" ]; then + . ./pktio_env +elif [ -f ${TEST_SRC_DIR}/pktio_env ]; then + . ${TEST_SRC_DIR}/pktio_env +else + echo "BUG: unable to find pktio_env!" + echo "pktio_env has to be in current directory" \ + "or in platform/\$ODP_PLATFORM/test." + echo "ODP_PLATFORM=\"$ODP_PLATFORM\"" + exit 1 +fi + +run_test() +{ + local ret=0 + + pktio_main${EXEEXT} $* + ret=$? + if [ $ret -ne 0 ]; then + echo "!!! FAILED !!!" + fi + + exit $ret +} + +run() +{ + # need to be root to set the interface. + if [ "$(id -u)" != "0" ]; then + echo "pktio: need to be root to setup DPDK interfaces." + return $TEST_SKIPPED + fi + + if [ "$ODP_PKTIO_IF0" = "" ]; then + setup_pktio_env clean + IF0_PARAMS="--vdev eth_pcap0,iface=$IF0" + IF1_PARAMS="--vdev eth_pcap1,iface=$IF1" + export ODP_PKTIO_DPDK_PARAMS="$IF0_PARAMS $IF1_PARAMS" + export ODP_PKTIO_IF0=0 + export ODP_PKTIO_IF1=1 + fi + + run_test +} + +if [ $# != 0 ]; then + action=$1 + shift +fi + +case "$1" in + setup) setup_pktio_env ;; + cleanup) cleanup_pktio_env ;; + run) run ;; + *) run ;; +esac diff --git a/test/platform/linux-generic/pktio/pktio_run_netmap.sh b/test/platform/linux-generic/pktio/pktio_run_netmap.sh new file mode 100755 index 0000000..11f02ec --- /dev/null +++ b/test/platform/linux-generic/pktio/pktio_run_netmap.sh @@ -0,0 +1,125 @@ +#!/bin/sh +# +# Copyright (c) 2016, Linaro Limited +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# + +# any parameter passed as arguments to this script is passed unchanged to +# the test itself (pktio_main) + +# directory where platform script run-test resides +TEST_DIR="${TEST_DIR:-$PWD}" + +# out-of-tree build searches binaries in build directory +PATH=$TEST_DIR/pktio:$TEST_DIR/../../validation/pktio:$PATH + +# directory where test sources are, including scripts +TEST_SRC_DIR=$(dirname $0) + +# in-tree build searches binaries in source directory +PATH=$TEST_SRC_DIR:$TEST_SRC_DIR/../../../validation/pktio:$PATH + +# run standalone in-tree searches binaries in . +# run standaline out-of-tree requires manually setting PATH +PATH=.:$PATH + +pktio_main_path=$(which pktio_main${EXEEXT}) +if [ -x "$pktio_main_path" ] ; then + echo "running with pktio_main: $pktio_main_path" +else + echo "cannot find pktio_main: please set you PATH for it." +fi + +# exit codes expected by automake for skipped tests +TEST_SKIPPED=77 + +# Use installed pktio env or for make check take it from the test directory +if [ -f "./pktio_env" ]; then + . ./pktio_env +elif [ -f ${TEST_SRC_DIR}/pktio_env ]; then + . ${TEST_SRC_DIR}/pktio_env +else + echo "ERROR: unable to find pktio_env!" + echo "pktio_env has to be in current directory or in ${TEST_SRC_DIR}" + exit 1 +fi + +run_test() +{ + local ret=0 + + pktio_main${EXEEXT} $* + ret=$? + + if [ $ret -ne 0 ]; then + echo "!!! FAILED !!!" + fi + + return $ret +} + +run_test_vale() +{ + # use two vale ports on the same switch + export ODP_PKTIO_IF0=valetest:0 + export ODP_PKTIO_IF1=valetest:1 + run_test + return $? +} + +run_test_pipe() +{ + # use a netmap pipe + export ODP_PKTIO_IF0=valetest:0{0 + export ODP_PKTIO_IF1=valetest:0}0 + run_test + return $? +} + +run_test_veth() +{ + if [ "$(lsmod | grep veth)" = "" ]; then + echo "netmap enabled veth module not loaded, skipping test." + return 0 + fi + + setup_pktio_env clean + export ODP_PKTIO_IF0=$IF0 + export ODP_PKTIO_IF1=$IF1 + run_test + return $? +} + +run() +{ + local ret=0 + + # need to be root to run these tests + if [ "$(id -u)" != "0" ]; then + echo "netmap tests must be run as root, skipping test." + exit $TEST_SKIPPED + fi + + if [ "$(lsmod | grep netmap)" = "" ]; then + echo "netmap kernel module not loaded, skipping test." + exit $TEST_SKIPPED + fi + + if [ "$ODP_PKTIO_IF0" != "" ]; then + run_test + ret=$? + else + run_test_vale + r=$?; [ $ret = 0 ] && ret=$r + run_test_pipe + r=$?; [ $ret = 0 ] && ret=$r + run_test_veth + r=$?; [ $ret = 0 ] && ret=$r + fi + + exit $ret +} + +run diff --git a/test/platform/linux-generic/pktio/pktio_run_pcap.sh b/test/platform/linux-generic/pktio/pktio_run_pcap.sh new file mode 100755 index 0000000..6d0e5a9 --- /dev/null +++ b/test/platform/linux-generic/pktio/pktio_run_pcap.sh @@ -0,0 +1,41 @@ +#!/bin/sh +# +# Copyright (c) 2015, Linaro Limited +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# + +# any parameter passed as arguments to this script is passed unchanged to +# the test itself (pktio_main) + +# directory where platform script run-test resides +TEST_DIR="${TEST_DIR:-$PWD}" + +# out-of-tree build searches binaries in build directory +PATH=$TEST_DIR/pktio:$TEST_DIR/../../validation/pktio:$PATH + +# directory where test sources are, including scripts +TEST_SRC_DIR=$(dirname $0) + +# in-tree build searches binaries in source directory +PATH=$TEST_SRC_DIR:$TEST_SRC_DIR/../../../validation/pktio:$PATH + +# run standalone in-tree searches binaries in . +# run standaline out-of-tree requires manually setting PATH +PATH=.:$PATH + +pktio_main_path=$(which pktio_main${EXEEXT}) +if [ -x "$pktio_main_path" ] ; then + echo "running with $pktio_main_path" +else + echo "cannot find pktio_main${EXEEXT}: please set you PATH for it." +fi + +PCAP_FNAME=vald.pcap +export ODP_PKTIO_IF0="pcap:out=${PCAP_FNAME}" +export ODP_PKTIO_IF1="pcap:in=${PCAP_FNAME}" +pktio_main${EXEEXT} $* +ret=$? +rm -f ${PCAP_FNAME} +exit $ret diff --git a/test/platform/linux-generic/pktio/pktio_run_tap.sh b/test/platform/linux-generic/pktio/pktio_run_tap.sh new file mode 100755 index 0000000..b823a15 --- /dev/null +++ b/test/platform/linux-generic/pktio/pktio_run_tap.sh @@ -0,0 +1,124 @@ +#!/bin/sh +# +# Copyright (c) 2015, Ilya Maximets +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# + + +# any parameter passed as arguments to this script is passed unchanged to +# the test itself (pktio_main) + +# directory where platform script run-test resides +TEST_DIR="${TEST_DIR:-$PWD}" + +# out-of-tree build searches binaries in build directory +PATH=$TEST_DIR/pktio:$TEST_DIR/../../validation/pktio:$PATH + +# directory where test sources are, including scripts +TEST_SRC_DIR=$(dirname $0) + +# in-tree build searches binaries in source directory +PATH=$TEST_SRC_DIR:$TEST_SRC_DIR/../../../validation/pktio:$PATH + +# run standalone in-tree searches binaries in . +# run standaline out-of-tree requires manually setting PATH +PATH=.:$PATH + +pktio_main_path=$(which pktio_main${EXEEXT}) +if [ -x "$pktio_main_path" ] ; then + echo "running with $pktio_main_path" +else + echo "cannot find pktio_main${EXEEXT}: please set you PATH for it." +fi + +# exit code expected by automake for skipped tests +TEST_SKIPPED=77 + +TAP_BASE_NAME=iotap_vald +IF0=${TAP_BASE_NAME}0 +IF1=${TAP_BASE_NAME}1 +BR=${TAP_BASE_NAME}_br + +export ODP_PKTIO_IF0="tap:$IF0" +export ODP_PKTIO_IF1="tap:$IF1" + +tap_cleanup() +{ + ret=$? + + for iface in $IF0 $IF1; do + ip link set dev $iface nomaster + done + + ip link delete $BR type bridge + + for iface in $IF0 $IF1; do + ip tuntap del mode tap $iface + done + + trap - EXIT + exit $ret +} + +tap_setup() +{ + if [ "$(id -u)" != "0" ]; then + echo "pktio: need to be root to setup TAP interfaces." + return $TEST_SKIPPED + fi + + for iface in $IF0 $IF1 $BR; do + ip link show $iface 2> /dev/null + if [ $? -eq 0 ]; then + echo "pktio: interface $iface already exist $?" + return 2 + fi + done + + trap tap_cleanup EXIT + + for iface in $IF0 $IF1; do + ip tuntap add mode tap $iface + if [ $? -ne 0 ]; then + echo "pktio: error: unable to create TAP device $iface" + return 3 + fi + done + + ip link add name $BR type bridge + if [ $? -ne 0 ]; then + echo "pktio: error: unable to create bridge $BR" + return 3 + fi + + for iface in $IF0 $IF1; do + ip link set dev $iface master $BR + if [ $? -ne 0 ]; then + echo "pktio: error: unable to add $iface to bridge $BR" + return 4 + fi + done + + for iface in $IF0 $IF1 $BR; do + ifconfig $iface -arp + sysctl -w net.ipv6.conf.${iface}.disable_ipv6=1 + ip link set dev $iface mtu 9216 up + done + + return 0 +} + +tap_setup +ret=$? +if [ $ret -ne 0 ]; then + echo "pktio: tap_setup() FAILED!" + exit $TEST_SKIPPED +fi + +# Using ODP_WAIT_FOR_NETWORK to prevent fail if tap still not enabled in bridge +ODP_WAIT_FOR_NETWORK=yes pktio_main${EXEEXT} $* +ret=$? + +exit $ret diff --git a/test/platform/linux-generic/pktio_ipc/.gitignore b/test/platform/linux-generic/pktio_ipc/.gitignore new file mode 100644 index 0000000..49ee4fd --- /dev/null +++ b/test/platform/linux-generic/pktio_ipc/.gitignore @@ -0,0 +1,2 @@ +pktio_ipc1 +pktio_ipc2 diff --git a/test/platform/linux-generic/pktio_ipc/Makefile.am b/test/platform/linux-generic/pktio_ipc/Makefile.am new file mode 100644 index 0000000..c0dc242 --- /dev/null +++ b/test/platform/linux-generic/pktio_ipc/Makefile.am @@ -0,0 +1,15 @@ +include $(top_srcdir)/test/platform/linux-generic/Makefile.inc + +test_PROGRAMS = pktio_ipc1 \ + pktio_ipc2 + +pktio_ipc1_CFLAGS = $(AM_CFLAGS) -I${top_srcdir}/example +pktio_ipc2_CFLAGS = $(AM_CFLAGS) -I${top_srcdir}/example + +dist_pktio_ipc1_SOURCES = pktio_ipc1.c ipc_common.c +dist_pktio_ipc2_SOURCES = pktio_ipc2.c ipc_common.c + +EXTRA_DIST = ipc_common.h + +dist_check_SCRIPTS = pktio_ipc_run.sh +test_SCRIPTS = $(dist_check_SCRIPTS) diff --git a/test/platform/linux-generic/pktio_ipc/ipc_common.c b/test/platform/linux-generic/pktio_ipc/ipc_common.c new file mode 100644 index 0000000..2ee326e --- /dev/null +++ b/test/platform/linux-generic/pktio_ipc/ipc_common.c @@ -0,0 +1,162 @@ +/* Copyright (c) 2015, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "ipc_common.h" + +/** Run time in seconds */ +int run_time_sec; +int ipc_name_space; + +int ipc_odp_packet_sendall(odp_pktio_t pktio, + odp_packet_t pkt_tbl[], int num) +{ + int ret; + int sent = 0; + odp_time_t start_time; + odp_time_t end_time; + odp_time_t wait; + odp_pktout_queue_t pktout; + + start_time = odp_time_local(); + wait = odp_time_local_from_ns(ODP_TIME_SEC_IN_NS); + end_time = odp_time_sum(start_time, wait); + + if (odp_pktout_queue(pktio, &pktout, 1) != 1) { + EXAMPLE_ERR("no output queue\n"); + return -1; + } + + while (sent != num) { + ret = odp_pktout_send(pktout, &pkt_tbl[sent], num - sent); + if (ret < 0) + return -1; + + sent += ret; + + if (odp_time_cmp(end_time, odp_time_local()) < 0) + return -1; + } + + return 0; +} + +odp_pktio_t create_pktio(odp_pool_t pool) +{ + odp_pktio_param_t pktio_param; + odp_pktio_t ipc_pktio; + + odp_pktio_param_init(&pktio_param); + + printf("pid: %d, create IPC pktio\n", getpid()); + ipc_pktio = odp_pktio_open("ipc_pktio", pool, &pktio_param); + if (ipc_pktio == ODP_PKTIO_INVALID) + EXAMPLE_ABORT("Error: ipc pktio create failed.\n"); + + if (odp_pktin_queue_config(ipc_pktio, NULL)) { + EXAMPLE_ERR("Input queue config failed\n"); + return ODP_PKTIO_INVALID; + } + + if (odp_pktout_queue_config(ipc_pktio, NULL)) { + EXAMPLE_ERR("Output queue config failed\n"); + return ODP_PKTIO_INVALID; + } + + return ipc_pktio; +} + +/** + * Parse and store the command line arguments + * + * @param argc argument count + * @param argv[] argument vector + * @param appl_args Store application arguments here + */ +void parse_args(int argc, char *argv[]) +{ + int opt; + int long_index; + static struct option longopts[] = { + {"time", required_argument, NULL, 't'}, + {"ns", required_argument, NULL, 'n'}, /* ipc name space */ + {"help", no_argument, NULL, 'h'}, /* return 'h' */ + {NULL, 0, NULL, 0} + }; + + run_time_sec = 0; /* loop forever if time to run is 0 */ + ipc_name_space = 0; + + while (1) { + opt = getopt_long(argc, argv, "+t:n:h", + longopts, &long_index); + + if (opt == -1) + break; /* No more options */ + + switch (opt) { + case 't': + run_time_sec = atoi(optarg); + break; + case 'n': + ipc_name_space = atoi(optarg); + break; + case 'h': + usage(argv[0]); + exit(EXIT_SUCCESS); + break; + default: + break; + } + } + + optind = 1; /* reset 'extern optind' from the getopt lib */ + + if (!ipc_name_space) { + usage(argv[0]); + exit(1); + } +} + +/** + * Print system and application info + */ +void print_info(char *progname) +{ + printf("\n" + "ODP system info\n" + "---------------\n" + "ODP API version: %s\n" + "CPU model: %s\n" + "\n", + odp_version_api_str(), odp_cpu_model_str()); + + printf("Running ODP appl: \"%s\"\n" + "-----------------\n" + "Using IF: %s\n", + progname, pktio_name); + printf("\n\n"); + fflush(NULL); +} + +/** + * Prinf usage information + */ +void usage(char *progname) +{ + printf("\n" + "Usage: %s OPTIONS\n" + " E.g. -n ipc_name_space %s -t seconds\n" + "\n" + "OpenDataPlane odp-linux ipc test application.\n" + "\n" + "Mandatory OPTIONS:\n" + " -n, --ns IPC name space ID /dev/shm/odp--objname.\n" + "Optional OPTIONS\n" + " -h, --help Display help and exit.\n" + " -t, --time Time to run in seconds.\n" + "\n", NO_PATH(progname), NO_PATH(progname) + ); +} diff --git a/test/platform/linux-generic/pktio_ipc/ipc_common.h b/test/platform/linux-generic/pktio_ipc/ipc_common.h new file mode 100644 index 0000000..7bc483f --- /dev/null +++ b/test/platform/linux-generic/pktio_ipc/ipc_common.h @@ -0,0 +1,90 @@ +/* Copyright (c) 2015, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#define _POSIX_C_SOURCE 200809L +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +/** @def SHM_PKT_POOL_SIZE + * @brief Size of the shared memory block + */ +#define SHM_PKT_POOL_SIZE 8192 + +/** @def SHM_PKT_POOL_BUF_SIZE + * @brief Buffer size of the packet pool buffer + */ +#define SHM_PKT_POOL_BUF_SIZE 1856 + +/** @def MAX_PKT_BURST + * @brief Maximum number of packet bursts + */ +#define MAX_PKT_BURST 16 + +/** Get rid of path in filename - only for unix-type paths using '/' */ +#define NO_PATH(file_name) (strrchr((file_name), '/') ? \ + strrchr((file_name), '/') + 1 : (file_name)) + +#define TEST_SEQ_MAGIC 0x92749451 +#define TEST_SEQ_MAGIC_2 0x81638340 + +#define TEST_ALLOC_MAGIC 0x1234adcd + +/** magic number and sequence at start of packet payload */ +typedef struct ODP_PACKED { + odp_u32be_t magic; + odp_u32be_t seq; +} pkt_head_t; + +/** magic number at end of packet payload */ +typedef struct ODP_PACKED { + odp_u32be_t magic; +} pkt_tail_t; + +/** Application argument */ +char *pktio_name; + +/** Run time in seconds */ +int run_time_sec; + +/** IPC name space id /dev/shm/odp-nsid-objname */ +int ipc_name_space; + +/* helper funcs */ +void parse_args(int argc, char *argv[]); +void print_info(char *progname); +void usage(char *progname); + +/** + * Create a ipc pktio handle. + * + * @param pool Pool to associate with device for packet RX/TX + * + * @return The handle of the created pktio object. + * @retval ODP_PKTIO_INVALID if the create fails. + */ +odp_pktio_t create_pktio(odp_pool_t pool); + +/** Spin and send all packet from table + * + * @param pktio pktio device + * @param pkt_tbl packets table + * @param num number of packets + */ +int ipc_odp_packet_sendall(odp_pktio_t pktio, + odp_packet_t pkt_tbl[], int num); diff --git a/test/platform/linux-generic/pktio_ipc/pktio_ipc1.c b/test/platform/linux-generic/pktio_ipc/pktio_ipc1.c new file mode 100644 index 0000000..a4eed88 --- /dev/null +++ b/test/platform/linux-generic/pktio_ipc/pktio_ipc1.c @@ -0,0 +1,329 @@ +/* Copyright (c) 2015, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "ipc_common.h" + +/** + * @file + * @example pktio_ipc1.c ODP IPC example application. + * This application works in pair with pktio_ipc2 application. + * It opens ipc pktio, allocates packets, sets magic number and + * sends packets to ipc pktio. Then app reads packets and checks + * that magic number was properly updated and there is no packet + * loss (i.e. sequesce counter continiusly incrementing.) + */ + +/** + * Packet IO loopback worker thread using bursts from/to IO resources + * + * @param arg thread arguments of type 'thread_args_t *' + */ +static int pktio_run_loop(odp_pool_t pool) +{ + int thr; + int pkts; + odp_pktio_t ipc_pktio; + odp_packet_t pkt_tbl[MAX_PKT_BURST]; + uint64_t cnt = 0; /* increasing counter on each send packet */ + uint64_t cnt_recv = 0; /* increasing counter to validate + cnt on receive */ + uint64_t stat_pkts = 0; + uint64_t stat_pkts_alloc = 0; + uint64_t stat_pkts_prev = 0; + uint64_t stat_errors = 0; + odp_time_t start_cycle; + odp_time_t current_cycle; + odp_time_t cycle; + odp_time_t diff; + odp_time_t wait; + int ret; + odp_pktin_queue_t pktin; + + thr = odp_thread_id(); + + ipc_pktio = odp_pktio_lookup("ipc_pktio"); + if (ipc_pktio == ODP_PKTIO_INVALID) { + EXAMPLE_ERR(" [%02i] Error: lookup of pktio %s failed\n", + thr, "ipc_pktio"); + return -2; + } + printf(" [%02i] looked up ipc_pktio:%02" PRIu64 ", burst mode\n", + thr, odp_pktio_to_u64(ipc_pktio)); + + wait = odp_time_local_from_ns(run_time_sec * ODP_TIME_SEC_IN_NS); + start_cycle = odp_time_local(); + current_cycle = start_cycle; + + if (odp_pktin_queue(ipc_pktio, &pktin, 1) != 1) { + EXAMPLE_ERR("no input queue\n"); + return -1; + } + + /* start ipc pktio, i.e. wait until other process connects */ + for (;;) { + if (run_time_sec) { + cycle = odp_time_local(); + diff = odp_time_diff(cycle, start_cycle); + if (odp_time_cmp(wait, diff) < 0) { + printf("timeout exit, run_time_sec %d\n", + run_time_sec); + goto exit; + } + } + + ret = odp_pktio_start(ipc_pktio); + if (!ret) + break; + } + + /* packets loop */ + for (;;) { + int i; + + /* 1. exit loop if time specified */ + if (run_time_sec) { + cycle = odp_time_local(); + diff = odp_time_diff(cycle, start_cycle); + if (odp_time_cmp(wait, diff) < 0) { + EXAMPLE_DBG("exit after %d seconds\n", + run_time_sec); + break; + } + } + + /* 2. Receive packets back from ipc_pktio, validate magic + * number sequence counter and free that packet + */ + while (1) { + pkts = odp_pktin_recv(pktin, pkt_tbl, MAX_PKT_BURST); + if (pkts <= 0) + break; + + for (i = 0; i < pkts; i++) { + odp_packet_t pkt = pkt_tbl[i]; + pkt_head_t head; + pkt_tail_t tail; + size_t off; + + off = odp_packet_l4_offset(pkt); + if (off == ODP_PACKET_OFFSET_INVALID) + EXAMPLE_ABORT("invalid l4 offset\n"); + + off += ODPH_UDPHDR_LEN; + ret = odp_packet_copy_to_mem(pkt, off, + sizeof(head), + &head); + if (ret) { + stat_errors++; + odp_packet_free(pkt); + EXAMPLE_DBG("error\n"); + continue; + } + + if (head.magic == TEST_ALLOC_MAGIC) { + stat_pkts_alloc++; + odp_packet_free(pkt); + continue; + } + + if (head.magic != TEST_SEQ_MAGIC_2) { + stat_errors++; + odp_packet_free(pkt); + EXAMPLE_DBG("error\n"); + continue; + } + + off = odp_packet_len(pkt) - sizeof(pkt_tail_t); + ret = odp_packet_copy_to_mem(pkt, off, + sizeof(tail), + &tail); + if (ret) { + stat_errors++; + odp_packet_free(pkt); + continue; + } + + if (tail.magic != TEST_SEQ_MAGIC) { + stat_errors++; + odp_packet_free(pkt); + continue; + } + + cnt_recv++; + + if (head.seq != cnt_recv) { + stat_errors++; + odp_packet_free(pkt); + EXAMPLE_DBG("head.seq %d - " + "cnt_recv %" PRIu64 "" + " = %" PRIu64 "\n", + head.seq, cnt_recv, + head.seq - cnt_recv); + cnt_recv = head.seq; + continue; + } + + stat_pkts++; + odp_packet_free(pkt); + } + } + + /* 3. emulate that pkts packets were received */ + odp_random_data((uint8_t *)&pkts, sizeof(pkts), 0); + pkts = ((pkts & 0xffff) % MAX_PKT_BURST) + 1; + + for (i = 0; i < pkts; i++) { + odp_packet_t pkt; + + pkt = odp_packet_alloc(pool, SHM_PKT_POOL_BUF_SIZE); + if (pkt == ODP_PACKET_INVALID) + break; + + odp_packet_l4_offset_set(pkt, 30); + pkt_tbl[i] = pkt; + } + + /* exit if no packets allocated */ + if (i == 0) { + EXAMPLE_DBG("unable to alloc packet pkts %d/%d\n", + i, pkts); + break; + } + + pkts = i; + + /* 4. Copy counter and magic numbers to that packets */ + for (i = 0; i < pkts; i++) { + pkt_head_t head; + pkt_tail_t tail; + size_t off; + odp_packet_t pkt = pkt_tbl[i]; + + off = odp_packet_l4_offset(pkt); + if (off == ODP_PACKET_OFFSET_INVALID) + EXAMPLE_ABORT("packet L4 offset not set"); + + head.magic = TEST_SEQ_MAGIC; + head.seq = cnt++; + + off += ODPH_UDPHDR_LEN; + ret = odp_packet_copy_from_mem(pkt, off, sizeof(head), + &head); + if (ret) + EXAMPLE_ABORT("unable to copy in head data"); + + tail.magic = TEST_SEQ_MAGIC; + off = odp_packet_len(pkt) - sizeof(pkt_tail_t); + ret = odp_packet_copy_from_mem(pkt, off, sizeof(tail), + &tail); + if (ret) + EXAMPLE_ABORT("unable to copy in tail data"); + } + + /* 5. Send packets to ipc_pktio */ + ret = ipc_odp_packet_sendall(ipc_pktio, pkt_tbl, pkts); + if (ret < 0) { + EXAMPLE_DBG("unable to sending to ipc pktio\n"); + break; + } + + cycle = odp_time_local(); + diff = odp_time_diff(cycle, current_cycle); + if (odp_time_cmp(odp_time_local_from_ns(ODP_TIME_SEC_IN_NS), + diff) < 0) { + current_cycle = cycle; + printf("\rpkts: %" PRIu64 ", alloc %" PRIu64 "," + " errors %" PRIu64 ", pps %" PRIu64 ".", + stat_pkts, stat_pkts_alloc, stat_errors, + (stat_pkts + stat_pkts_alloc - stat_pkts_prev)); + fflush(stdout); + stat_pkts_prev = stat_pkts + stat_pkts_alloc; + } + } + + /* cleanup and exit */ + ret = odp_pktio_stop(ipc_pktio); + if (ret) { + EXAMPLE_DBG("odp_pktio_stop error %d\n", ret); + return -1; + } + +exit: + ret = odp_pktio_close(ipc_pktio); + if (ret) { + EXAMPLE_DBG("odp_pktio_close error %d\n", ret); + return -1; + } + + ret = odp_pool_destroy(pool); + if (ret) { + EXAMPLE_DBG("pool_destroy error %d\n", ret); + /* Remote process can end with reference to our local pool. + * Usully it unmaps it clenealy but some time there are some + * pending packets in the pool in case of remote process was + * trapped or did not call odp_pktio_close() correctly and + * release buffers and free buffer from shared rings. + * return -1; + */ + } + + return (stat_errors > 10 || stat_pkts < 1000) ? -1 : 0; +} + +/** + * ODP packet example main function + */ +int main(int argc, char *argv[]) +{ + odp_pool_t pool; + odp_pool_param_t params; + odp_instance_t instance; + odp_platform_init_t plat_idata; + int ret; + + /* Parse and store the application arguments */ + parse_args(argc, argv); + + memset(&plat_idata, 0, sizeof(odp_platform_init_t)); + plat_idata.ipc_ns = ipc_name_space; + + /* Init ODP before calling anything else */ + if (odp_init_global(&instance, NULL, &plat_idata)) { + EXAMPLE_ERR("Error: ODP global init failed.\n"); + exit(EXIT_FAILURE); + } + + /* Init this thread */ + if (odp_init_local(instance, ODP_THREAD_CONTROL)) { + EXAMPLE_ERR("Error: ODP local init failed.\n"); + exit(EXIT_FAILURE); + } + + /* Print both system and application information */ + print_info(NO_PATH(argv[0])); + + /* Create packet pool */ + memset(¶ms, 0, sizeof(params)); + params.pkt.seg_len = SHM_PKT_POOL_BUF_SIZE; + params.pkt.len = SHM_PKT_POOL_BUF_SIZE; + params.pkt.num = SHM_PKT_POOL_SIZE; + params.type = ODP_POOL_PACKET; + + pool = odp_pool_create("packet_pool1", ¶ms); + if (pool == ODP_POOL_INVALID) { + EXAMPLE_ERR("Error: packet pool create failed.\n"); + exit(EXIT_FAILURE); + } + + odp_pool_print(pool); + + create_pktio(pool); + + ret = pktio_run_loop(pool); + + EXAMPLE_DBG("return %d\n", ret); + return ret; +} diff --git a/test/platform/linux-generic/pktio_ipc/pktio_ipc2.c b/test/platform/linux-generic/pktio_ipc/pktio_ipc2.c new file mode 100644 index 0000000..c0c6ff5 --- /dev/null +++ b/test/platform/linux-generic/pktio_ipc/pktio_ipc2.c @@ -0,0 +1,197 @@ +/* Copyright (c) 2015, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/** + * @file + * + * @example pktio_ipc2.c ODP IPC example application. + * This application works in pair with pktio_ipc1 application. + * It opens ipc pktio, reads packets and updates magic number. + * Also it allocates some packets from internal pool and sends + * to ipc pktio. + */ + +#include "ipc_common.h" + +static int ipc_second_process(void) +{ + odp_pktio_t ipc_pktio; + odp_pool_param_t params; + odp_pool_t pool; + odp_packet_t pkt_tbl[MAX_PKT_BURST]; + odp_packet_t alloc_pkt; + int pkts; + int ret; + int i; + odp_time_t start_cycle; + odp_time_t cycle; + odp_time_t diff; + odp_time_t wait; + uint64_t stat_pkts = 0; + odp_pktin_queue_t pktin; + + /* Create packet pool */ + memset(¶ms, 0, sizeof(params)); + params.pkt.seg_len = SHM_PKT_POOL_BUF_SIZE; + params.pkt.len = SHM_PKT_POOL_BUF_SIZE; + params.pkt.num = SHM_PKT_POOL_SIZE; + params.type = ODP_POOL_PACKET; + + pool = odp_pool_create("packet_pool2", ¶ms); + if (pool == ODP_POOL_INVALID) { + EXAMPLE_ERR("Error: packet pool create failed.\n"); + exit(EXIT_FAILURE); + } + + ipc_pktio = create_pktio(pool); + + wait = odp_time_local_from_ns(run_time_sec * ODP_TIME_SEC_IN_NS); + start_cycle = odp_time_local(); + + if (odp_pktin_queue(ipc_pktio, &pktin, 1) != 1) { + EXAMPLE_ERR("no input queue\n"); + return -1; + } + + /* start ipc pktio, i.e. wait until other process connects */ + for (;;) { + /* 1. exit loop if time specified */ + if (run_time_sec) { + cycle = odp_time_local(); + diff = odp_time_diff(cycle, start_cycle); + if (odp_time_cmp(wait, diff) < 0) { + printf("timeout exit, run_time_sec %d\n", + run_time_sec); + goto exit; + } + } + + ret = odp_pktio_start(ipc_pktio); + if (!ret) + break; + } + + for (;;) { + /* exit loop if time specified */ + if (run_time_sec) { + cycle = odp_time_local(); + diff = odp_time_diff(cycle, start_cycle); + if (odp_time_cmp(wait, diff) < 0) { + EXAMPLE_DBG("exit after %d seconds\n", + run_time_sec); + break; + } + } + + /* recv some packets and change MAGIC to MAGIC_2 */ + pkts = odp_pktin_recv(pktin, pkt_tbl, MAX_PKT_BURST); + if (pkts <= 0) + continue; + + for (i = 0; i < pkts; i++) { + odp_packet_t pkt = pkt_tbl[i]; + pkt_head_t head; + size_t off; + + off = odp_packet_l4_offset(pkt); + if (off == ODP_PACKET_OFFSET_INVALID) + EXAMPLE_ABORT("invalid l4 offset\n"); + + off += ODPH_UDPHDR_LEN; + ret = odp_packet_copy_to_mem(pkt, off, sizeof(head), + &head); + if (ret) + EXAMPLE_ABORT("unable copy out head data"); + + if (head.magic != TEST_SEQ_MAGIC) + EXAMPLE_ABORT("Wrong head magic!"); + + /* Modify magic number in packet */ + head.magic = TEST_SEQ_MAGIC_2; + ret = odp_packet_copy_from_mem(pkt, off, sizeof(head), + &head); + if (ret) + EXAMPLE_ABORT("unable to copy in head data"); + } + + /* send all packets back */ + ret = ipc_odp_packet_sendall(ipc_pktio, pkt_tbl, pkts); + if (ret < 0) + EXAMPLE_ABORT("can not send packets\n"); + stat_pkts += pkts; + + /* alloc packet from local pool, set magic to ALLOC_MAGIC, + * and send it.*/ + alloc_pkt = odp_packet_alloc(pool, SHM_PKT_POOL_BUF_SIZE); + if (alloc_pkt != ODP_PACKET_INVALID) { + pkt_head_t head; + size_t off; + + odp_packet_l4_offset_set(alloc_pkt, 30); + + head.magic = TEST_ALLOC_MAGIC; + + off = odp_packet_l4_offset(alloc_pkt); + off += ODPH_UDPHDR_LEN; + ret = odp_packet_copy_from_mem(alloc_pkt, off, + sizeof(head), + &head); + if (ret) + EXAMPLE_ABORT("unable to copy in head data"); + + pkt_tbl[0] = alloc_pkt; + ret = ipc_odp_packet_sendall(ipc_pktio, pkt_tbl, 1); + if (ret < 0) + EXAMPLE_ABORT("can not send packets\n"); + stat_pkts += 1; + } + } + + /* cleanup and exit */ + ret = odp_pktio_stop(ipc_pktio); + if (ret) { + EXAMPLE_DBG("odp_pktio_stop error %d\n", ret); + return -1; + } + +exit: + ret = odp_pktio_close(ipc_pktio); + if (ret) { + EXAMPLE_DBG("odp_pktio_close error %d\n", ret); + return -1; + } + + ret = odp_pool_destroy(pool); + if (ret) + EXAMPLE_DBG("pool_destroy error %d\n", ret); + + return stat_pkts > 1000 ? 0 : -1; +} + +int main(int argc, char *argv[]) +{ + odp_instance_t instance; + odp_platform_init_t plat_idata; + + /* Parse and store the application arguments */ + parse_args(argc, argv); + + memset(&plat_idata, 0, sizeof(odp_platform_init_t)); + plat_idata.ipc_ns = ipc_name_space; + + if (odp_init_global(&instance, NULL, &plat_idata)) { + EXAMPLE_ERR("Error: ODP global init failed.\n"); + exit(EXIT_FAILURE); + } + + /* Init this thread */ + if (odp_init_local(instance, ODP_THREAD_CONTROL)) { + EXAMPLE_ERR("Error: ODP local init failed.\n"); + exit(EXIT_FAILURE); + } + + return ipc_second_process(); +} diff --git a/test/platform/linux-generic/pktio_ipc/pktio_ipc_run.sh b/test/platform/linux-generic/pktio_ipc/pktio_ipc_run.sh new file mode 100755 index 0000000..c05bb4f --- /dev/null +++ b/test/platform/linux-generic/pktio_ipc/pktio_ipc_run.sh @@ -0,0 +1,77 @@ +#!/bin/sh +# +# Copyright (c) 2015, Linaro Limited +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# + +# directory where platform script run-test resides +TEST_DIR="${TEST_DIR:-$PWD}" + +# out-of-tree build searches binaries in build directory +PATH=$TEST_DIR/pktio_ipc:$TEST_DIR/../../validation/pktio:$PATH + +# directory where test sources are, including scripts +TEST_SRC_DIR=$(dirname $0) + +# in-tree build searches binaries in source directory +PATH=$TEST_SRC_DIR:$TEST_SRC_DIR/../../../validation/pktio:$PATH + +# run standalone in-tree searches binaries in . +# run standaline out-of-tree requires manually setting PATH +PATH=.:$PATH + +run() +{ + local ret=0 + IPC_NS=$$ + + #if test was interrupted with CTRL+c than files + #might remain in shm. Needed cleanely delete them. + rm -rf /dev/shm/odp-${IPC_NS}* 2>&1 > /dev/null + + echo "==== run pktio_ipc1 then pktio_ipc2 ====" + pktio_ipc1${EXEEXT} -n ${IPC_NS} -t 30 & + IPC_PID=$! + + pktio_ipc2${EXEEXT} -n ${IPC_NS} -t 10 + ret=$? + # pktio_ipc1 should do clean up and exit just + # after pktio_ipc2 exited. If it does not happen + # kill him in test. + sleep 1 + kill ${IPC_PID} 2>&1 > /dev/null + if [ $? -eq 0 ]; then + rm -rf /dev/shm/odp-${IPC_NS}* 2>&1 > /dev/null + fi + + if [ $ret -ne 0 ]; then + echo "!!!First stage FAILED $ret!!!" + exit $ret + else + echo "First stage PASSED" + fi + + echo "==== run pktio_ipc2 then pktio_ipc1 ====" + pktio_ipc2${EXEEXT} -n ${IPC_NS} -t 10 & + IPC_PID=$! + + pktio_ipc1${EXEEXT} -n ${IPC_NS} -t 20 + ret=$? + (kill ${IPC_PID} 2>&1 > /dev/null) > /dev/null || true + + if [ $ret -ne 0 ]; then + echo "!!! FAILED !!!" + exit $ret + else + echo "Second stage PASSED" + fi + + echo "!!!PASSED!!!" + exit 0 +} + +case "$1" in + *) run ;; +esac diff --git a/test/platform/linux-generic/ring/.gitignore b/test/platform/linux-generic/ring/.gitignore new file mode 100644 index 0000000..7341a34 --- /dev/null +++ b/test/platform/linux-generic/ring/.gitignore @@ -0,0 +1 @@ +ring_main diff --git a/test/platform/linux-generic/ring/Makefile.am b/test/platform/linux-generic/ring/Makefile.am new file mode 100644 index 0000000..805d87d --- /dev/null +++ b/test/platform/linux-generic/ring/Makefile.am @@ -0,0 +1,13 @@ +include $(top_srcdir)/test/platform/linux-generic/Makefile.inc + +noinst_LTLIBRARIES = libtestring.la +libtestring_la_SOURCES = ring_suites.c ring_basic.c ring_stress.c +libtestring_la_CFLAGS = $(AM_CFLAGS) $(INCCUNIT_COMMON) $(INCODP) + +test_PROGRAMS = ring_main$(EXEEXT) +dist_ring_main_SOURCES = ring_main.c + +ring_main_LDFLAGS = $(AM_LDFLAGS) +ring_main_LDADD = libtestring.la $(LIBCUNIT_COMMON) $(LIBODP) + +noinst_HEADERS = ring_suites.h diff --git a/test/platform/linux-generic/ring/ring_basic.c b/test/platform/linux-generic/ring/ring_basic.c new file mode 100644 index 0000000..926dc46 --- /dev/null +++ b/test/platform/linux-generic/ring/ring_basic.c @@ -0,0 +1,361 @@ +/* Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/** + * @file + * + * ODP ring basic test + */ + +#include +#include +#include + +#include +#include +#include + +#include "ring_suites.h" + +/* labor functions declaration */ +static void __do_basic_burst(_ring_t *r); +static void __do_basic_bulk(_ring_t *r); +static void __do_basic_watermark(_ring_t *r); + +/* dummy object pointers for enqueue and dequeue testing */ +static void **test_enq_data; +static void **test_deq_data; + +/* create two rings: one for single thread usage scenario + * and another for multiple thread usage scenario. + * st - single thread usage scenario + * mt - multiple thread usage scenario + */ +static const char *st_ring_name = "ST basic ring"; +static const char *mt_ring_name = "MT basic ring"; +static _ring_t *st_ring, *mt_ring; + +int ring_test_basic_start(void) +{ + int i = 0; + + /* alloc dummy object pointers for enqueue testing */ + test_enq_data = malloc(RING_SIZE * 2 * sizeof(void *)); + if (NULL == test_enq_data) { + LOG_ERR("failed to allocate basic test enqeue data\n"); + return -1; + } + + for (i = 0; i < RING_SIZE * 2; i++) + test_enq_data[i] = (void *)(unsigned long)i; + + /* alloc dummy object pointers for dequeue testing */ + test_deq_data = malloc(RING_SIZE * 2 * sizeof(void *)); + if (NULL == test_deq_data) { + LOG_ERR("failed to allocate basic test dequeue data\n"); + free(test_enq_data); test_enq_data = NULL; + return -1; + } + + memset(test_deq_data, 0, RING_SIZE * 2 * sizeof(void *)); + return 0; +} + +int ring_test_basic_end(void) +{ + _ring_destroy(st_ring_name); + _ring_destroy(mt_ring_name); + + free(test_enq_data); + free(test_deq_data); + return 0; +} + +/* basic test cases */ +void ring_test_basic_create(void) +{ + /* prove illegal size shall fail */ + st_ring = _ring_create(st_ring_name, ILLEGAL_SIZE, 0); + CU_ASSERT(NULL == st_ring); + CU_ASSERT(EINVAL == __odp_errno); + + /* create ring for single thread usage scenario */ + st_ring = _ring_create(st_ring_name, RING_SIZE, + _RING_F_SP_ENQ | _RING_F_SC_DEQ); + + CU_ASSERT(NULL != st_ring); + CU_ASSERT(_ring_lookup(st_ring_name) == st_ring); + + /* create ring for multiple thread usage scenario */ + mt_ring = _ring_create(mt_ring_name, RING_SIZE, + _RING_SHM_PROC); + + CU_ASSERT(NULL != mt_ring); + CU_ASSERT(_ring_lookup(mt_ring_name) == mt_ring); +} + +void ring_test_basic_burst(void) +{ + /* two rounds to cover both single + * thread and multiple thread APIs + */ + __do_basic_burst(st_ring); + __do_basic_burst(mt_ring); +} + +void ring_test_basic_bulk(void) +{ + __do_basic_bulk(st_ring); + __do_basic_bulk(mt_ring); +} + +void ring_test_basic_watermark(void) +{ + __do_basic_watermark(st_ring); + __do_basic_watermark(mt_ring); +} + +/* labor functions definition */ +static void __do_basic_burst(_ring_t *r) +{ + int result = 0; + unsigned int count = 0; + void * const *source = test_enq_data; + void * const *dest = test_deq_data; + void **enq = NULL, **deq = NULL; + + enq = test_enq_data; deq = test_deq_data; + + /* ring is empty */ + CU_ASSERT(1 == _ring_empty(r)); + + /* enqueue 1 object */ + result = _ring_enqueue_burst(r, enq, 1); + enq += 1; + CU_ASSERT(1 == (result & _RING_SZ_MASK)); + + /* enqueue 2 objects */ + result = _ring_enqueue_burst(r, enq, 2); + enq += 2; + CU_ASSERT(2 == (result & _RING_SZ_MASK)); + + /* enqueue HALF_BULK objects */ + result = _ring_enqueue_burst(r, enq, HALF_BULK); + enq += HALF_BULK; + CU_ASSERT(HALF_BULK == (result & _RING_SZ_MASK)); + + /* ring is neither empty nor full */ + CU_ASSERT(0 == _ring_full(r)); + CU_ASSERT(0 == _ring_empty(r)); + + /* _ring_count() equals enqueued */ + count = (1 + 2 + HALF_BULK); + CU_ASSERT(count == _ring_count(r)); + /* _ring_free_count() equals rooms left */ + count = (RING_SIZE - 1) - count; + CU_ASSERT(count == _ring_free_count(r)); + + /* exceed the size, enquene as many as possible */ + result = _ring_enqueue_burst(r, enq, HALF_BULK); + enq += count; + CU_ASSERT(count == (result & _RING_SZ_MASK)); + CU_ASSERT(1 == _ring_full(r)); + + /* dequeue 1 object */ + result = _ring_dequeue_burst(r, deq, 1); + deq += 1; + CU_ASSERT(1 == (result & _RING_SZ_MASK)); + + /* dequeue 2 objects */ + result = _ring_dequeue_burst(r, deq, 2); + deq += 2; + CU_ASSERT(2 == (result & _RING_SZ_MASK)); + + /* dequeue HALF_BULK objects */ + result = _ring_dequeue_burst(r, deq, HALF_BULK); + deq += HALF_BULK; + CU_ASSERT(HALF_BULK == (result & _RING_SZ_MASK)); + + /* _ring_free_count() equals dequeued */ + count = (1 + 2 + HALF_BULK); + CU_ASSERT(count == _ring_free_count(r)); + /* _ring_count() equals remained left */ + count = (RING_SIZE - 1) - count; + CU_ASSERT(count == _ring_count(r)); + + /* underrun the size, dequeue as many as possible */ + result = _ring_dequeue_burst(r, deq, HALF_BULK); + deq += count; + CU_ASSERT(count == (result & _RING_SZ_MASK)); + CU_ASSERT(1 == _ring_empty(r)); + + /* check data */ + CU_ASSERT(0 == memcmp(source, dest, deq - dest)); + + /* reset dequeue data */ + memset(test_deq_data, 0, RING_SIZE * 2 * sizeof(void *)); +} + +/* incomplete ring API set: strange! + * complement _ring_enqueue/dequeue_bulk to improve coverage + */ +static inline int __ring_enqueue_bulk( + _ring_t *r, void * const *objects, unsigned bulk) +{ + if (r->prod.sp_enqueue) + return _ring_sp_enqueue_bulk(r, objects, bulk); + else + return _ring_mp_enqueue_bulk(r, objects, bulk); +} + +static inline int __ring_dequeue_bulk( + _ring_t *r, void **objects, unsigned bulk) +{ + if (r->cons.sc_dequeue) + return _ring_sc_dequeue_bulk(r, objects, bulk); + else + return _ring_mc_dequeue_bulk(r, objects, bulk); +} + +static void __do_basic_bulk(_ring_t *r) +{ + int result = 0; + unsigned int count = 0; + void * const *source = test_enq_data; + void * const *dest = test_deq_data; + void **enq = NULL, **deq = NULL; + + enq = test_enq_data; deq = test_deq_data; + + /* ring is empty */ + CU_ASSERT(1 == _ring_empty(r)); + + /* enqueue 1 object */ + result = __ring_enqueue_bulk(r, enq, 1); + enq += 1; + CU_ASSERT(0 == result); + + /* enqueue 2 objects */ + result = __ring_enqueue_bulk(r, enq, 2); + enq += 2; + CU_ASSERT(0 == result); + + /* enqueue HALF_BULK objects */ + result = __ring_enqueue_bulk(r, enq, HALF_BULK); + enq += HALF_BULK; + CU_ASSERT(0 == result); + + /* ring is neither empty nor full */ + CU_ASSERT(0 == _ring_full(r)); + CU_ASSERT(0 == _ring_empty(r)); + + /* _ring_count() equals enqueued */ + count = (1 + 2 + HALF_BULK); + CU_ASSERT(count == _ring_count(r)); + /* _ring_free_count() equals rooms left */ + count = (RING_SIZE - 1) - count; + CU_ASSERT(count == _ring_free_count(r)); + + /* exceed the size, enquene shall fail with -ENOBUFS */ + result = __ring_enqueue_bulk(r, enq, HALF_BULK); + CU_ASSERT(-ENOBUFS == result); + + /* fullful the ring */ + result = __ring_enqueue_bulk(r, enq, count); + enq += count; + CU_ASSERT(0 == result); + CU_ASSERT(1 == _ring_full(r)); + + /* dequeue 1 object */ + result = __ring_dequeue_bulk(r, deq, 1); + deq += 1; + CU_ASSERT(0 == result); + + /* dequeue 2 objects */ + result = __ring_dequeue_bulk(r, deq, 2); + deq += 2; + CU_ASSERT(0 == result); + + /* dequeue HALF_BULK objects */ + result = __ring_dequeue_bulk(r, deq, HALF_BULK); + deq += HALF_BULK; + CU_ASSERT(0 == result); + + /* _ring_free_count() equals dequeued */ + count = (1 + 2 + HALF_BULK); + CU_ASSERT(count == _ring_free_count(r)); + /* _ring_count() equals remained left */ + count = (RING_SIZE - 1) - count; + CU_ASSERT(count == _ring_count(r)); + + /* underrun the size, dequeue shall fail with -ENOENT */ + result = __ring_dequeue_bulk(r, deq, HALF_BULK); + CU_ASSERT(-ENOENT == result); + + /* empty the queue */ + result = __ring_dequeue_bulk(r, deq, count); + deq += count; + CU_ASSERT(0 == result); + CU_ASSERT(1 == _ring_empty(r)); + + /* check data */ + CU_ASSERT(0 == memcmp(source, dest, deq - dest)); + + /* reset dequeue data */ + memset(test_deq_data, 0, RING_SIZE * 2 * sizeof(void *)); +} + +void __do_basic_watermark(_ring_t *r) +{ + int result = 0; + void * const *source = test_enq_data; + void * const *dest = test_deq_data; + void **enq = NULL, **deq = NULL; + + enq = test_enq_data; deq = test_deq_data; + + /* bulk = 3/4 watermark to trigger alarm on 2nd enqueue */ + const unsigned watermark = PIECE_BULK; + const unsigned bulk = (watermark / 4) * 3; + + /* watermark cannot exceed ring size */ + result = _ring_set_water_mark(r, ILLEGAL_SIZE); + CU_ASSERT(-EINVAL == result); + + /* set watermark */ + result = _ring_set_water_mark(r, watermark); + CU_ASSERT(0 == result); + + /* 1st enqueue shall succeed */ + result = __ring_enqueue_bulk(r, enq, bulk); + enq += bulk; + CU_ASSERT(0 == result); + + /* 2nd enqueue shall succeed but return -EDQUOT */ + result = __ring_enqueue_bulk(r, enq, bulk); + enq += bulk; + CU_ASSERT(-EDQUOT == result); + + /* dequeue 1st bulk */ + result = __ring_dequeue_bulk(r, deq, bulk); + deq += bulk; + CU_ASSERT(0 == result); + + /* dequeue 2nd bulk */ + result = __ring_dequeue_bulk(r, deq, bulk); + deq += bulk; + CU_ASSERT(0 == result); + + /* check data */ + CU_ASSERT(0 == memcmp(source, dest, deq - dest)); + + /* reset watermark */ + result = _ring_set_water_mark(r, 0); + CU_ASSERT(0 == result); + + /* reset dequeue data */ + memset(test_deq_data, 0, RING_SIZE * 2 * sizeof(void *)); +} diff --git a/test/platform/linux-generic/ring/ring_main.c b/test/platform/linux-generic/ring/ring_main.c new file mode 100644 index 0000000..7152688 --- /dev/null +++ b/test/platform/linux-generic/ring/ring_main.c @@ -0,0 +1,12 @@ +/* Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "ring_suites.h" + +int main(int argc, char *argv[]) +{ + return ring_suites_main(argc, argv); +} diff --git a/test/platform/linux-generic/ring/ring_stress.c b/test/platform/linux-generic/ring/ring_stress.c new file mode 100644 index 0000000..bc61c3e --- /dev/null +++ b/test/platform/linux-generic/ring/ring_stress.c @@ -0,0 +1,244 @@ +/* Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/** + * @file + * + * ODP ring stress test + */ + +#define _GNU_SOURCE + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "ring_suites.h" + +/* There's even number of producer and consumer threads and each thread does + * this many successful enq or deq operations */ +#define NUM_BULK_OP ((RING_SIZE / PIECE_BULK) * 100) + +/* + * Since cunit framework cannot work with multi-threading, ask workers + * to save their results for delayed assertion after thread collection. + */ +static int worker_results[MAX_WORKERS]; + +/* + * Note : make sure that both enqueue and dequeue + * operation starts at same time so to avoid data corruption + * Its because atomic lock will protect only indexes, but if order of + * read or write operation incorrect then data mismatch will happen + * So its resposibility of application develop to take care of order of + * data read or write. + */ +typedef enum { + STRESS_1_1_PRODUCER_CONSUMER, + STRESS_1_N_PRODUCER_CONSUMER, + STRESS_N_1_PRODUCER_CONSUMER, + STRESS_N_M_PRODUCER_CONSUMER +} stress_case_t; + +/* worker function declarations */ +static int stress_worker(void *_data); + +/* global name for later look up in workers' context */ +static const char *ring_name = "stress_ring"; + +/* barrier to run threads at the same time */ +static odp_barrier_t barrier; + +int ring_test_stress_start(void) +{ + _ring_t *r_stress = NULL; + + /* multiple thread usage scenario, thread or process sharable */ + r_stress = _ring_create(ring_name, RING_SIZE, _RING_SHM_PROC); + if (r_stress == NULL) { + LOG_ERR("create ring failed for stress.\n"); + return -1; + } + + return 0; +} + +int ring_test_stress_end(void) +{ + _ring_destroy(ring_name); + return 0; +} + +void ring_test_stress_1_1_producer_consumer(void) +{ + int i = 0; + odp_cpumask_t cpus; + pthrd_arg worker_param; + + /* reset results for delayed assertion */ + memset(worker_results, 0, sizeof(worker_results)); + + /* request 2 threads to run 1:1 stress */ + worker_param.numthrds = odp_cpumask_default_worker(&cpus, 2); + worker_param.testcase = STRESS_1_1_PRODUCER_CONSUMER; + + /* not failure, insufficient resource */ + if (worker_param.numthrds < 2) { + LOG_ERR("insufficient cpu for 1:1 " + "producer/consumer stress.\n"); + return; + } + + odp_barrier_init(&barrier, 2); + + /* kick the workers */ + odp_cunit_thread_create(stress_worker, &worker_param); + + /* collect the results */ + odp_cunit_thread_exit(&worker_param); + + /* delayed assertion due to cunit limitation */ + for (i = 0; i < worker_param.numthrds; i++) + CU_ASSERT(0 == worker_results[i]); +} + +void ring_test_stress_N_M_producer_consumer(void) +{ + int i = 0; + odp_cpumask_t cpus; + pthrd_arg worker_param; + + /* reset results for delayed assertion */ + memset(worker_results, 0, sizeof(worker_results)); + + /* request MAX_WORKERS threads to run N:M stress */ + worker_param.numthrds = + odp_cpumask_default_worker(&cpus, MAX_WORKERS); + worker_param.testcase = STRESS_N_M_PRODUCER_CONSUMER; + + /* not failure, insufficient resource */ + if (worker_param.numthrds < 3) { + LOG_ERR("insufficient cpu for N:M " + "producer/consumer stress.\n"); + return; + } + + /* force even number of threads */ + if (worker_param.numthrds & 0x1) + worker_param.numthrds -= 1; + + odp_barrier_init(&barrier, worker_param.numthrds); + + /* kick the workers */ + odp_cunit_thread_create(stress_worker, &worker_param); + + /* collect the results */ + odp_cunit_thread_exit(&worker_param); + + /* delayed assertion due to cunit limitation */ + for (i = 0; i < worker_param.numthrds; i++) + CU_ASSERT(0 == worker_results[i]); +} + +void ring_test_stress_1_N_producer_consumer(void) +{ +} + +void ring_test_stress_N_1_producer_consumer(void) +{ +} + +void ring_test_stress_ring_list_dump(void) +{ + /* improve code coverage */ + _ring_list_dump(); +} + +/* worker function for multiple producer instances */ +static int do_producer(_ring_t *r) +{ + void *enq[PIECE_BULK]; + int i; + int num = NUM_BULK_OP; + + /* data pattern to be evaluated later in consumer */ + for (i = 0; i < PIECE_BULK; i++) + enq[i] = (void *)(uintptr_t)i; + + while (num) + if (_ring_mp_enqueue_bulk(r, enq, PIECE_BULK) == 0) + num--; + + return 0; +} + +/* worker function for multiple consumer instances */ +static int do_consumer(_ring_t *r) +{ + void *deq[PIECE_BULK]; + int i; + int num = NUM_BULK_OP; + + while (num) { + if (_ring_mc_dequeue_bulk(r, deq, PIECE_BULK) == 0) { + num--; + + /* evaluate the data pattern */ + for (i = 0; i < PIECE_BULK; i++) + CU_ASSERT(deq[i] == (void *)(uintptr_t)i); + } + } + + return 0; +} + +static int stress_worker(void *_data) +{ + pthrd_arg *worker_param = (pthrd_arg *)_data; + _ring_t *r_stress = NULL; + int *result = NULL; + int worker_id = odp_thread_id(); + + /* save the worker result for delayed assertion */ + result = &worker_results[(worker_id % worker_param->numthrds)]; + + /* verify ring lookup in worker context */ + r_stress = _ring_lookup(ring_name); + if (NULL == r_stress) { + LOG_ERR("ring lookup %s not found\n", ring_name); + return (*result = -1); + } + + odp_barrier_wait(&barrier); + + switch (worker_param->testcase) { + case STRESS_1_1_PRODUCER_CONSUMER: + case STRESS_N_M_PRODUCER_CONSUMER: + /* interleaved producer/consumer */ + if (0 == (worker_id % 2)) + *result = do_producer(r_stress); + else if (1 == (worker_id % 2)) + *result = do_consumer(r_stress); + break; + case STRESS_1_N_PRODUCER_CONSUMER: + case STRESS_N_1_PRODUCER_CONSUMER: + default: + LOG_ERR("invalid or not-implemented stress type (%d)\n", + worker_param->testcase); + break; + } + + odp_barrier_wait(&barrier); + + return 0; +} diff --git a/test/platform/linux-generic/ring/ring_suites.c b/test/platform/linux-generic/ring/ring_suites.c new file mode 100644 index 0000000..f321a76 --- /dev/null +++ b/test/platform/linux-generic/ring/ring_suites.c @@ -0,0 +1,74 @@ +/* Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include + +#include +#include +#include +#include + +#include "ring_suites.h" + +static int ring_suites_init(odp_instance_t *inst) +{ + if (0 != odp_init_global(inst, NULL, NULL)) { + LOG_ERR("error: odp_init_global() failed.\n"); + return -1; + } + if (0 != odp_init_local(*inst, ODP_THREAD_CONTROL)) { + LOG_ERR("error: odp_init_local() failed.\n"); + return -1; + } + + _ring_tailq_init(); + return 0; +} + +static odp_testinfo_t ring_suite_basic[] = { + ODP_TEST_INFO(ring_test_basic_create), + ODP_TEST_INFO(ring_test_basic_burst), + ODP_TEST_INFO(ring_test_basic_bulk), + ODP_TEST_INFO(ring_test_basic_watermark), + ODP_TEST_INFO_NULL, +}; + +static odp_testinfo_t ring_suite_stress[] = { + ODP_TEST_INFO(ring_test_stress_1_1_producer_consumer), + ODP_TEST_INFO(ring_test_stress_1_N_producer_consumer), + ODP_TEST_INFO(ring_test_stress_N_1_producer_consumer), + ODP_TEST_INFO(ring_test_stress_N_M_producer_consumer), + ODP_TEST_INFO(ring_test_stress_ring_list_dump), + ODP_TEST_INFO_NULL, +}; + +static odp_suiteinfo_t ring_suites[] = { + {"ring basic", ring_test_basic_start, + ring_test_basic_end, ring_suite_basic}, + {"ring stress", ring_test_stress_start, + ring_test_stress_end, ring_suite_stress}, + ODP_SUITE_INFO_NULL +}; + +int ring_suites_main(int argc, char *argv[]) +{ + int ret; + + /* let helper collect its own arguments (e.g. --odph_proc) */ + if (odp_cunit_parse_options(argc, argv)) + return -1; + + odp_cunit_register_global_init(ring_suites_init); + + ret = odp_cunit_register(ring_suites); + + if (ret == 0) + ret = odp_cunit_run(); + + return ret; +} diff --git a/test/platform/linux-generic/ring/ring_suites.h b/test/platform/linux-generic/ring/ring_suites.h new file mode 100644 index 0000000..5fa5b9c --- /dev/null +++ b/test/platform/linux-generic/ring/ring_suites.h @@ -0,0 +1,34 @@ +/* Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#define RING_SIZE 4096 +#define PIECE_BULK 32 + +#define HALF_BULK (RING_SIZE >> 1) +#define ILLEGAL_SIZE (RING_SIZE | 0x3) + +/* test suite start and stop */ +int ring_test_basic_start(void); +int ring_test_basic_end(void); + +/* basic test cases */ +void ring_test_basic_create(void); +void ring_test_basic_burst(void); +void ring_test_basic_bulk(void); +void ring_test_basic_watermark(void); + +/* test suite start and stop */ +int ring_test_stress_start(void); +int ring_test_stress_end(void); + +/* stress test cases */ +void ring_test_stress_1_1_producer_consumer(void); +void ring_test_stress_1_N_producer_consumer(void); +void ring_test_stress_N_1_producer_consumer(void); +void ring_test_stress_N_M_producer_consumer(void); +void ring_test_stress_ring_list_dump(void); + +int ring_suites_main(int argc, char *argv[]); diff --git a/test/platform/linux-generic/run-test b/test/platform/linux-generic/run-test new file mode 100755 index 0000000..2bff651 --- /dev/null +++ b/test/platform/linux-generic/run-test @@ -0,0 +1,67 @@ +#!/bin/bash +# +# Run the ODP test applications and report status in a format that +# matches the automake "make check" output. +# +# The list of tests to be run is obtained by sourcing a file that +# contains an environment variable in the form; +# +# TEST="test_app1 test_app2" +# +# The default behaviour is to run all the tests defined in files +# named tests-*.env in the same directory as this script, but a single +# test definition file can be specified using the TEST_DEF environment +# variable. +# +# Test definition files may optionally also specify a LOG_COMPILER +# which will be invoked as a wrapper to each of the test application +# (as per automake). +# +TDIR=$(dirname $(readlink -f $0)) +PASS=0 +FAIL=0 +SKIP=0 +res=0 + +if [ "$V" != "0" ]; then + verbose=1 +else + verbose=0 + mkdir -p logs +fi + +do_run_tests() { + source $1 + + for tc in $TESTS; do + tc=$(basename $tc) + if [ "$verbose" = "0" ]; then + logfile=logs/${tc}.log + touch $logfile || logfile=/dev/null + $LOG_COMPILER $TDIR/$tc > $logfile 2>&1 + else + $LOG_COMPILER $TDIR/$tc + fi + + tres=$? + case $tres in + 0) echo "PASS: $tc"; let PASS=$PASS+1 ;; + 77) echo "SKIP: $tc"; let SKIP=$SKIP+1 ;; + *) echo "FAIL: $tc"; let FAIL=$FAIL+1; res=1 ;; + esac + done +} + +if [ "$TEST_DEFS" != "" -a -f "$TEST_DEFS" ]; then + do_run_tests $TEST_DEFS +elif [ "$1" != "" ]; then + do_run_tests $TDIR/tests-${1}.env +else + for tenv in $TDIR/tests-*.env; do + do_run_tests $tenv + done +fi + +echo "TEST RESULT: $PASS tests passed, $SKIP skipped, $FAIL failed" + +exit $res diff --git a/test/platform/linux-generic/shmem/.gitignore b/test/platform/linux-generic/shmem/.gitignore new file mode 100644 index 0000000..7627079 --- /dev/null +++ b/test/platform/linux-generic/shmem/.gitignore @@ -0,0 +1,2 @@ +shmem_linux +shmem_odp diff --git a/test/platform/linux-generic/shmem/Makefile.am b/test/platform/linux-generic/shmem/Makefile.am new file mode 100644 index 0000000..7f985b8 --- /dev/null +++ b/test/platform/linux-generic/shmem/Makefile.am @@ -0,0 +1,20 @@ +include $(top_srcdir)/test/platform/linux-generic/Makefile.inc + +#the main test program is shmem_linux, which, in turn, starts a shmem_odp: +test_PROGRAMS = shmem_linux$(EXEEXT) +test_extra_PROGRAMS = shmem_odp$(EXEEXT) +test_extradir = $(testdir) + +#shmem_linux is stand alone, pure linux (no ODP): +dist_shmem_linux_SOURCES = shmem_linux.c +shmem_linux_LDFLAGS = $(AM_LDFLAGS) -lrt + +#shmem_odp is the odp part: +dist_shmem_odp_SOURCES = shmem_odp.c +shmem_odp_CFLAGS = $(AM_CFLAGS) \ + $(INCCUNIT_COMMON) \ + $(INCODP) +shmem_odp_LDFLAGS = $(AM_LDFLAGS) +shmem_odp_LDADD = $(LIBCUNIT_COMMON) $(LIBODP) + +noinst_HEADERS = shmem_common.h shmem_linux.h shmem_odp.h diff --git a/test/platform/linux-generic/shmem/shmem.h b/test/platform/linux-generic/shmem/shmem.h new file mode 100644 index 0000000..2368a2e --- /dev/null +++ b/test/platform/linux-generic/shmem/shmem.h @@ -0,0 +1,21 @@ +/* Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _ODP_LINUX_TEST_SHMEM_H_ +#define _ODP_LINUX_TEST_SHMEM_H_ + +#include + +/* test functions: */ +void shmem_test_odp_shm_proc(void); + +/* test arrays: */ +extern odp_testinfo_t shmem_linux_suite[]; + +/* test registry: */ +extern odp_suiteinfo_t shmem_linux_suites[]; + +#endif diff --git a/test/platform/linux-generic/shmem/shmem_common.h b/test/platform/linux-generic/shmem/shmem_common.h new file mode 100644 index 0000000..16227ec --- /dev/null +++ b/test/platform/linux-generic/shmem/shmem_common.h @@ -0,0 +1,23 @@ +/* Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _COMMON_TEST_SHMEM_H_ +#define _COMMON_TEST_SHMEM_H_ + +#define ODP_SHM_NAME "odp_linux_shared_mem" +#define FIFO_NAME_FMT "/tmp/shmem_test_fifo-%d" +#define ALIGN_SIZE (128) +#define TEST_SHARE_FOO (0xf0f0f0f0) +#define TEST_SHARE_BAR (0xf0f0f0f) +#define TEST_FAILURE 'F' +#define TEST_SUCCESS 'S' + +typedef struct { + uint32_t foo; + uint32_t bar; +} test_shared_linux_data_t; + +#endif diff --git a/test/platform/linux-generic/shmem/shmem_linux.c b/test/platform/linux-generic/shmem/shmem_linux.c new file mode 100644 index 0000000..212a6c1 --- /dev/null +++ b/test/platform/linux-generic/shmem/shmem_linux.c @@ -0,0 +1,159 @@ +/* Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* this test makes sure that odp shared memory created with the ODP_SHM_PROC + * flag is visible under linux. It therefore checks both that the device + * name under /dev/shm is correct, and also checks that the memory contents + * is indeed shared. + * we want: + * -the odp test to run using C UNIT + * -the main process to return the correct return code. + * (for the autotools test harness) + * + * To achieve this, the flow of operations is as follows: + * + * linux process (main, non odp) | ODP process + * (shmem_linux.c) | (shmem_odp.c) + * | + * main() | + * forks odp process | allocate shmem + * wait for named pipe creation | populate shmem + * | create named pipe + * read shared memory | wait for test report in fifo + * check if memory contents is OK | + * if OK, write "S" in fifo, else "F" | report success or failure to C-Unit + * wait for child terminaison & status| terminate with usual F/S status + * terminate with same status as child| + * | + * \|/ + * time + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "shmem_linux.h" +#include "shmem_common.h" + +#define ODP_APP_NAME "shmem_odp" /* name of the odp program, in this dir */ +#define DEVNAME_FMT "odp-%d-%s" /* shm device format: odp-- */ +#define MAX_FIFO_WAIT 30 /* Max time waiting for the fifo (sec) */ + +void test_success(char *fifo_name, int fd, pid_t odp_app) +{ + int status; + int nb_char; + char result = TEST_SUCCESS; + /* write "Success" to the FIFO */ + nb_char = write(fd, &result, sizeof(char)); + close(fd); + /* wait for the odp app to terminate */ + waitpid(odp_app, &status, 0); + /* if the write failed, report an error anyway */ + if (nb_char != 1) + status = 1; + unlink(fifo_name); + exit(status); /* the status reported by the odp side is returned */ +} + +void test_failure(char *fifo_name, int fd, pid_t odp_app) +{ + int status; + char result; + + int nb_char __attribute__((unused)); /*ignored: we fail anyway */ + + result = TEST_FAILURE; + /* write "Success" to the FIFO */ + nb_char = write(fd, &result, sizeof(char)); + close(fd); + /* wait for the odp app to terminate */ + waitpid(odp_app, &status, 0); + unlink(fifo_name); + exit(1); /* error */ +} + +int main(int argc __attribute__((unused)), char *argv[]) +{ + char prg_name[PATH_MAX]; + char odp_name[PATH_MAX]; + int nb_sec; + int size; + pid_t odp_app; + char *odp_params = NULL; + char fifo_name[PATH_MAX]; /* fifo for linux->odp feedback */ + int fifo_fd = -1; + char shm_devname[PATH_MAX];/* shared mem device name, under /dev/shm */ + int shm_fd; + test_shared_linux_data_t *addr; + + /* odp app is in the same directory as this file: */ + strncpy(prg_name, argv[0], PATH_MAX - 1); + sprintf(odp_name, "%s/%s", dirname(prg_name), ODP_APP_NAME); + + /* start the ODP application: */ + odp_app = fork(); + if (odp_app < 0) /* error */ + exit(1); + + if (odp_app == 0) /* child */ + execv(odp_name, &odp_params); + + /* wait max 30 sec for the fifo to be created by the ODP side. + * Just die if time expire as there is no fifo to communicate + * through... */ + sprintf(fifo_name, FIFO_NAME_FMT, odp_app); + for (nb_sec = 0; nb_sec < MAX_FIFO_WAIT; nb_sec++) { + fifo_fd = open(fifo_name, O_WRONLY); + if (fifo_fd >= 0) + break; + sleep(1); + } + if (fifo_fd < 0) + exit(1); + printf("pipe found\n"); + + /* the linux named pipe has now been found, meaning that the + * ODP application is up and running, and has allocated shmem. + * check to see if linux can see the created shared memory: */ + + sprintf(shm_devname, DEVNAME_FMT, odp_app, ODP_SHM_NAME); + + /* O_CREAT flag not given => failure if shm_devname does not already + * exist */ + shm_fd = shm_open(shm_devname, O_RDONLY, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + if (shm_fd == -1) + test_failure(fifo_name, shm_fd, odp_app); + + /* we know that the linux generic ODP actually allocates the required + * size + alignment and aligns the returned address after. + * we must do the same here: */ + size = sizeof(test_shared_linux_data_t) + ALIGN_SIZE; + addr = mmap(NULL, size, PROT_READ, MAP_SHARED, shm_fd, 0); + if (addr == MAP_FAILED) + test_failure(fifo_name, shm_fd, odp_app); + + /* perform manual alignment */ + addr = (test_shared_linux_data_t *)((((unsigned long int)addr + + ALIGN_SIZE - 1) / ALIGN_SIZE) * ALIGN_SIZE); + + /* check that we see what the ODP application wrote in the memory */ + if ((addr->foo == TEST_SHARE_FOO) && (addr->bar == TEST_SHARE_BAR)) + test_success(fifo_name, fifo_fd, odp_app); + else + test_failure(fifo_name, fifo_fd, odp_app); +} diff --git a/test/platform/linux-generic/shmem/shmem_linux.h b/test/platform/linux-generic/shmem/shmem_linux.h new file mode 100644 index 0000000..a07a775 --- /dev/null +++ b/test/platform/linux-generic/shmem/shmem_linux.h @@ -0,0 +1,9 @@ +/* Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +void test_success(char *fifo_name, int fd, pid_t odp_app); +void test_failure(char *fifo_name, int fd, pid_t odp_app); +int main(int argc, char *argv[]); diff --git a/test/platform/linux-generic/shmem/shmem_odp.c b/test/platform/linux-generic/shmem/shmem_odp.c new file mode 100644 index 0000000..a1f750f --- /dev/null +++ b/test/platform/linux-generic/shmem/shmem_odp.c @@ -0,0 +1,75 @@ +/* Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include "shmem_odp.h" +#include "shmem_common.h" + +#define TEST_SHARE_FOO (0xf0f0f0f0) +#define TEST_SHARE_BAR (0xf0f0f0f) + +void shmem_test_odp_shm_proc(void) +{ + char fifo_name[PATH_MAX]; + int fd; + odp_shm_t shm; + test_shared_data_t *test_shared_data; + char test_result; + + shm = odp_shm_reserve(ODP_SHM_NAME, + sizeof(test_shared_data_t), + ALIGN_SIZE, ODP_SHM_PROC); + CU_ASSERT_FATAL(ODP_SHM_INVALID != shm); + test_shared_data = odp_shm_addr(shm); + CU_ASSERT_FATAL(NULL != test_shared_data); + test_shared_data->foo = TEST_SHARE_FOO; + test_shared_data->bar = TEST_SHARE_BAR; + + odp_mb_full(); + + /* open the fifo: this will indicate to linux process that it can + * start the shmem lookup and check if it sees the data */ + sprintf(fifo_name, FIFO_NAME_FMT, getpid()); + CU_ASSERT_FATAL(mkfifo(fifo_name, 0666) == 0); + + /* read from the fifo: the linux process result: */ + fd = open(fifo_name, O_RDONLY); + CU_ASSERT_FATAL(fd >= 0); + + CU_ASSERT(read(fd, &test_result, sizeof(char)) == 1); + close(fd); + CU_ASSERT_FATAL(test_result == TEST_SUCCESS); + + CU_ASSERT(odp_shm_free(shm) == 0); +} + +odp_testinfo_t shmem_suite[] = { + ODP_TEST_INFO(shmem_test_odp_shm_proc), + ODP_TEST_INFO_NULL, +}; + +odp_suiteinfo_t shmem_suites[] = { + {"Shared Memory", NULL, NULL, shmem_suite}, + ODP_SUITE_INFO_NULL, +}; + +int main(void) +{ + int ret = odp_cunit_register(shmem_suites); + + if (ret == 0) + ret = odp_cunit_run(); + + return ret; +} diff --git a/test/platform/linux-generic/shmem/shmem_odp.h b/test/platform/linux-generic/shmem/shmem_odp.h new file mode 100644 index 0000000..614bbf8 --- /dev/null +++ b/test/platform/linux-generic/shmem/shmem_odp.h @@ -0,0 +1,7 @@ +/* Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +void shmem_test_odp_shm_proc(void); diff --git a/test/validation/Makefile.am b/test/validation/Makefile.am index 90cc549..41255f8 100644 --- a/test/validation/Makefile.am +++ b/test/validation/Makefile.am @@ -1,3 +1,7 @@ +include $(top_srcdir)/test/validation/Makefile.inc + +TESTS_ENVIRONMENT += TEST_DIR=${builddir} + ODP_MODULES = atomic \ barrier \ buffer \ @@ -22,7 +26,34 @@ ODP_MODULES = atomic \ shmem \ system -SUBDIRS = common $(ODP_MODULES) - #The tests will need to retain the deprecated test implementation AM_CFLAGS += -Wno-deprecated-declarations + +if test_vald +SUBDIRS = common $(ODP_MODULES) + +TESTS = atomic/atomic_main$(EXEEXT) \ + barrier/barrier_main$(EXEEXT) \ + buffer/buffer_main$(EXEEXT) \ + classification/classification_main$(EXEEXT) \ + cpumask/cpumask_main$(EXEEXT) \ + crypto/crypto_main$(EXEEXT) \ + errno/errno_main$(EXEEXT) \ + hash/hash_main$(EXEEXT) \ + init/init_main_ok$(EXEEXT) \ + init/init_main_abort$(EXEEXT) \ + init/init_main_log$(EXEEXT) \ + lock/lock_main$(EXEEXT) \ + packet/packet_main$(EXEEXT) \ + pool/pool_main$(EXEEXT) \ + queue/queue_main$(EXEEXT) \ + random/random_main$(EXEEXT) \ + scheduler/scheduler_main$(EXEEXT) \ + std_clib/std_clib_main$(EXEEXT) \ + thread/thread_main$(EXEEXT) \ + time/time_main$(EXEEXT) \ + timer/timer_main$(EXEEXT) \ + traffic_mngr/traffic_mngr_main$(EXEEXT) \ + shmem/shmem_main$(EXEEXT) \ + system/system_main$(EXEEXT) +endif