This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "".
The branch, 2.0 has been updated via 65419c16086369f86dea068e54ce492526fa4f41 (commit) via d22c949cc466bf28de559855a1cb525740578137 (commit) via 637353bbd96770741cbb58711c78c9dc01e4ea34 (commit) via 387b402c4f2fc0694b6e0fe68ee4be8a2bd42442 (commit) via ebdf6e27af66a58fff6a17a1c6c2cd6ae85909f1 (commit) via cc97d3ae6d6d4c07ec77e7b33e2529154fb0ed24 (commit) via 94cb17b703f1efba6a89207b893d9f4ef5297d8d (commit) via c04eff910a7b18f47365f90fadb6133474e9cae5 (commit) via 201a96f9bbcbabd904362ba05a179c72689a578e (commit) via 3edee38da55876e36f654a5d1a4b87c2ea5b8bfe (commit) via 8d22e0e2013596403ae6a35457cdf30b0a0c559b (commit) via d61d32590d1772b70b8dcd0d0ec44d29029d7443 (commit) via 66b363634fe1bba003cdb9e4e49a5980fc8c79f4 (commit) via bd1b1adf37dd8d252f7daf761d4ae9a6d1ef156a (commit) via 4fafec8378b6e7d0b353d851e724ab27eb002b27 (commit) via 63d92eb289261d1534b5b9e1e04291faa5e45d30 (commit) via 82419a31e6d1846e0676edfa7fb511a23098f5a9 (commit) via c0aeacf23dddfb7feae47fef6e4d10d6bdb9c812 (commit) via dd0498bb104c7319e2ec56b61e4d585167ea6c53 (commit) via e826613858543e50a2ec74598f8c2c6fd4bfa064 (commit) via 503722802274ff5de09144613d9262e2cfdb3077 (commit) via 5329228e260d36de62c3edf3c1a3f08ab95fd558 (commit) via 74d880d7e20ab4825868bd2013b164d4bc90eb45 (commit) via 825f75ed8644ef57c5648961e7982daf13cd9375 (commit) via 18977d0684ef7a26ddd6777ca341f7b1ca9e5c3e (commit) via f4d54b8831df52878b66bb145124a9adb4beab28 (commit) via e733d6ba6382ccbf9d6c84a6a10bf720c2e16c0d (commit) via ec6510b33e8b96d6d6670efb9dc3c9101baed6c6 (commit) via af4565caa0f9d171db466554ee631338b9844cbe (commit) via f5120355753ae3d69f81010cb9131abffdfb03fc (commit) via afa7e20ab3b7a6e68a556f00b49aa19ea4a29be6 (commit) via e3108af2f0b58c2ceca422b418439bba5de04b11 (commit) via 54228421977f94d9da752290540c6ec4dc5306a0 (commit) via 605e77187211dbb0716e4124f249c7f0f88567f7 (commit) via 940c54bbd1c0c16ea2b6a6f6737d151deeba1e43 (commit) via 91ceea49a975c6fcd61ab1c992a502350d673eeb (commit) via b46702e5ef368c9aaf9d6cea7d32b07adb881ce3 (commit) via 48dfcade1602e9cc9bb8cd3251037508aef146cd (commit) via 2aa9a05b11bdfac0c0126384d4677b3f9c561a78 (commit) via df978d9b4e766c8e1cb1a88a28d98318840fee22 (commit) via cd196cf12f957456b24c844b2c38be5062130cf1 (commit) via dee4a7512c21a8b7f15a4a05e6736de373df92f0 (commit) via f70ff3bc542961d52f9b0f867298014650c8e49e (commit) via 700c0ac917fedf532e9a7e21c42624faa4b09a5f (commit) via 20aba9a17664fb8d5261bece23a1c20f1a3465f7 (commit) via ce4bd52afcef245b069acfe8dc53bd62aec576fd (commit) via 01b5f7e0c0bcec5beb58c99573906b1a4ee8e5f0 (commit) via 5e8f87ae22ca0c3e6137f91f15c967aec958a67e (commit) via 9e10a562dfb67b7a37c67fecff3de00be798961a (commit) via 86d651b86c10dd77603354110644ad346dfb3e26 (commit) via bc3cad50ec6668064bae1af164875c93832caff8 (commit) via 9c747985d4c448ef737376c5c8180b78ae1e7378 (commit) via 698f370e71db55624e1bd78063569369f86db389 (commit) via 482eeee380d40596131826c1103ed89247bd17e5 (commit) via 254190ffcdb51549ee23846f33fd45513656b78c (commit) via 52877c96e12bf62614df0482175384565a851083 (commit) via 133e7fc06147486fff5ab3393b1a791ab97d19d3 (commit) via 8c9ce8c63eed9d01fec54c09bd17040914abd623 (commit) via 2b57c7d7b96eef16c36b8b0020b3dd78acc82660 (commit) via cbced85824c4c03c0b35396d559ebfb187237569 (commit) via 1217fbaed0aee2ee395c131bb7fd2e201214ed31 (commit) via 927b57f21124f31e23fd7f72dddcc93a5248ed53 (commit) via 1bcf171f00973bcc21baadf9919a61cd6abdf713 (commit) via edca8cd1e55898826f79383b689c2c4bd2c28b3a (commit) via ec0c3145fcafa09ae3a79875e7e07dd4794583cc (commit) via aa64630294bed950641e99fa1c87725f521a0002 (commit) via 53b4c4aed8cc6e9caf379725e9ed1d2d36f04f10 (commit) via 77f9451a2acf4465e6a64f24b1dfdca56787f0ce (commit) via fce14d1496e7da19e2f0eb53339eea5a4204c03d (commit) via cc33578e327d5f6787711a71a60500c4be98bf63 (commit) via 4ab7a7b22b15011eb69c3e473278db13319aba52 (commit) via 53b735f14a9a1df23b054f15ce148e2fa36abe0f (commit) via 4df71d3f5450452a654bb7e94f8b3fed948ed31e (commit) via 326192cd87888abbea6c0dbdd3dc972db41f3325 (commit) via 55e6afa29bdc2ae314bada7ac5648049909e1775 (commit) via ff51f6363c9fad843f7872ad8048740d10368dd1 (commit) via 6a119c79b59de3c8ee9e51f3ceba9d26f24c3ce4 (commit) via 7d162deafa22535f8fab9ea39dcb4e3e0e7850b0 (commit) via adaa3b434086346402999d09c2223681aba4b1a4 (commit) via c657f3f3d9b2c5832b42a4344a526bf7d0c76a5d (commit) via e02f5545f97f90a75f2595bb1e9068f64bff133e (commit) via d0d0bd9787ee43db39ad4e7e9b224e70664d5663 (commit) via 7dc5f21c7ca88e6c19d34dc1933eddef190add7a (commit) via 209c3a2e255de7aa82c4f08f8abb41c04bb3d86d (commit) via ae4f1d82ed704992c1d8284c23795b9e076b33b9 (commit) via d2b3aa9a7ffc3028eedc7dbeb6257d7efd91bc05 (commit) via 66305f01a57741dc5eca061364e65a5f4da8584f (commit) via afeda4d14bb6f449cb269680cdbd56b26726eedf (commit) via 1b259a7a4e573080f4debc542cab7a0b996f4c88 (commit) via 4ce7bdf3d99cc1d7634a80f961fc0e9e7523a0ac (commit) via 55fd230da7d8515452c08256f8fd8471d32d7601 (commit) via b529f843814f70068de2090e02df632113afa800 (commit) via fa78c11ad2de706ce07a7691168bdb5b58d060d4 (commit) via 5a2376365df984e160b92463be37740786a10bd6 (commit) via 3f3d7651c7cd7ba3b941904bbcbdabcac9a7dfd0 (commit) via 72a4e9f9bad9dfeaafba4e29a7450ee7edca5d1c (commit) via 7f3624154ff59ab85352c35e1c6df3c9597f9f51 (commit) via bbefeae66a2a6ac6c9386bb8a083022b7f323fc9 (commit) via a08dba6c24af81142efc6176eae2bdd561b478e3 (commit) via 1c02e217fac2ed2d015205ad36bd86c4924ce6cc (commit) via a3bc051085b95170101a3f81379e78c48e5a636c (commit) via fa281989523b82177f974abe7b4adfec47705dfa (commit) via 3bacbfd55edf76b897a4b2e5c62b59ca6fa95331 (commit) via 37b430cb9e8f6834a3c76ab108489cec719b9e32 (commit) via 4d38a376cd9976dfbeb565e509c028d07dfb1ed8 (commit) via c16af6486eea240609f334b1bdc81a11404275de (commit) from c0f99c441feadd1566b7e92789b11c30c6ee3f64 (commit)
Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below.
- Log ----------------------------------------------------------------- commit 65419c16086369f86dea068e54ce492526fa4f41 Merge: c0f99c44 d22c949c Author: Yi He yi.he@linaro.org Date: Fri Nov 3 16:09:27 2017 +0800
Merge branch 'api-next' into 2.0
Reviewed-by: Honnappa Nagarahalli honnappa.Nagarahalli@arm.com Signed-off-by: Yi He yi.he@linaro.org
diff --cc .travis.yml index 29909a3a,bb5cb4e5..f5a67781 --- a/.travis.yml +++ b/.travis.yml @@@ -59,6 -60,6 +60,7 @@@ cache pip: true directories: #- dpdk ++ - dpdk-17.02 - netmap - $HOME/cunit-install - $HOME/doxygen-install @@@ -161,15 -168,14 +169,30 @@@ install make config T=${TARGET} O=${TARGET} pushd ${TARGET} sed -ri 's,(CONFIG_RTE_LIBRTE_PMD_PCAP=).*,\1y,' .config + sed -ri 's,(CONFIG_RTE_LIBRTE_PMD_OPENSSL=).*,\1y,' .config + cat .config |grep RTE_MACHINE + sed -ri 's,(CONFIG_RTE_MACHINE=).*,\1"snb",' .config + popd + make install T=${TARGET} EXTRA_CFLAGS="-fPIC" + rm -r ./doc ./${TARGET}/app ./${TARGET}/build + popd + fi - ++ - | ++ if [ -z "$CROSS_ARCH" -a ! -f "dpdk-17.02/${TARGET}/lib/libdpdk.a" ]; then ++ git -c advice.detachedHead=false clone -q --depth=1 --single-branch --branch=v17.02 http://dpdk.org/git/dpdk dpdk-17.02 ++ pushd dpdk-17.02 ++ git log --oneline --decorate ++ make config T=${TARGET} O=${TARGET} ++ pushd ${TARGET} ++ sed -ri 's,(CONFIG_RTE_LIBRTE_PMD_PCAP=).*,\1y,' .config ++ sed -ri 's,(CONFIG_RTE_LIBRTE_PMD_OPENSSL=).*,\1y,' .config + cat .config |grep RTE_MACHINE + sed -ri 's,(CONFIG_RTE_MACHINE=).*,\1"snb",' .config + popd + make install T=${TARGET} EXTRA_CFLAGS="-fPIC" + rm -r ./doc ./${TARGET}/app ./${TARGET}/build + popd + fi - # Netmap pktio - | if [ -z "$CROSS_ARCH" ]; then @@@ -275,16 -281,8 +298,15 @@@ jobs script: - echo ${TRAVIS_COMMIT_RANGE}; - ODP_PATCHES=`echo ${TRAVIS_COMMIT_RANGE} | sed 's/.//'`; - - if [ -z "${ODP_PATCHES}" ]; then env; exit 0; fi; - ./scripts/ci-checkpatches.sh ${ODP_PATCHES}; - + - stage: test + env: TEST=linux-dpdk + compiler: gcc + script: + - ./bootstrap - - ./configure --with-platform=linux-dpdk --enable-test-cpp --enable-test-vald --enable-test-helper --enable-test-perf --enable-user-guides --enable-test-perf-proc --enable-test-example --with-sdk-install-path=`pwd`/dpdk/${TARGET} --with-cunit-path=$HOME/cunit-install/$CROSS_ARCH $CONF ++ - ./configure --with-platform=linux-dpdk --enable-test-cpp --enable-test-vald --enable-test-helper --enable-test-perf --enable-user-guides --enable-test-perf-proc --enable-test-example --with-sdk-install-path=`pwd`/dpdk-17.02/${TARGET} --with-cunit-path=$HOME/cunit-install/$CROSS_ARCH $CONF + - make -j $(nproc) + - sudo LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH" make check after_failure: - cat config.log - - find . -name 'test-suite.log' -execdir grep -il "FAILED" {} ; -exec echo {} ; -exec cat {} ; + - find . -name "*.trs" | xargs grep -l '^.test-result. FAIL' | while read trs ; do echo FAILURE detected at $trs; cat ${trs%%.trs}.log ; done diff --cc Makefile.am index 6c43679e,c28b0229..0d04f98b --- a/Makefile.am +++ b/Makefile.am @@@ -3,14 -3,21 +3,28 @@@ AM_DISTCHECK_CONFIGURE_FLAGS = --enable --enable-helper-linux \ --with-testdir
- #@with_platform@ works alone in subdir but not as part of a path??? - SUBDIRS = @platform_with_platform@ \ + if PLATFORM_IS_LINUX_GENERIC + PLATFORM_DIR = platform/linux-generic + PLATFORM_TEST_DIR = platform/linux-generic/test + endif + ++if PLATFORM_IS_LINUX_DPDK ++PLATFORM_DIR = platform/linux-dpdk ++PLATFORM_TEST_DIR = platform/linux-dpdk/test ++endif ++ + SUBDIRS = \ + include \ + $(PLATFORM_DIR) \ helper \ helper/test \ doc \ example . \ - test + test \ + $(PLATFORM_TEST_DIR) + ++DIST_SUBDIRS = $(SUBDIRS) + @DX_RULES@
EXTRA_DIST = bootstrap $(DX_CONFIG) CHANGELOG config/README diff --cc configure.ac index 9e45d0fe,4bc77500..d774ae86 --- a/configure.ac +++ b/configure.ac @@@ -162,8 -161,17 +162,7 @@@ AC_ARG_WITH([platform] ])
AC_SUBST([with_platform]) - AC_SUBST([platform_with_platform], ["platform/${with_platform}"])
-########################################################################## -# Run platform specific checks and settings -########################################################################## -AS_IF([test "${with_platform}" = "linux-generic"], - [m4_include([./platform/linux-generic/m4/configure.m4])], - [AC_MSG_ERROR([UNSUPPORTED PLATFORM: ${with_platform}])]) - -AC_DEFINE_UNQUOTED([IMPLEMENTATION_NAME], ["$IMPLEMENTATION_NAME"], - [Define to the name of the implementation]) - ########################################################################## # Include m4 files ########################################################################## @@@ -172,37 -180,6 +171,35 @@@ m4_include([./example/m4/configure.m4] m4_include([./helper/m4/configure.m4]) m4_include([./test/m4/configure.m4])
+########################################################################## +# Set SDK install path +########################################################################## +AC_ARG_WITH([sdk-install-path], +AC_HELP_STRING([--with-sdk-install-path=DIR path to external libs and headers], + [(or in the default path if not specified).]), +[SDK_INSTALL_PATH=$withval SDK_INSTALL_PATH_=1],[SDK_INSTALL_PATH_=]) + +AC_SUBST(SDK_INSTALL_PATH) + +########################################################################## +# Run platform specific checks and settings +########################################################################## +IMPLEMENTATION_NAME="" +AS_IF([test "${with_platform}" = "linux-generic"], + [m4_include([./platform/linux-generic/m4/configure.m4])] - [m4_include([./test/linux-generic/m4/configure.m4])] + [IMPLEMENTATION_NAME="linux-generic"] + [ODP_CFLAGS="$ODP_CFLAGS -std=c99"] + [ODP_LIB_STR="odp-linux"], + [test "${with_platform}" = "linux-dpdk"], + [m4_include([./platform/linux-dpdk/m4/configure.m4])] - [m4_include([./test/linux-dpdk/m4/configure.m4])] + [IMPLEMENTATION_NAME="linux-dpdk"] + [ODP_CFLAGS="$ODP_CFLAGS -std=gnu99"] + [ODP_LIB_STR="odp-dpdk"], + [echo "UNSUPPORTED PLATFORM: ${with_platform}"]) + +ODP_CFLAGS="$ODP_CFLAGS -DIMPLEMENTATION_NAME=$IMPLEMENTATION_NAME" +AC_SUBST(ODP_LIB_STR) + ########################################################################## # Set the install directory for test binaries/scripts ########################################################################## @@@ -357,12 -336,12 +357,11 @@@ esa CFLAGS="$CFLAGS $ODP_CFLAGS" CXXFLAGS="$CXXFLAGS $ODP_CXXFLAGS"
- AC_CONFIG_FILES([Makefile - pkgconfig/libodp-linux.pc - pkgconfig/libodp-dpdk.pc - pkgconfig/libodphelper.pc - ]) + AC_CONFIG_FILES([Makefile]) + AC_CONFIG_FILES([include/Makefile + include/odp/api/spec/version.h + include/odp/api/spec/deprecated.h])
- ########################################################################## # distribute the changed variables among the Makefiles
diff --cc example/Makefile.am index d83edf6c,695e029c..b6e8d81f --- a/example/Makefile.am +++ b/example/Makefile.am @@@ -9,6 -9,6 +9,8 @@@ SUBDIRS = classifier switch \ time \ timer \ - traffic_mgmt + traffic_mgmt \ + ddf_ifs \ + ddf_app + + noinst_HEADERS = example_debug.h diff --cc example/Makefile.inc index 419bebd4,1609066e..31bf7c43 --- a/example/Makefile.inc +++ b/example/Makefile.inc @@@ -1,5 -1,7 +1,7 @@@ + TESTS_ENVIRONMENT = EXEEXT=${EXEEXT} + LIB = $(top_builddir)/lib -LDADD = $(LIB)/libodp-linux.la $(LIB)/libodphelper.la $(DPDK_PMDS) +LDADD = $(LIB)/lib$(ODP_LIB_STR).la $(LIB)/libodphelper.la $(DPDK_PMDS) AM_CFLAGS = \ -I$(srcdir) \ -I$(top_srcdir)/example \ diff --cc example/l2fwd/odp_l2fwd.c index eea3a34c,eea3a34c..fb585f43 --- a/example/l2fwd/odp_l2fwd.c +++ b/example/l2fwd/odp_l2fwd.c @@@ -1,1 -1,1 +1,1 @@@ --../../test/common_plat/performance/odp_l2fwd.c ++../../test/performance/odp_l2fwd.c diff --cc include/Makefile.am index 00000000,d53181ce..37691672 mode 000000,100644..100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@@ -1,0 -1,162 +1,163 @@@ + include_HEADERS = \ + odp.h \ + odp_api.h \ + odp_drv.h + + odpapispecincludedir= $(includedir)/odp/api/spec + odpapispecinclude_HEADERS = \ + odp/api/spec/align.h \ + odp/api/spec/atomic.h \ + odp/api/spec/barrier.h \ + odp/api/spec/buffer.h \ + odp/api/spec/byteorder.h \ + odp/api/spec/chksum.h \ + odp/api/spec/classification.h \ + odp/api/spec/compiler.h \ + odp/api/spec/cpu.h \ + odp/api/spec/cpumask.h \ + odp/api/spec/crypto.h \ + odp/api/spec/debug.h \ + odp/api/spec/errno.h \ + odp/api/spec/event.h \ + odp/api/spec/feature.h \ + odp/api/spec/hash.h \ + odp/api/spec/hints.h \ + odp/api/spec/init.h \ + odp/api/spec/ipsec.h \ + odp/api/spec/packet.h \ + odp/api/spec/packet_flags.h \ + odp/api/spec/packet_io.h \ + odp/api/spec/packet_io_stats.h \ + odp/api/spec/pool.h \ + odp/api/spec/queue.h \ + odp/api/spec/random.h \ + odp/api/spec/rwlock.h \ + odp/api/spec/rwlock_recursive.h \ + odp/api/spec/schedule.h \ + odp/api/spec/schedule_types.h \ + odp/api/spec/shared_memory.h \ + odp/api/spec/spinlock.h \ + odp/api/spec/spinlock_recursive.h \ + odp/api/spec/std_clib.h \ + odp/api/spec/std_types.h \ + odp/api/spec/support.h \ + odp/api/spec/sync.h \ + odp/api/spec/system_info.h \ + odp/api/spec/thread.h \ + odp/api/spec/thrmask.h \ + odp/api/spec/ticketlock.h \ + odp/api/spec/time.h \ + odp/api/spec/timer.h \ + odp/api/spec/traffic_mngr.h + + nodist_odpapispecinclude_HEADERS = \ + odp/api/spec/deprecated.h \ + odp/api/spec/version.h + + odpdrvspecincludedir= $(includedir)/odp/drv/spec + odpdrvspecinclude_HEADERS = \ + odp/drv/spec/align.h \ + odp/drv/spec/atomic.h \ + odp/drv/spec/barrier.h \ + odp/drv/spec/byteorder.h \ + odp/drv/spec/compiler.h \ + odp/drv/spec/driver.h \ ++ odp/drv/spec/hints.h \ + odp/drv/spec/shm.h \ + odp/drv/spec/spinlock.h \ + odp/drv/spec/std_types.h \ + odp/drv/spec/sync.h + + odpapiabidefaultincludedir= $(includedir)/odp/arch/default/api/abi + odpapiabidefaultinclude_HEADERS = \ + odp/arch/default/api/abi/buffer.h \ + odp/arch/default/api/abi/classification.h \ + odp/arch/default/api/abi/crypto.h \ + odp/arch/default/api/abi/event.h \ + odp/arch/default/api/abi/packet.h \ + odp/arch/default/api/abi/pool.h \ + odp/arch/default/api/abi/queue.h \ + odp/arch/default/api/abi/shared_memory.h + + odpapiabiarchincludedir= $(includedir)/odp/arch/@ARCH_ABI@/odp/api/abi + if ARCH_IS_ARM + odpapiabiarchinclude_HEADERS = \ + odp/arch/arm32-linux/odp/api/abi/buffer.h \ + odp/arch/arm32-linux/odp/api/abi/classification.h \ + odp/arch/arm32-linux/odp/api/abi/crypto.h \ + odp/arch/arm32-linux/odp/api/abi/event.h \ + odp/arch/arm32-linux/odp/api/abi/packet.h \ + odp/arch/arm32-linux/odp/api/abi/pool.h \ + odp/arch/arm32-linux/odp/api/abi/queue.h \ + odp/arch/arm32-linux/odp/api/abi/shared_memory.h + endif + if ARCH_IS_AARCH64 + odpapiabiarchinclude_HEADERS = \ + odp/arch/arm64-linux/odp/api/abi/buffer.h \ + odp/arch/arm64-linux/odp/api/abi/classification.h \ + odp/arch/arm64-linux/odp/api/abi/crypto.h \ + odp/arch/arm64-linux/odp/api/abi/event.h \ + odp/arch/arm64-linux/odp/api/abi/packet.h \ + odp/arch/arm64-linux/odp/api/abi/pool.h \ + odp/arch/arm64-linux/odp/api/abi/queue.h \ + odp/arch/arm64-linux/odp/api/abi/shared_memory.h + endif + if ARCH_IS_MIPS64 + odpapiabiarchinclude_HEADERS = \ + odp/arch/mips64-linux/odp/api/abi/buffer.h \ + odp/arch/mips64-linux/odp/api/abi/classification.h \ + odp/arch/mips64-linux/odp/api/abi/crypto.h \ + odp/arch/mips64-linux/odp/api/abi/event.h \ + odp/arch/mips64-linux/odp/api/abi/packet.h \ + odp/arch/mips64-linux/odp/api/abi/pool.h \ + odp/arch/mips64-linux/odp/api/abi/queue.h \ + odp/arch/mips64-linux/odp/api/abi/shared_memory.h + endif + if ARCH_IS_POWERPC + odpapiabiarchinclude_HEADERS = \ + odp/arch/power64-linux/odp/api/abi/buffer.h \ + odp/arch/power64-linux/odp/api/abi/classification.h \ + odp/arch/power64-linux/odp/api/abi/crypto.h \ + odp/arch/power64-linux/odp/api/abi/event.h \ + odp/arch/power64-linux/odp/api/abi/packet.h \ + odp/arch/power64-linux/odp/api/abi/pool.h \ + odp/arch/power64-linux/odp/api/abi/queue.h \ + odp/arch/power64-linux/odp/api/abi/shared_memory.h + endif + if ARCH_IS_X86_32 + odpapiabiarchinclude_HEADERS = \ + odp/arch/x86_32-linux/odp/api/abi/buffer.h \ + odp/arch/x86_32-linux/odp/api/abi/classification.h \ + odp/arch/x86_32-linux/odp/api/abi/crypto.h \ + odp/arch/x86_32-linux/odp/api/abi/event.h \ + odp/arch/x86_32-linux/odp/api/abi/packet.h \ + odp/arch/x86_32-linux/odp/api/abi/pool.h \ + odp/arch/x86_32-linux/odp/api/abi/queue.h \ + odp/arch/x86_32-linux/odp/api/abi/shared_memory.h + endif + if ARCH_IS_X86_64 + odpapiabiarchinclude_HEADERS = \ + odp/arch/x86_64-linux/odp/api/abi/buffer.h \ + odp/arch/x86_64-linux/odp/api/abi/classification.h \ + odp/arch/x86_64-linux/odp/api/abi/crypto.h \ + odp/arch/x86_64-linux/odp/api/abi/event.h \ + odp/arch/x86_64-linux/odp/api/abi/packet.h \ + odp/arch/x86_64-linux/odp/api/abi/pool.h \ + odp/arch/x86_64-linux/odp/api/abi/queue.h \ + odp/arch/x86_64-linux/odp/api/abi/shared_memory.h + endif + + # Create symlink for ABI header files. Application does not need to use the arch + # specific include path for installed files. + install-data-hook: + if [ -h $(DESTDIR)$(prefix)/include/odp/api/abi ]; then \ + : ; \ + else \ + $(LN_S) -rf $(DESTDIR)$(prefix)/include/odp/arch/@ARCH_ABI@/odp/api/abi \ + $(DESTDIR)$(prefix)/include/odp/api/abi; \ + fi + + # Rerefence all nodist_*_HEADERS here + .PHONY: $(nodist_odpapispecinclude_HEADERS) + $(nodist_odpapispecinclude_HEADERS): + $(MAKE) -C $(top_builddir) $(subdir)/$@ diff --cc platform/Makefile.inc index 4d9280b5,0086db77..327a9540 --- a/platform/Makefile.inc +++ b/platform/Makefile.inc @@@ -1,11 -1,10 +1,6 @@@ LIB = $(top_builddir)/lib
--pkgconfigdir = $(libdir)/pkgconfig - pkgconfig_DATA = $(top_builddir)/pkgconfig/libodp-linux.pc - - .PHONY: pkgconfig/libodp-linux.pc -pkgconfig_DATA = libodp-linux.pc -- VPATH = $(srcdir) $(builddir) -lib_LTLIBRARIES = $(LIB)/libodp-linux.la
AM_LDFLAGS = -version-number '$(ODP_LIBSO_VERSION)'
diff --cc platform/linux-dpdk/Makefile.am index 596c7b78,00000000..f27d2b50 mode 100644,000000..100644 --- a/platform/linux-dpdk/Makefile.am +++ b/platform/linux-dpdk/Makefile.am @@@ -1,372 -1,0 +1,378 @@@ +include $(top_srcdir)/platform/Makefile.inc +include $(top_srcdir)/platform/@with_platform@/Makefile.inc + ++pkgconfigdir = $(libdir)/pkgconfig ++pkgconfig_DATA = libodp-dpdk.pc ++ +lib_LTLIBRARIES = $(LIB)/libodp-dpdk.la + +PLAT_CFLAGS = +if ARCH_IS_X86 +PLAT_CFLAGS += -msse4.2 +endif + +if SDK_INSTALL_PATH_ +PLAT_CFLAGS += -include $(SDK_INSTALL_PATH)/include/rte_config.h +else +PLAT_CFLAGS += -include /usr/include/dpdk/rte_config.h +endif + +AM_CPPFLAGS = $(PLAT_CFLAGS) +AM_CPPFLAGS += -I$(top_srcdir)/platform/linux-dpdk/include +AM_CPPFLAGS += -I$(top_srcdir)/platform/linux-generic/include +AM_CPPFLAGS += -I$(srcdir)/include +AM_CPPFLAGS += -I$(top_srcdir)/include +AM_CPPFLAGS += -I$(top_srcdir)/frameworks/modular +AM_CPPFLAGS += -I$(top_srcdir)/include/odp/arch/@ARCH_ABI@ +AM_CPPFLAGS += -I$(top_builddir)/include +AM_CPPFLAGS += -Iinclude +AM_CPPFLAGS += -I$(srcdir) +AM_CPPFLAGS += -I$(top_srcdir)/platform/$(with_platform)/arch/$(ARCH_DIR) +AM_CPPFLAGS += -I$(top_srcdir)/platform/$(with_platform)/arch/default +AM_CPPFLAGS += -DSYSCONFDIR="@sysconfdir@" + +AM_CPPFLAGS += $(DPDK_CPPFLAGS) +AM_CPPFLAGS += $(OPENSSL_CPPFLAGS) +AM_CPPFLAGS += $(LIBCONFIG_CFLAGS) + +include_HEADERS = \ + $(top_srcdir)/include/odp.h \ + $(top_srcdir)/include/odp_api.h \ + $(top_srcdir)/include/odp_drv.h + +odpincludedir= $(includedir)/odp +odpinclude_HEADERS = \ + $(srcdir)/include/odp/visibility_begin.h \ + $(srcdir)/include/odp/visibility_end.h + +odpapiincludedir= $(includedir)/odp/api +odpapiinclude_HEADERS = \ + $(srcdir)/include/odp/api/align.h \ + $(srcdir)/include/odp/api/atomic.h \ + $(srcdir)/include/odp/api/barrier.h \ + $(srcdir)/include/odp/api/buffer.h \ + $(srcdir)/include/odp/api/byteorder.h \ + $(srcdir)/include/odp/api/classification.h \ + $(srcdir)/include/odp/api/compiler.h \ + $(srcdir)/include/odp/api/cpu.h \ + $(srcdir)/include/odp/api/cpumask.h \ + $(srcdir)/include/odp/api/crypto.h \ + $(srcdir)/include/odp/api/debug.h \ + $(srcdir)/include/odp/api/deprecated.h \ + $(srcdir)/include/odp/api/errno.h \ + $(srcdir)/include/odp/api/event.h \ + $(srcdir)/include/odp/api/feature.h \ + $(srcdir)/include/odp/api/hash.h \ + $(srcdir)/include/odp/api/hints.h \ + $(srcdir)/include/odp/api/init.h \ + $(srcdir)/include/odp/api/ipsec.h \ + $(srcdir)/include/odp/api/packet_flags.h \ + $(srcdir)/include/odp/api/packet.h \ + $(srcdir)/include/odp/api/packet_io.h \ + $(srcdir)/include/odp/api/packet_io_stats.h \ + $(srcdir)/include/odp/api/pool.h \ + $(srcdir)/include/odp/api/queue.h \ + $(srcdir)/include/odp/api/random.h \ + $(srcdir)/include/odp/api/rwlock.h \ + $(srcdir)/include/odp/api/rwlock_recursive.h \ + $(srcdir)/include/odp/api/schedule.h \ + $(srcdir)/include/odp/api/schedule_types.h \ + $(srcdir)/include/odp/api/shared_memory.h \ + $(srcdir)/include/odp/api/spinlock.h \ + $(srcdir)/include/odp/api/spinlock_recursive.h \ + $(srcdir)/include/odp/api/std_clib.h \ + $(srcdir)/include/odp/api/std_types.h \ + $(srcdir)/include/odp/api/support.h \ + $(srcdir)/include/odp/api/sync.h \ + $(srcdir)/include/odp/api/system_info.h \ + $(srcdir)/include/odp/api/thread.h \ + $(srcdir)/include/odp/api/thrmask.h \ + $(srcdir)/include/odp/api/ticketlock.h \ + $(srcdir)/include/odp/api/time.h \ + $(srcdir)/include/odp/api/timer.h \ + $(srcdir)/include/odp/api/traffic_mngr.h \ + $(srcdir)/include/odp/api/version.h + +if ARCH_IS_ARM +odpapiinclude_HEADERS += $(srcdir)/arch/arm/odp/api/cpu_arch.h +endif +if ARCH_IS_MIPS64 +odpapiinclude_HEADERS += $(srcdir)/arch/mips64/odp/api/cpu_arch.h +endif +if ARCH_IS_POWERPC +odpapiinclude_HEADERS += $(srcdir)/arch/powerpc/odp/api/cpu_arch.h +endif +if ARCH_IS_X86 +odpapiinclude_HEADERS += $(srcdir)/arch/x86/odp/api/cpu_arch.h +endif + +odpapiplatincludedir= $(includedir)/odp/api/plat +odpapiplatinclude_HEADERS = \ + $(builddir)/include/odp/api/plat/static_inline.h \ + $(srcdir)/include/odp/api/plat/atomic_inlines.h \ + $(srcdir)/include/odp/api/plat/atomic_types.h \ + $(srcdir)/include/odp/api/plat/barrier_types.h \ + $(srcdir)/include/odp/api/plat/buffer_types.h \ + $(srcdir)/include/odp/api/plat/byteorder_inlines.h \ + $(srcdir)/include/odp/api/plat/byteorder_types.h \ + $(srcdir)/include/odp/api/plat/classification_types.h \ + $(srcdir)/include/odp/api/plat/cpumask_types.h \ + $(srcdir)/include/odp/api/plat/crypto_types.h \ + $(srcdir)/include/odp/api/plat/event_types.h \ + $(srcdir)/include/odp/api/plat/init_types.h \ + $(srcdir)/include/odp/api/plat/ipsec_types.h \ + $(srcdir)/include/odp/api/plat/packet_flag_inlines.h \ + $(srcdir)/include/odp/api/plat/packet_flag_inlines_api.h \ + $(srcdir)/include/odp/api/plat/packet_inlines.h \ + $(srcdir)/include/odp/api/plat/packet_inlines_api.h \ + $(srcdir)/include/odp/api/plat/packet_io_types.h \ + $(srcdir)/include/odp/api/plat/packet_types.h \ + $(srcdir)/include/odp/api/plat/pool_types.h \ + $(srcdir)/include/odp/api/plat/queue_types.h \ + $(srcdir)/include/odp/api/plat/rwlock_types.h \ + $(srcdir)/include/odp/api/plat/rwlock_recursive_types.h \ + $(srcdir)/include/odp/api/plat/schedule_types.h \ + $(srcdir)/include/odp/api/plat/shared_memory_types.h \ + $(srcdir)/include/odp/api/plat/spinlock_types.h \ + $(srcdir)/include/odp/api/plat/spinlock_recursive_types.h \ + $(srcdir)/include/odp/api/plat/std_clib_inlines.h \ + $(srcdir)/include/odp/api/plat/strong_types.h \ + $(srcdir)/include/odp/api/plat/sync_inlines.h \ + $(srcdir)/include/odp/api/plat/thread_types.h \ + $(srcdir)/include/odp/api/plat/thrmask_types.h \ + $(srcdir)/include/odp/api/plat/ticketlock_inlines.h \ + $(srcdir)/include/odp/api/plat/ticketlock_inlines_api.h \ + $(srcdir)/include/odp/api/plat/ticketlock_types.h \ + $(srcdir)/include/odp/api/plat/time_types.h \ + $(srcdir)/include/odp/api/plat/timer_types.h \ + $(srcdir)/include/odp/api/plat/traffic_mngr_types.h \ + $(srcdir)/include/odp/api/plat/version_types.h + +odpdrvincludedir = $(includedir)/odp/drv +odpdrvinclude_HEADERS = \ + $(srcdir)/include/odp/drv/align.h \ + $(srcdir)/include/odp/drv/atomic.h \ + $(srcdir)/include/odp/drv/barrier.h \ + $(srcdir)/include/odp/drv/byteorder.h \ + $(srcdir)/include/odp/drv/compiler.h \ + $(srcdir)/include/odp/drv/driver.h \ + $(srcdir)/include/odp/drv/hints.h \ + $(srcdir)/include/odp/drv/shm.h \ + $(srcdir)/include/odp/drv/spinlock.h \ + $(srcdir)/include/odp/drv/std_types.h \ + $(srcdir)/include/odp/drv/sync.h + +odpdrvplatincludedir = $(includedir)/odp/drv/plat +odpdrvplatinclude_HEADERS = \ + $(srcdir)/include/odp/drv/plat/atomic_types.h \ + $(srcdir)/include/odp/drv/plat/barrier_types.h \ + $(srcdir)/include/odp/drv/plat/byteorder_types.h \ + $(srcdir)/include/odp/drv/compiler.h \ + $(srcdir)/include/odp/drv/plat/driver_types.h \ + $(srcdir)/include/odp/drv/plat/shm_types.h \ + $(srcdir)/include/odp/drv/plat/spinlock_types.h \ + $(srcdir)/include/odp/drv/plat/strong_types.h + + +noinst_HEADERS = \ + ${top_srcdir}/platform/linux-generic/include/odp_buffer_subsystem.h \ + ${top_srcdir}/platform/linux-generic/include/_fdserver_internal.h \ + ${top_srcdir}/platform/linux-generic/include/_ishm_internal.h \ + ${top_srcdir}/platform/linux-generic/include/_ishmphy_internal.h \ + ${top_srcdir}/platform/linux-generic/include/_ishmpool_internal.h \ + ${top_srcdir}/platform/linux-generic/include/drv_driver_internal.h\ + ${top_srcdir}/platform/linux-generic/include/odp_align_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_atomic_internal.h \ + ${srcdir}/include/odp_buffer_inlines.h \ + ${srcdir}/include/odp_buffer_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_bitmap_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_classification_internal.h \ + ${srcdir}/include/odp_config_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_debug_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_classification_datamodel.h \ + ${top_srcdir}/platform/linux-generic/include/odp_classification_inlines.h \ + ${top_srcdir}/platform/linux-generic/include/odp_classification_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_crypto_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_forward_typedefs_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_internal.h \ ++ ${top_srcdir}/platform/linux-generic/include/odp_ipsec_internal.h \ + ${srcdir}/pktio/dpdk.h \ + ${srcdir}/include/odp_packet_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_pktio_ops_ipc.h \ + ${top_srcdir}/platform/linux-generic/include/odp_pktio_ops_subsystem.h \ + ${top_srcdir}/platform/linux-generic/include/odp_pktio_ops_socket.h \ + ${top_srcdir}/platform/linux-generic/include/odp_pktio_ops_loopback.h \ + ${top_srcdir}/platform/linux-generic/include/odp_name_table_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_packet_io_internal.h \ + ${srcdir}/include/odp_errno_define.h \ + ${top_srcdir}/platform/linux-generic/include/odp_packet_io_ring_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_pkt_queue_internal.h \ + ${srcdir}/include/odp_pool_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_pool_subsystem.h \ + ${srcdir}/include/odp_posix_extensions.h \ + ${top_srcdir}/platform/linux-generic/include/odp_queue_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_queue_if.h \ + ${top_srcdir}/platform/linux-generic/include/odp_queue_subsystem.h \ + ${top_srcdir}/platform/linux-generic/include/odp_ring_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_schedule_if.h \ + ${top_srcdir}/platform/linux-generic/include/odp_schedule_subsystem.h \ + ${top_srcdir}/platform/linux-generic/include/odp_sorted_list_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_shm_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_time_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_timer_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_timer_wheel_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_traffic_mngr_internal.h \ + ${srcdir}/include/protocols/eth.h \ + ${srcdir}/include/protocols/ip.h \ + ${srcdir}/include/protocols/ipsec.h \ + ${srcdir}/include/protocols/tcp.h \ + ${srcdir}/include/protocols/udp.h \ + ${srcdir}/Makefile.inc + +__LIB__libodp_dpdk_la_SOURCES = \ + ../linux-generic/_fdserver.c \ + ../linux-generic/_ishm.c \ + ../linux-generic/_ishmphy.c \ + ../linux-generic/_ishmpool.c \ + ../linux-generic/_modules.c \ + ../linux-generic/odp_atomic.c \ + ../linux-generic/odp_barrier.c \ + ../linux-generic/odp_bitmap.c \ + buffer/dpdk.c \ + ../linux-generic/odp_byteorder.c \ + ../linux-generic/odp_chksum.c \ + ../linux-generic/odp_classification.c \ + ../linux-generic/odp_cpu.c \ + ../linux-generic/odp_cpumask.c \ + ../linux-generic/odp_cpumask_task.c \ + odp_crypto.c \ + odp_errno.c \ + ../linux-generic/odp_event.c \ + ../linux-generic/odp_hash.c \ + odp_init.c \ + ../linux-generic/odp_impl.c \ + ../linux-generic/odp_ipsec.c \ ++ ../linux-generic/odp_ipsec_events.c \ ++ ../linux-generic/odp_ipsec_sad.c \ + ../linux-generic/odp_name_table.c \ + odp_packet.c \ + pktio/dpdk.c \ + ../linux-generic/pktio/subsystem.c \ + odp_packet_flags.c \ + ../linux-generic/odp_packet_io.c \ + ../linux-generic/pktio/loopback.c \ + ../linux-generic/odp_pkt_queue.c \ + pool/dpdk.c \ + ../linux-generic/odp_queue_if.c \ + ../linux-generic/queue/subsystem.c \ + ../linux-generic/queue/generic.c \ + ../linux-generic/queue/scalable.c \ + ../linux-generic/odp_rwlock.c \ + ../linux-generic/odp_rwlock_recursive.c \ + ../linux-generic/pool/subsystem.c \ + ../linux-generic/buffer/subsystem.c \ + ../linux-generic/odp_schedule_if.c \ + ../linux-generic/schedule/generic.c \ + ../linux-generic/schedule/iquery.c \ + ../linux-generic/schedule/scalable.c \ + ../linux-generic/schedule/scalable_ordered.c \ + ../linux-generic/schedule/sp.c \ + ../linux-generic/schedule/subsystem.c \ + ../linux-generic/odp_shared_memory.c \ + ../linux-generic/odp_sorted_list.c \ + ../linux-generic/odp_spinlock.c \ + ../linux-generic/odp_spinlock_recursive.c \ + odp_std_clib.c \ + ../linux-generic/odp_sync.c \ + ../linux-generic/odp_system_info.c \ + odp_thread.c \ + ../linux-generic/odp_thrmask.c \ + ../linux-generic/odp_ticketlock.c \ + odp_time.c \ + ../linux-generic/odp_timer.c \ + ../linux-generic/odp_timer_wheel.c \ + ../linux-generic/odp_traffic_mngr.c \ + ../linux-generic/odp_version.c \ + ../linux-generic/odp_weak.c \ + ../linux-generic/drv_atomic.c \ + ../linux-generic/drv_barrier.c \ + ../linux-generic/drv_driver.c \ + ../linux-generic/drv_shm.c \ + ../linux-generic/drv_spinlock.c + +if ARCH_IS_ARM +__LIB__libodp_dpdk_la_SOURCES += arch/arm/odp_cpu_arch.c \ + arch/arm/odp_cpu_cycles.c \ + arch/arm/odp_global_time.c \ + arch/arm/odp_sysinfo_parse.c +endif +if ARCH_IS_AARCH64 +__LIB__libodp_dpdk_la_SOURCES += arch/default/odp_cpu_arch.c \ + arch/default/odp_cpu_cycles.c \ + arch/aarch64/odp_global_time.c \ + arch/default/odp_sysinfo_parse.c +endif +if ARCH_IS_MIPS64 +__LIB__libodp_dpdk_la_SOURCES += arch/mips64/odp_cpu_arch.c \ + arch/default/odp_cpu_cycles.c \ + arch/default/odp_global_time.c \ + arch/mips64/odp_sysinfo_parse.c +endif +if ARCH_IS_POWERPC +__LIB__libodp_dpdk_la_SOURCES += arch/powerpc/odp_cpu_arch.c \ + arch/default/odp_cpu_cycles.c \ + arch/default/odp_global_time.c \ + arch/powerpc/odp_sysinfo_parse.c +endif +if ARCH_IS_X86 +__LIB__libodp_dpdk_la_SOURCES += arch/x86/cpu_flags.c \ + arch/x86/odp_cpu_arch.c \ + arch/default/odp_cpu_cycles.c \ + arch/x86/odp_global_time.c \ + arch/x86/odp_sysinfo_parse.c +endif + +pool/dpdk.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +buffer/dpdk.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +if ODP_SCHEDULE_SCALABLE +../linux-generic/schedule/scalable.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +else +if ODP_SCHEDULE_SP +../linux-generic/schedule/sp.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +else +if ODP_SCHEDULE_IQUERY +../linux-generic/schedule/iquery.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +else +../linux-generic/schedule/generic.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +endif +endif +endif +if ODP_SCHEDULE_SCALABLE +../linux-generic/queue/scalable.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +else +../linux-generic/queue/generic.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE +endif + +# Build modular framework into odp-linux library +modularframeworkdir = $(top_srcdir)/frameworks/modular +noinst_HEADERS += $(modularframeworkdir)/list.h \ + $(modularframeworkdir)/odp_module.h + +__LIB__libodp_dpdk_la_SOURCES += ../../frameworks/modular/odp_module.c + +__LIB__libodp_dpdk_la_LIBADD = $(ATOMIC_LIBS) +__LIB__libodp_dpdk_la_LIBADD += $(DPDK_LIBS) +__LIB__libodp_dpdk_la_LIBADD += $(OPENSSL_LIBS) +__LIB__libodp_dpdk_la_LIBADD += $(PTHREAD_LIBS) +__LIB__libodp_dpdk_la_LIBADD += $(TIMER_LIBS) +__LIB__libodp_dpdk_la_LIBADD += $(LIBCONFIG_LIBS) + +# Create symlink for ABI header files. Application does not need to use the arch +# specific include path for installed files. +install-data-hook: + if [ -h $(DESTDIR)$(prefix)/include/odp/api/abi ]; then \ + : ; \ + else \ + $(LN_S) -rf $(DESTDIR)$(prefix)/include/odp/arch/@ARCH_ABI@/odp/api/abi \ + $(DESTDIR)$(prefix)/include/odp/api/abi; \ + fi diff --cc platform/linux-dpdk/include/odp/api/plat/timer_types.h index c81d7be7,00000000..2ae8bfec mode 100644,000000..100644 --- a/platform/linux-dpdk/include/odp/api/plat/timer_types.h +++ b/platform/linux-dpdk/include/odp/api/plat/timer_types.h @@@ -1,50 -1,0 +1,50 @@@ +/* Copyright (c) 2013, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/** + * @file + * + * ODP timer service + */ + +#ifndef ODP_TIMER_TYPES_H_ +#define ODP_TIMER_TYPES_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <odp/api/plat/strong_types.h> + +/** @addtogroup odp_timer + * @{ + **/ + - struct odp_timer_pool_s; /**< Forward declaration */ ++struct timer_pool_s; /**< Forward declaration */ + - typedef struct odp_timer_pool_s *odp_timer_pool_t; ++typedef struct timer_pool_s *odp_timer_pool_t; + +#define ODP_TIMER_POOL_INVALID NULL + +#define ODP_TIMER_POOL_NAME_LEN 32 + +typedef ODP_HANDLE_T(odp_timer_t); + +#define ODP_TIMER_INVALID _odp_cast_scalar(odp_timer_t, 0xffffffff) + +typedef ODP_HANDLE_T(odp_timeout_t); + +#define ODP_TIMEOUT_INVALID _odp_cast_scalar(odp_timeout_t, 0xffffffff) + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif diff --cc platform/linux-dpdk/include/odp_packet_internal.h index 66159cae,00000000..16a58334 mode 100644,000000..100644 --- a/platform/linux-dpdk/include/odp_packet_internal.h +++ b/platform/linux-dpdk/include/odp_packet_internal.h @@@ -1,247 -1,0 +1,262 @@@ +/* Copyright (c) 2014, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/** + * @file + * + * ODP packet descriptor - implementation internal + */ + +#ifndef ODP_PACKET_INTERNAL_H_ +#define ODP_PACKET_INTERNAL_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <odp/api/align.h> +#include <odp_debug_internal.h> +#include <odp/api/debug.h> +#include <odp_buffer_internal.h> +#include <odp_buffer_inlines.h> +#include <odp_pool_internal.h> +#include <odp/api/packet.h> +#include <odp/api/packet_io.h> +#include <odp/api/crypto.h> +#include <odp_crypto_internal.h> ++#include <odp_ipsec_internal.h> +#include <protocols/eth.h> +#include <odp/api/plat/packet_types.h> +#include <odp_queue_if.h> + +#include <rte_acl_osdep.h> + +/** Minimum segment length expected by packet_parse_common() */ +#define PACKET_PARSE_SEG_LEN 96 + +ODP_STATIC_ASSERT(sizeof(_odp_packet_input_flags_t) == sizeof(uint64_t), + "INPUT_FLAGS_SIZE_ERROR"); + +/** + * Packet error flags + */ +typedef union { + /* All error flags */ + uint32_t all; + + struct { + /* Bitfield flags for each detected error */ + uint32_t app_error:1; /**< Error bit for application use */ + uint32_t frame_len:1; /**< Frame length error */ + uint32_t snap_len:1; /**< Snap length error */ + uint32_t l2_chksum:1; /**< L2 checksum error, checks TBD */ + uint32_t ip_err:1; /**< IP error, checks TBD */ + uint32_t tcp_err:1; /**< TCP error, checks TBD */ + uint32_t udp_err:1; /**< UDP error, checks TBD */ + }; +} error_flags_t; + +ODP_STATIC_ASSERT(sizeof(error_flags_t) == sizeof(uint32_t), + "ERROR_FLAGS_SIZE_ERROR"); + +/** + * Packet output flags + */ +typedef union { + /* All output flags */ + uint32_t all; + + struct { + /** adjustment for traffic mgr */ + uint32_t shaper_len_adj:8; + + /* Bitfield flags for each output option */ + uint32_t l3_chksum_set:1; /**< L3 chksum bit is valid */ + uint32_t l3_chksum:1; /**< L3 chksum override */ + uint32_t l4_chksum_set:1; /**< L3 chksum bit is valid */ + uint32_t l4_chksum:1; /**< L4 chksum override */ + }; +} output_flags_t; + +ODP_STATIC_ASSERT(sizeof(output_flags_t) == sizeof(uint32_t), + "OUTPUT_FLAGS_SIZE_ERROR"); + +/** + * Packet parser metadata + */ +typedef struct { + _odp_packet_input_flags_t input_flags; + error_flags_t error_flags; + output_flags_t output_flags; + + uint32_t l2_offset; /**< offset to L2 hdr, e.g. Eth */ + uint32_t l3_offset; /**< offset to L3 hdr, e.g. IPv4, IPv6 */ + uint32_t l4_offset; /**< offset to L4 hdr (TCP, UDP, SCTP, also ICMP) */ +} packet_parser_t; + +/** + * Internal Packet header + * + * To optimize fast path performance this struct is not initialized to zero in + * packet_init(). Because of this any new fields added must be reviewed for + * initialization requirements. + */ +typedef struct { + /* common buffer header */ + odp_buffer_hdr_t buf_hdr; + + /* + * Following members are initialized by packet_init() + */ + + packet_parser_t p; + + odp_pktio_t input; + + /* + * Members below are not initialized by packet_init() + */ + + /* Timestamp value */ + odp_time_t timestamp; + + /* Classifier destination queue */ + queue_t dst_queue; + + /* Result for crypto packet op */ + odp_crypto_packet_result_t crypto_op_result; ++ ++ /* Context for IPsec */ ++ odp_ipsec_packet_result_t ipsec_ctx; +} odp_packet_hdr_t __rte_cache_aligned; + +/** + * Return the packet header + */ +static inline odp_packet_hdr_t *odp_packet_hdr(odp_packet_t pkt) +{ + return (odp_packet_hdr_t *)(uintptr_t)pkt; +} + +static inline struct rte_mbuf *pkt_to_mbuf(odp_packet_hdr_t *pkt_hdr) +{ + return &pkt_hdr->buf_hdr.mb; +} + +static inline odp_buffer_hdr_t *packet_to_buf_hdr(odp_packet_t pkt) +{ + return &odp_packet_hdr(pkt)->buf_hdr; +} + +static inline odp_packet_t packet_from_buf_hdr(odp_buffer_hdr_t *buf_hdr) +{ + return (odp_packet_t)(odp_packet_hdr_t *)buf_hdr; +} + +static inline odp_buffer_t packet_to_buffer(odp_packet_t pkt) +{ + return (odp_buffer_t)pkt; +} + +static inline void copy_packet_parser_metadata(odp_packet_hdr_t *src_hdr, + odp_packet_hdr_t *dst_hdr) +{ + dst_hdr->p = src_hdr->p; +} + +static inline void copy_packet_cls_metadata(odp_packet_hdr_t *src_hdr, + odp_packet_hdr_t *dst_hdr) +{ + dst_hdr->p = src_hdr->p; + dst_hdr->dst_queue = src_hdr->dst_queue; + dst_hdr->timestamp = src_hdr->timestamp; +} + +static inline uint32_t packet_len(odp_packet_hdr_t *pkt_hdr) +{ + return rte_pktmbuf_pkt_len(&pkt_hdr->buf_hdr.mb); +} + +static inline void packet_set_len(odp_packet_hdr_t *pkt_hdr, uint32_t len) +{ + rte_pktmbuf_pkt_len(&pkt_hdr->buf_hdr.mb) = len; +} + +/* Forward declarations */ +int _odp_packet_copy_md_to_packet(odp_packet_t srcpkt, odp_packet_t dstpkt); + +/* Perform packet parse up to a given protocol layer */ +int packet_parse_layer(odp_packet_hdr_t *pkt_hdr, + odp_pktio_parser_layer_t layer); + ++/* Perform L3 and L4 parsing up to a given protocol layer */ ++int packet_parse_l3_l4(odp_packet_hdr_t *pkt_hdr, ++ odp_pktio_parser_layer_t layer, ++ uint32_t l3_offset, ++ uint16_t ethtype); ++ +/* Reset parser metadata for a new parse */ +static inline void packet_parse_reset(odp_packet_hdr_t *pkt_hdr) +{ + /* Reset parser metadata before new parse */ + pkt_hdr->p.error_flags.all = 0; + pkt_hdr->p.input_flags.all = 0; + pkt_hdr->p.output_flags.all = 0; + pkt_hdr->p.l2_offset = 0; + pkt_hdr->p.l3_offset = ODP_PACKET_OFFSET_INVALID; + pkt_hdr->p.l4_offset = ODP_PACKET_OFFSET_INVALID; +} + +/* Convert a buffer handle to a packet handle */ +odp_packet_t _odp_packet_from_buf_hdr(odp_buffer_hdr_t *buf_hdr); + +static inline int packet_hdr_has_l2(odp_packet_hdr_t *pkt_hdr) +{ + return pkt_hdr->p.input_flags.l2; +} + +static inline void packet_hdr_has_l2_set(odp_packet_hdr_t *pkt_hdr, int val) +{ + pkt_hdr->p.input_flags.l2 = val; +} + +static inline int packet_hdr_has_eth(odp_packet_hdr_t *pkt_hdr) +{ + return pkt_hdr->p.input_flags.eth; +} + +static inline int packet_hdr_has_ipv6(odp_packet_hdr_t *pkt_hdr) +{ + return pkt_hdr->p.input_flags.ipv6; +} + +static inline void packet_set_ts(odp_packet_hdr_t *pkt_hdr, odp_time_t *ts) +{ + if (ts != NULL) { + pkt_hdr->timestamp = *ts; + pkt_hdr->p.input_flags.timestamp = 1; + } +} + +int packet_parse_common(packet_parser_t *pkt_hdr, const uint8_t *ptr, + uint32_t pkt_len, uint32_t seg_len, + odp_pktio_parser_layer_t layer); + ++int _odp_packet_set_data(odp_packet_t pkt, uint32_t offset, ++ uint8_t c, uint32_t len); ++ ++int _odp_packet_cmp_data(odp_packet_t pkt, uint32_t offset, ++ const void *s, uint32_t len); + +/* We can't enforce tailroom reservation for received packets */ +ODP_STATIC_ASSERT(CONFIG_PACKET_TAILROOM == 0, + "ERROR: Tailroom has to be 0, DPDK doesn't support this"); + +#ifdef __cplusplus +} +#endif + +#endif diff --cc platform/linux-dpdk/libodp-dpdk.pc.in index f22e832c,00000000..f22e832c mode 100644,000000..100644 --- a/platform/linux-dpdk/libodp-dpdk.pc.in +++ b/platform/linux-dpdk/libodp-dpdk.pc.in diff --cc platform/linux-dpdk/m4/configure.m4 index 16fdeade,00000000..9d299bf3 mode 100644,000000..100644 --- a/platform/linux-dpdk/m4/configure.m4 +++ b/platform/linux-dpdk/m4/configure.m4 @@@ -1,166 -1,0 +1,176 @@@ +# Enable -fvisibility=hidden if using a gcc that supports it +OLD_CFLAGS="$CFLAGS" +AC_MSG_CHECKING([whether $CC supports -fvisibility=hidden]) +VISIBILITY_CFLAGS="-fvisibility=hidden" +CFLAGS="$CFLAGS $VISIBILITY_CFLAGS" +AC_LINK_IFELSE([AC_LANG_PROGRAM()], AC_MSG_RESULT([yes]), + [VISIBILITY_CFLAGS=""; AC_MSG_RESULT([no])]); + +AC_SUBST(VISIBILITY_CFLAGS) +# Restore CFLAGS; VISIBILITY_CFLAGS are added to it where needed. +CFLAGS=$OLD_CFLAGS + +AC_MSG_CHECKING(for GCC atomic builtins) +AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [[int main() { + int v = 1; + __atomic_fetch_add(&v, 1, __ATOMIC_RELAXED); + __atomic_fetch_sub(&v, 1, __ATOMIC_RELAXED); + __atomic_store_n(&v, 1, __ATOMIC_RELAXED); + __atomic_load_n(&v, __ATOMIC_RELAXED); + return 0; + } + ]])], + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no) + echo "GCC-style __atomic builtins not supported by the compiler." + echo "Use newer version. For gcc > 4.7.0" + exit -1) + +dnl Check for libconfig (required) +PKG_CHECK_MODULES([LIBCONFIG], [libconfig >= 1.3.2]) + +dnl Check whether -latomic is needed +use_libatomic=no + +AC_MSG_CHECKING(whether -latomic is needed for 64-bit atomic built-ins) +AC_LINK_IFELSE( + [AC_LANG_SOURCE([[ + static int loc; + int main(void) + { + int prev = __atomic_exchange_n(&loc, 7, __ATOMIC_RELAXED); + return 0; + } + ]])], + [AC_MSG_RESULT(no)], + [AC_MSG_RESULT(yes) + AC_CHECK_LIB( + [atomic], [__atomic_exchange_8], + [use_libatomic=yes], + [AC_MSG_CHECKING([__atomic_exchange_8 is not available])]) + ]) + +AC_MSG_CHECKING(whether -latomic is needed for 128-bit atomic built-ins) +AC_LINK_IFELSE( + [AC_LANG_SOURCE([[ + static __int128 loc; + int main(void) + { + __int128 prev; + prev = __atomic_exchange_n(&loc, 7, __ATOMIC_RELAXED); + return 0; + } + ]])], + [AC_MSG_RESULT(no)], + [AC_MSG_RESULT(yes) + AC_CHECK_LIB( + [atomic], [__atomic_exchange_16], + [use_libatomic=yes], + [AC_MSG_CHECKING([cannot detect support for 128-bit atomics])]) + ]) + +if test "x$use_libatomic" = "xyes"; then + ATOMIC_LIBS="-latomic" +fi +AC_SUBST([ATOMIC_LIBS]) + +# linux-generic PCAP support is not relevant as the code doesn't use +# linux-generic pktio at all. And DPDK has its own PCAP support anyway +AM_CONDITIONAL([HAVE_PCAP], [false]) +AM_CONDITIONAL([netmap_support], [false]) +AM_CONDITIONAL([PKTIO_DPDK], [false]) +m4_include([platform/linux-dpdk/m4/odp_pthread.m4]) - m4_include([platform/linux-dpdk/m4/odp_timer.m4]) - m4_include([platform/linux-dpdk/m4/odp_openssl.m4]) ++ODP_TIMER ++ODP_OPENSSL +m4_include([platform/linux-dpdk/m4/odp_modules.m4]) +m4_include([platform/linux-dpdk/m4/odp_schedule.m4]) + ++m4_include([platform/linux-dpdk/m4/performance.m4]) ++ +########################################################################## +# DPDK build variables +########################################################################## +DPDK_DRIVER_DIR=/usr/lib/$(uname -m)-linux-gnu +AS_CASE($host_cpu, [x86_64], [DPDK_CPPFLAGS="$DPDK_CPPFLAGS -msse4.2"]) +if test "x${SDK_INSTALL_PATH}" = "x"; then + DPDK_CPPFLAGS="$DPDK_CPPFLAGS -I/usr/include/dpdk" +else + DPDK_DRIVER_DIR=$SDK_INSTALL_PATH/lib + DPDK_CPPFLAGS="$DPDK_CPPFLAGS -I$SDK_INSTALL_PATH/include" + DPDK_LDFLAGS="$DPDK_CPPFLAGS -L$SDK_INSTALL_PATH/lib" +fi + +# Check if we should link against the static or dynamic DPDK library +AC_ARG_ENABLE([shared-dpdk], + [ --enable-shared-dpdk link against the shared DPDK library], + [if test "x$enableval" = "xyes"; then + shared_dpdk=true + fi]) + +########################################################################## +# Save and set temporary compilation flags +########################################################################## +OLD_LDFLAGS=$LDFLAGS +OLD_CPPFLAGS=$CPPFLAGS +LDFLAGS="$DPDK_LDFLAGS $LDFLAGS" +CPPFLAGS="$DPDK_CPPFLAGS $CPPFLAGS -pthread" + +########################################################################## +# Check for DPDK availability +########################################################################## +AC_CHECK_HEADERS([rte_config.h], [], + [AC_MSG_FAILURE(["can't find DPDK headers"])]) + +########################################################################## +# In case of static linking DPDK pmd drivers are not linked unless the +# --whole-archive option is used. No spaces are allowed between the +# --whole-arhive flags. +########################################################################## +if test "x$shared_dpdk" = "xtrue"; then + DPDK_LIBS="-Wl,--no-as-needed,-ldpdk,-as-needed -ldl -lm -lpcap" +else + + AS_VAR_SET([DPDK_PMDS], [-Wl,--whole-archive,]) + for filename in $DPDK_DRIVER_DIR/librte_pmd_*.a; do + cur_driver=`basename "$filename" .a | sed -e 's/^lib//'` + # rte_pmd_nfp has external dependencies which break linking + if test "$cur_driver" = "rte_pmd_nfp"; then + echo "skip linking rte_pmd_nfp" + else + AS_VAR_APPEND([DPDK_PMDS], [-l$cur_driver,]) + fi + done + AS_VAR_APPEND([DPDK_PMDS], [--no-whole-archive]) + + DPDK_LIBS="-L$DPDK_DRIVER_DIR -ldpdk -lpthread -ldl -lm -lpcap" + AC_SUBST([DPDK_PMDS]) +fi + +########################################################################## +# Restore old saved variables +########################################################################## +LDFLAGS=$OLD_LDFLAGS +CPPFLAGS=$OLD_CPPFLAGS + +AC_SUBST([DPDK_CPPFLAGS]) +AC_SUBST([DPDK_LDFLAGS]) +AC_SUBST([DPDK_LIBS]) + ++AC_CONFIG_COMMANDS_PRE([dnl ++AM_CONDITIONAL([PLATFORM_IS_LINUX_DPDK], ++ [test "${with_platform}" = "linux-dpdk"]) ++]) ++ +AC_CONFIG_FILES([platform/linux-dpdk/Makefile - platform/linux-dpdk/include/odp/api/plat/static_inline.h]) ++ platform/linux-dpdk/libodp-dpdk.pc ++ platform/linux-dpdk/include/odp/api/plat/static_inline.h ++ platform/linux-dpdk/test/Makefile ++ platform/linux-dpdk/test/validation/api/pktio/Makefile]) + +########################################################################## +# Enable dpdk pktio build +########################################################################## +AC_DEFINE([ODP_PKTIO_DPDK], [1], + [Define to 1 to enable DPDK packet I/O support]) diff --cc platform/linux-dpdk/m4/performance.m4 index 00000000,00000000..fcc3d661 new file mode 120000 --- /dev/null +++ b/platform/linux-dpdk/m4/performance.m4 @@@ -1,0 -1,0 +1,1 @@@ ++../../linux-generic/m4/performance.m4 diff --cc platform/linux-dpdk/odp_init.c index 81b60898,1412c03a..b3c5f5c9 --- a/platform/linux-dpdk/odp_init.c +++ b/platform/linux-dpdk/odp_init.c @@@ -402,12 -223,18 +402,24 @@@ int odp_init_global(odp_instance_t *ins } stage = NAME_TABLE_INIT;
+ if (_odpdrv_driver_init_global()) { + ODP_ERR("ODP drivers init failed\n"); + goto init_failed; + } + stage = DRIVER_INIT; + + if (_odp_ipsec_events_init_global()) { + ODP_ERR("ODP IPsec events init failed.\n"); + goto init_failed; + } + stage = IPSEC_EVENTS_INIT; + + if (_odp_ipsec_sad_init_global()) { + ODP_ERR("ODP IPsec SAD init failed.\n"); + goto init_failed; + } + stage = IPSEC_SAD_INIT; + if (_odp_modules_init_global()) { ODP_ERR("ODP modules init failed\n"); goto init_failed; @@@ -440,13 -265,20 +450,27 @@@ int _odp_term_global(enum init_stage st switch (stage) { case ALL_INIT: case MODULES_INIT: + case IPSEC_SAD_INIT: + if (_odp_ipsec_sad_term_global()) { + ODP_ERR("ODP IPsec SAD term failed.\n"); + rc = -1; + } + /* Fall through */ + + case IPSEC_EVENTS_INIT: + if (_odp_ipsec_events_term_global()) { + ODP_ERR("ODP IPsec events term failed.\n"); + rc = -1; + } + /* Fall through */ + + case DRIVER_INIT: + if (_odpdrv_driver_term_global()) { + ODP_ERR("driver term failed.\n"); + rc = -1; + } + /* Fall through */ + case NAME_TABLE_INIT: if (_odp_int_name_tbl_term_global()) { ODP_ERR("Name table term failed.\n"); @@@ -592,11 -424,17 +616,17 @@@ int odp_init_local(odp_instance_t insta } stage = POOL_INIT;
- if (queue_fn->init_local()) { - ODP_ERR("ODP queue local init failed.\n"); + if (odp_schedule_init_local()) { + ODP_ERR("ODP schedule local init failed.\n"); goto init_fail; } - /* stage = SCHED_INIT; */ - stage = QUEUE_INIT; ++ stage = SCHED_INIT; + - if (sched_fn->init_local()) { - ODP_ERR("ODP schedule local init failed.\n"); ++ if (_odpdrv_driver_init_local()) { ++ ODP_ERR("ODP driver local init failed.\n"); + goto init_fail; + } - /* stage = SCHED_INIT; */ ++ /* stage = DRIVER_INIT; */
return 0;
diff --cc platform/linux-dpdk/odp_packet.c index 103f6f7a,00000000..2391f13d mode 100644,000000..100644 --- a/platform/linux-dpdk/odp_packet.c +++ b/platform/linux-dpdk/odp_packet.c @@@ -1,1510 -1,0 +1,1667 @@@ +/* Copyright (c) 2013, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include <config.h> + +#include <odp/api/plat/packet_inlines.h> +#include <odp/api/packet.h> +#include <odp_packet_internal.h> +#include <odp_debug_internal.h> +#include <odp/api/hints.h> +#include <odp/api/byteorder.h> + +#include <protocols/eth.h> +#include <protocols/ip.h> +#include <protocols/tcp.h> +#include <protocols/udp.h> + +#include <string.h> +#include <stdio.h> +#include <stddef.h> +#include <inttypes.h> + +#include <odp/visibility_begin.h> + +/* Fill in packet header field offsets for inline functions */ + +const _odp_packet_inline_offset_t _odp_packet_inline ODP_ALIGNED_CACHE = { + .mb = offsetof(odp_packet_hdr_t, buf_hdr.mb), + .pool = offsetof(odp_packet_hdr_t, buf_hdr.pool_hdl), + .input = offsetof(odp_packet_hdr_t, input), + .user_ptr = offsetof(odp_packet_hdr_t, buf_hdr.buf_ctx), + .timestamp = offsetof(odp_packet_hdr_t, timestamp), + .input_flags = offsetof(odp_packet_hdr_t, p.input_flags), + .buf_addr = offsetof(odp_packet_hdr_t, buf_hdr.mb) + + offsetof(const struct rte_mbuf, buf_addr), + .data = offsetof(odp_packet_hdr_t, buf_hdr.mb) + + offsetof(struct rte_mbuf, data_off), + .pkt_len = offsetof(odp_packet_hdr_t, buf_hdr.mb) + + (size_t)&rte_pktmbuf_pkt_len((struct rte_mbuf *)0), + .seg_len = offsetof(odp_packet_hdr_t, buf_hdr.mb) + + (size_t)&rte_pktmbuf_data_len((struct rte_mbuf *)0), + .nb_segs = offsetof(odp_packet_hdr_t, buf_hdr.mb) + + offsetof(struct rte_mbuf, nb_segs), + .udata = sizeof(odp_packet_hdr_t), + .rss = offsetof(odp_packet_hdr_t, buf_hdr.mb) + + offsetof(struct rte_mbuf, hash.rss), + .ol_flags = offsetof(odp_packet_hdr_t, buf_hdr.mb) + + offsetof(struct rte_mbuf, ol_flags), + .rss_flag = PKT_RX_RSS_HASH +}; + +#include <odp/visibility_end.h> + +struct rte_mbuf dummy; +ODP_STATIC_ASSERT(sizeof(dummy.data_off) == sizeof(uint16_t), + "data_off should be uint16_t"); +ODP_STATIC_ASSERT(sizeof(dummy.pkt_len) == sizeof(uint32_t), + "pkt_len should be uint32_t"); +ODP_STATIC_ASSERT(sizeof(dummy.data_len) == sizeof(uint16_t), + "data_len should be uint16_t"); +ODP_STATIC_ASSERT(sizeof(dummy.hash.rss) == sizeof(uint32_t), + "hash.rss should be uint32_t"); +ODP_STATIC_ASSERT(sizeof(dummy.ol_flags) == sizeof(uint64_t), + "ol_flags should be uint64_t"); +/* + * + * Alloc and free + * ******************************************************** + * + */ + +static inline odp_buffer_t buffer_handle(odp_packet_hdr_t *pkt_hdr) +{ + return pkt_hdr->buf_hdr.handle.handle; +} + +static inline odp_packet_hdr_t *buf_to_packet_hdr(odp_buffer_t buf) +{ + return (odp_packet_hdr_t *)buf_hdl_to_hdr(buf); +} + +static odp_packet_t packet_alloc(odp_pool_t pool_hdl, uint32_t len) +{ + pool_entry_dp_t *pool_dp; + odp_packet_t pkt; + uintmax_t totsize = RTE_PKTMBUF_HEADROOM + len; + odp_packet_hdr_t *pkt_hdr; + struct rte_mbuf *mbuf; + + ODP_ASSERT(odp_pool_to_entry_cp(pool_hdl)->params.type + == ODP_POOL_PACKET); + + pool_dp = odp_pool_to_entry_dp(pool_hdl); + + mbuf = rte_pktmbuf_alloc(pool_dp->rte_mempool); + if (mbuf == NULL) { + rte_errno = ENOMEM; + return ODP_PACKET_INVALID; + } + pkt_hdr = (odp_packet_hdr_t *)mbuf; + pkt_hdr->buf_hdr.totsize = mbuf->buf_len; + + if (mbuf->buf_len < totsize) { + intmax_t needed = totsize - mbuf->buf_len; + struct rte_mbuf *curseg = mbuf; + + do { + struct rte_mbuf *nextseg = + rte_pktmbuf_alloc(pool_dp->rte_mempool); + + if (nextseg == NULL) { + rte_pktmbuf_free(mbuf); + return ODP_PACKET_INVALID; + } + + curseg->next = nextseg; + curseg = nextseg; + curseg->data_off = 0; + pkt_hdr->buf_hdr.totsize += curseg->buf_len; + needed -= curseg->buf_len; + } while (needed > 0); + } + + pkt = (odp_packet_t)mbuf; + + if (odp_packet_reset(pkt, len) != 0) + return ODP_PACKET_INVALID; + + return pkt; +} + +odp_packet_t odp_packet_alloc(odp_pool_t pool_hdl, uint32_t len) +{ + return packet_alloc(pool_hdl, len); +} + +int odp_packet_alloc_multi(odp_pool_t pool_hdl, uint32_t len, + odp_packet_t pkt[], int num) +{ + int i; + + for (i = 0; i < num; i++) { + pkt[i] = packet_alloc(pool_hdl, len); + if (pkt[i] == ODP_PACKET_INVALID) + return rte_errno == ENOMEM ? i : -EINVAL; + } + return i; +} + +void odp_packet_free(odp_packet_t pkt) +{ + struct rte_mbuf *mbuf = (struct rte_mbuf *)pkt; + rte_pktmbuf_free(mbuf); +} + +void odp_packet_free_multi(const odp_packet_t pkt[], int num) +{ + int i; + + for (i = 0; i < num; i++) { + struct rte_mbuf *mbuf = (struct rte_mbuf *)pkt[i]; + + rte_pktmbuf_free(mbuf); + } +} + +int odp_packet_reset(odp_packet_t pkt, uint32_t len) +{ + odp_packet_hdr_t *const pkt_hdr = odp_packet_hdr(pkt); + struct rte_mbuf *ms, *mb = &pkt_hdr->buf_hdr.mb; + uint8_t nb_segs = 0; + int32_t lenleft = len; + + if (RTE_PKTMBUF_HEADROOM + len > odp_packet_buf_len(pkt)) { + ODP_DBG("Not enought head room for that packet %d/%d\n", + RTE_PKTMBUF_HEADROOM + len, + odp_packet_buf_len(pkt)); + return -1; + } + + pkt_hdr->p.input_flags.all = 0; + pkt_hdr->p.output_flags.all = 0; + pkt_hdr->p.error_flags.all = 0; + + pkt_hdr->p.l2_offset = 0; + pkt_hdr->p.l3_offset = ODP_PACKET_OFFSET_INVALID; + pkt_hdr->p.l4_offset = ODP_PACKET_OFFSET_INVALID; + + pkt_hdr->buf_hdr.next = NULL; + + pkt_hdr->input = ODP_PKTIO_INVALID; + pkt_hdr->buf_hdr.event_subtype = ODP_EVENT_PACKET_BASIC; + + mb->port = 0xff; + mb->pkt_len = len; + mb->data_off = RTE_PKTMBUF_HEADROOM; + mb->vlan_tci = 0; + nb_segs = 1; + + if (RTE_PKTMBUF_HEADROOM + lenleft <= mb->buf_len) { + mb->data_len = lenleft; + } else { + mb->data_len = mb->buf_len - RTE_PKTMBUF_HEADROOM; + lenleft -= mb->data_len; + ms = mb->next; + while (lenleft > 0) { + nb_segs++; + ms->data_len = lenleft <= ms->buf_len ? + lenleft : ms->buf_len; + lenleft -= ms->buf_len; + ms = ms->next; + } + } + + mb->nb_segs = nb_segs; + return 0; +} + +odp_packet_t _odp_packet_from_buf_hdr(odp_buffer_hdr_t *buf_hdr) +{ + return (odp_packet_t)buf_hdr; +} + +odp_packet_t odp_packet_from_event(odp_event_t ev) +{ + if (odp_unlikely(ev == ODP_EVENT_INVALID)) + return ODP_PACKET_INVALID; + + return (odp_packet_t)buf_to_packet_hdr((odp_buffer_t)ev); +} + +odp_event_t odp_packet_to_event(odp_packet_t pkt) +{ + if (odp_unlikely(pkt == ODP_PACKET_INVALID)) + return ODP_EVENT_INVALID; + + return (odp_event_t)buffer_handle(odp_packet_hdr(pkt)); +} + +uint32_t odp_packet_buf_len(odp_packet_t pkt) +{ + return odp_packet_hdr(pkt)->buf_hdr.totsize; +} + +void *odp_packet_tail(odp_packet_t pkt) +{ + struct rte_mbuf *mb = &(odp_packet_hdr(pkt)->buf_hdr.mb); + mb = rte_pktmbuf_lastseg(mb); + return (void *)(rte_pktmbuf_mtod(mb, char *) + mb->data_len); +} + +void *odp_packet_push_head(odp_packet_t pkt, uint32_t len) +{ + struct rte_mbuf *mb = &(odp_packet_hdr(pkt)->buf_hdr.mb); + return (void *)rte_pktmbuf_prepend(mb, len); +} + +static void _copy_head_metadata(struct rte_mbuf *newhead, + struct rte_mbuf *oldhead) +{ + odp_packet_t pkt = (odp_packet_t)newhead; + uint32_t saved_index = odp_packet_hdr(pkt)->buf_hdr.index; + + rte_mbuf_refcnt_set(newhead, rte_mbuf_refcnt_read(oldhead)); + newhead->port = oldhead->port; + newhead->ol_flags = oldhead->ol_flags; + newhead->packet_type = oldhead->packet_type; + newhead->vlan_tci = oldhead->vlan_tci; + newhead->hash.rss = 0; + newhead->seqn = oldhead->seqn; + newhead->vlan_tci_outer = oldhead->vlan_tci_outer; + newhead->udata64 = oldhead->udata64; + memcpy(&newhead->tx_offload, &oldhead->tx_offload, + sizeof(odp_packet_hdr_t) - + offsetof(struct rte_mbuf, tx_offload)); + odp_packet_hdr(pkt)->buf_hdr.handle.handle = + (odp_buffer_t)newhead; + odp_packet_hdr(pkt)->buf_hdr.index = saved_index; +} + +int odp_packet_extend_head(odp_packet_t *pkt, uint32_t len, void **data_ptr, + uint32_t *seg_len) +{ + struct rte_mbuf *mb = &(odp_packet_hdr(*pkt)->buf_hdr.mb); + int addheadsize = len - rte_pktmbuf_headroom(mb); + + if (addheadsize > 0) { + struct rte_mbuf *newhead, *t; + uint32_t totsize_change; + int i; + + newhead = rte_pktmbuf_alloc(mb->pool); + if (newhead == NULL) + return -1; + + newhead->data_len = addheadsize % newhead->buf_len; + newhead->pkt_len = addheadsize; + newhead->data_off = newhead->buf_len - newhead->data_len; + newhead->nb_segs = addheadsize / newhead->buf_len + 1; + t = newhead; + + for (i = 0; i < newhead->nb_segs - 1; --i) { + t->next = rte_pktmbuf_alloc(mb->pool); + + if (t->next == NULL) { + rte_pktmbuf_free(newhead); + return -1; + } + /* The intermediate segments are fully used */ + t->data_len = t->buf_len; + t->data_off = 0; + } + totsize_change = newhead->nb_segs * newhead->buf_len; + if (rte_pktmbuf_chain(newhead, mb)) { + rte_pktmbuf_free(newhead); + return -1; + } + /* Expand the original head segment*/ + newhead->pkt_len += rte_pktmbuf_headroom(mb); + mb->data_off = 0; + mb->data_len = mb->buf_len; + _copy_head_metadata(newhead, mb); + mb = newhead; + *pkt = (odp_packet_t)newhead; + odp_packet_hdr(*pkt)->buf_hdr.totsize += totsize_change; + } else { + rte_pktmbuf_prepend(mb, len); + } + + if (data_ptr) + *data_ptr = odp_packet_data(*pkt); + if (seg_len) + *seg_len = mb->data_len; + + return 0; +} + +void *odp_packet_pull_head(odp_packet_t pkt, uint32_t len) +{ + struct rte_mbuf *mb = &(odp_packet_hdr(pkt)->buf_hdr.mb); + return (void *)rte_pktmbuf_adj(mb, len); +} + +int odp_packet_trunc_head(odp_packet_t *pkt, uint32_t len, void **data_ptr, + uint32_t *seg_len) +{ + struct rte_mbuf *mb = &(odp_packet_hdr(*pkt)->buf_hdr.mb); + + if (odp_packet_len(*pkt) < len) + return -1; + + if (len > mb->data_len) { + struct rte_mbuf *newhead = mb, *prev = NULL; + uint32_t left = len; + uint32_t totsize_change = 0; + + while (newhead->next != NULL) { + if (newhead->data_len > left) + break; + left -= newhead->data_len; + totsize_change += newhead->buf_len; + prev = newhead; + newhead = newhead->next; + --mb->nb_segs; + } + newhead->data_off += left; + newhead->nb_segs = mb->nb_segs; + newhead->pkt_len = mb->pkt_len - len; + newhead->data_len -= left; + _copy_head_metadata(newhead, mb); + prev->next = NULL; + rte_pktmbuf_free(mb); + *pkt = (odp_packet_t)newhead; + odp_packet_hdr(*pkt)->buf_hdr.totsize -= totsize_change; + } else { + rte_pktmbuf_adj(mb, len); + } + + if (data_ptr) + *data_ptr = odp_packet_data(*pkt); + if (seg_len) + *seg_len = mb->data_len; + + return 0; +} + +void *odp_packet_push_tail(odp_packet_t pkt, uint32_t len) +{ + struct rte_mbuf *mb = &(odp_packet_hdr(pkt)->buf_hdr.mb); + + return (void *)rte_pktmbuf_append(mb, len); +} + +int odp_packet_extend_tail(odp_packet_t *pkt, uint32_t len, void **data_ptr, + uint32_t *seg_len) +{ + struct rte_mbuf *mb = &(odp_packet_hdr(*pkt)->buf_hdr.mb); + int newtailsize = len - odp_packet_tailroom(*pkt); + uint32_t old_pkt_len = odp_packet_len(*pkt); + + if (data_ptr) + *data_ptr = odp_packet_tail(*pkt); + + if (newtailsize > 0) { + struct rte_mbuf *newtail = rte_pktmbuf_alloc(mb->pool); + struct rte_mbuf *t; + struct rte_mbuf *m_last = rte_pktmbuf_lastseg(mb); + int i; + + if (newtail == NULL) + return -1; + newtail->data_off = 0; + newtail->pkt_len = newtailsize; + if (newtailsize > newtail->buf_len) + newtail->data_len = newtail->buf_len; + else + newtail->data_len = newtailsize; + newtail->nb_segs = newtailsize / newtail->buf_len + 1; + t = newtail; + + for (i = 0; i < newtail->nb_segs - 1; ++i) { + t->next = rte_pktmbuf_alloc(mb->pool); + + if (t->next == NULL) { + rte_pktmbuf_free(newtail); + return -1; + } + t = t->next; + t->data_off = 0; + /* The last segment's size is not trivial*/ + t->data_len = i == newtail->nb_segs - 2 ? + newtailsize % newtail->buf_len : + t->buf_len; + } + if (rte_pktmbuf_chain(mb, newtail)) { + rte_pktmbuf_free(newtail); + return -1; + } + /* Expand the original tail */ + m_last->data_len = m_last->buf_len - m_last->data_off; + mb->pkt_len += len - newtailsize; + odp_packet_hdr(*pkt)->buf_hdr.totsize += + newtail->nb_segs * newtail->buf_len; + } else { + rte_pktmbuf_append(mb, len); + } + + if (seg_len) + odp_packet_offset(*pkt, old_pkt_len, seg_len, NULL); + + return 0; +} + +void *odp_packet_pull_tail(odp_packet_t pkt, uint32_t len) +{ + struct rte_mbuf *mb = &(odp_packet_hdr(pkt)->buf_hdr.mb); + + if (rte_pktmbuf_trim(mb, len)) + return NULL; + else + return odp_packet_tail(pkt); +} + +int odp_packet_trunc_tail(odp_packet_t *pkt, uint32_t len, void **tail_ptr, + uint32_t *tailroom) +{ + struct rte_mbuf *mb = &(odp_packet_hdr(*pkt)->buf_hdr.mb); + + if (odp_packet_len(*pkt) < len) + return -1; + + if (rte_pktmbuf_trim(mb, len)) { + struct rte_mbuf *reverse[mb->nb_segs]; + struct rte_mbuf *t = mb; + int i; + + for (i = 0; i < mb->nb_segs; ++i) { + reverse[i] = t; + t = t->next; + } + for (i = mb->nb_segs - 1; i >= 0 && len > 0; --i) { + t = reverse[i]; + if (len >= t->data_len) { + len -= t->data_len; + mb->pkt_len -= t->data_len; + t->data_len = 0; + if (i > 0) { + rte_pktmbuf_free_seg(t); + --mb->nb_segs; + reverse[i - 1]->next = NULL; + } + } else { + t->data_len -= len; + mb->pkt_len -= len; + len = 0; + } + } + } + + if (tail_ptr) + *tail_ptr = odp_packet_tail(*pkt); + if (tailroom) + *tailroom = odp_packet_tailroom(*pkt); + + return 0; +} + +void *odp_packet_offset(odp_packet_t pkt, uint32_t offset, uint32_t *len, + odp_packet_seg_t *seg) +{ + struct rte_mbuf *mb = &(odp_packet_hdr(pkt)->buf_hdr.mb); + + do { + if (mb->data_len > offset) { + break; + } else { + offset -= mb->data_len; + mb = mb->next; + } + } while (mb); + + if (mb) { + if (len) + *len = mb->data_len - offset; + if (seg) + *seg = (odp_packet_seg_t)(uintptr_t)mb; + return (void *)(rte_pktmbuf_mtod(mb, char *) + offset); + } else { + return NULL; + } +} + +/* + * + * Meta-data + * ******************************************************** + * + */ +uint32_t odp_packet_user_area_size(odp_packet_t pkt) +{ + pool_entry_cp_t *pool_cp = odp_pool_to_entry_cp(odp_packet_pool(pkt)); + + return pool_cp->params.pkt.uarea_size; +} + +int odp_packet_input_index(odp_packet_t pkt) +{ + return odp_pktio_index(odp_packet_hdr(pkt)->input); +} + +void odp_packet_user_ptr_set(odp_packet_t pkt, const void *ctx) +{ + odp_packet_hdr(pkt)->buf_hdr.buf_cctx = ctx; +} + +static inline void *packet_offset_to_ptr(odp_packet_t pkt, uint32_t *len, + const size_t offset) +{ + if (odp_unlikely(offset == ODP_PACKET_OFFSET_INVALID)) + return NULL; + + if (len) + return odp_packet_offset(pkt, offset, len, NULL); + else + return odp_packet_offset(pkt, offset, NULL, NULL); +} + +void *odp_packet_l2_ptr(odp_packet_t pkt, uint32_t *len) +{ + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + + if (!packet_hdr_has_l2(pkt_hdr)) + return NULL; + return packet_offset_to_ptr(pkt, len, pkt_hdr->p.l2_offset); +} + +uint32_t odp_packet_l2_offset(odp_packet_t pkt) +{ + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + + if (!packet_hdr_has_l2(pkt_hdr)) + return ODP_PACKET_OFFSET_INVALID; + return pkt_hdr->p.l2_offset; +} + +int odp_packet_l2_offset_set(odp_packet_t pkt, uint32_t offset) +{ + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + + if (odp_unlikely(offset >= (odp_packet_len(pkt) - 1))) + return -1; + + packet_hdr_has_l2_set(pkt_hdr, 1); + pkt_hdr->p.l2_offset = offset; + return 0; +} + +void *odp_packet_l3_ptr(odp_packet_t pkt, uint32_t *len) +{ + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + + return packet_offset_to_ptr(pkt, len, pkt_hdr->p.l3_offset); +} + +uint32_t odp_packet_l3_offset(odp_packet_t pkt) +{ + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + + return pkt_hdr->p.l3_offset; +} + +int odp_packet_l3_offset_set(odp_packet_t pkt, uint32_t offset) +{ + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + + if (odp_unlikely(offset >= (odp_packet_len(pkt) - 1))) + return -1; + + pkt_hdr->p.l3_offset = offset; + return 0; +} + +void *odp_packet_l4_ptr(odp_packet_t pkt, uint32_t *len) +{ + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + + return packet_offset_to_ptr(pkt, len, pkt_hdr->p.l4_offset); +} + +uint32_t odp_packet_l4_offset(odp_packet_t pkt) +{ + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + + return pkt_hdr->p.l4_offset; +} + +int odp_packet_l4_offset_set(odp_packet_t pkt, uint32_t offset) +{ + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + + if (odp_unlikely(offset >= (odp_packet_len(pkt) - 1))) + return -1; + + pkt_hdr->p.l4_offset = offset; + return 0; +} + +void odp_packet_ts_set(odp_packet_t pkt, odp_time_t timestamp) +{ + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + + pkt_hdr->timestamp = timestamp; + pkt_hdr->p.input_flags.timestamp = 1; +} + +/* + * + * Segment level + * ******************************************************** + * + */ + +void *odp_packet_seg_data(odp_packet_t pkt ODP_UNUSED, odp_packet_seg_t seg) +{ + return odp_packet_data((odp_packet_t)(uintptr_t)seg); +} + +uint32_t odp_packet_seg_data_len(odp_packet_t pkt ODP_UNUSED, + odp_packet_seg_t seg) +{ + return odp_packet_seg_len((odp_packet_t)(uintptr_t)seg); +} + +/* + * + * Manipulation + * ******************************************************** + * + */ + +int odp_packet_add_data(odp_packet_t *pkt_ptr, uint32_t offset, uint32_t len) +{ + odp_packet_t pkt = *pkt_ptr; + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + uint32_t pktlen = odp_packet_len(pkt); + odp_packet_t newpkt; + + if (offset > pktlen) + return -1; + + newpkt = odp_packet_alloc(pkt_hdr->buf_hdr.pool_hdl, pktlen + len); + + if (newpkt == ODP_PACKET_INVALID) + return -1; + + if (odp_packet_copy_from_pkt(newpkt, 0, pkt, 0, offset) != 0 || + odp_packet_copy_from_pkt(newpkt, offset + len, pkt, offset, + pktlen - offset) != 0) { + odp_packet_free(newpkt); + return -1; + } + + _odp_packet_copy_md_to_packet(pkt, newpkt); + odp_packet_free(pkt); + *pkt_ptr = newpkt; + + return 1; +} + +int odp_packet_rem_data(odp_packet_t *pkt_ptr, uint32_t offset, uint32_t len) +{ + odp_packet_t pkt = *pkt_ptr; + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + uint32_t pktlen = odp_packet_len(pkt); + odp_packet_t newpkt; + + if (offset > pktlen || offset + len > pktlen) + return -1; + + newpkt = odp_packet_alloc(pkt_hdr->buf_hdr.pool_hdl, pktlen - len); + + if (newpkt == ODP_PACKET_INVALID) + return -1; + + if (odp_packet_copy_from_pkt(newpkt, 0, pkt, 0, offset) != 0 || + odp_packet_copy_from_pkt(newpkt, offset, pkt, offset + len, + pktlen - offset - len) != 0) { + odp_packet_free(newpkt); + return -1; + } + + _odp_packet_copy_md_to_packet(pkt, newpkt); + odp_packet_free(pkt); + *pkt_ptr = newpkt; + + return 1; +} + +int odp_packet_align(odp_packet_t *pkt, uint32_t offset, uint32_t len, + uint32_t align) +{ + int rc; + uint32_t shift; + uint32_t seglen = 0; /* GCC */ + void *addr = odp_packet_offset(*pkt, offset, &seglen, NULL); + uint64_t uaddr = (uint64_t)(uintptr_t)addr; + uint64_t misalign; + + if (align > ODP_CACHE_LINE_SIZE) + return -1; + + if (seglen >= len) { + misalign = align <= 1 ? 0 : + ROUNDUP_ALIGN(uaddr, align) - uaddr; + if (misalign == 0) + return 0; + shift = align - misalign; + } else { + if (len > odp_packet_seg_len(*pkt)) + return -1; + shift = len - seglen; + uaddr -= shift; + misalign = align <= 1 ? 0 : + ROUNDUP_ALIGN(uaddr, align) - uaddr; + if (misalign) + shift += align - misalign; + } + + rc = odp_packet_extend_head(pkt, shift, NULL, NULL); + if (rc < 0) + return rc; + + (void)odp_packet_move_data(*pkt, 0, shift, + odp_packet_len(*pkt) - shift); + + (void)odp_packet_trunc_tail(pkt, shift, NULL, NULL); + return 1; +} + +int odp_packet_concat(odp_packet_t *dst, odp_packet_t src) +{ + odp_packet_hdr_t *dst_hdr = odp_packet_hdr(*dst); + odp_packet_hdr_t *src_hdr = odp_packet_hdr(src); + struct rte_mbuf *mb_dst = pkt_to_mbuf(dst_hdr); + struct rte_mbuf *mb_src = pkt_to_mbuf(src_hdr); + odp_packet_t new_dst; + odp_pool_t pool; + uint32_t dst_len; + uint32_t src_len; + + if (odp_likely(!rte_pktmbuf_chain(mb_dst, mb_src))) { + dst_hdr->buf_hdr.totsize += src_hdr->buf_hdr.totsize; + return 0; + } + + /* Fall back to using standard copy operations after maximum number of + * segments has been reached. */ + dst_len = odp_packet_len(*dst); + src_len = odp_packet_len(src); + pool = odp_packet_pool(*dst); + + new_dst = odp_packet_copy(*dst, pool); + if (odp_unlikely(new_dst == ODP_PACKET_INVALID)) + return -1; + + if (odp_packet_extend_tail(&new_dst, src_len, NULL, NULL) >= 0) { + (void)odp_packet_copy_from_pkt(new_dst, dst_len, + src, 0, src_len); + odp_packet_free(*dst); + odp_packet_free(src); + *dst = new_dst; + return 1; + } + + odp_packet_free(new_dst); + return -1; +} + +int odp_packet_split(odp_packet_t *pkt, uint32_t len, odp_packet_t *tail) +{ + uint32_t pktlen = odp_packet_len(*pkt); + + if (len >= pktlen || tail == NULL) + return -1; + + *tail = odp_packet_copy_part(*pkt, len, pktlen - len, + odp_packet_pool(*pkt)); + + if (*tail == ODP_PACKET_INVALID) + return -1; + + return odp_packet_trunc_tail(pkt, pktlen - len, NULL, NULL); +} + +/* + * + * Copy + * ******************************************************** + * + */ + +odp_packet_t odp_packet_copy(odp_packet_t pkt, odp_pool_t pool) +{ + uint32_t pktlen = odp_packet_len(pkt); + odp_packet_t newpkt = odp_packet_alloc(pool, pktlen); + + if (newpkt != ODP_PACKET_INVALID) { + if (_odp_packet_copy_md_to_packet(pkt, newpkt) || + odp_packet_copy_from_pkt(newpkt, 0, pkt, 0, pktlen)) { + odp_packet_free(newpkt); + newpkt = ODP_PACKET_INVALID; + } + } + + return newpkt; +} + +odp_packet_t odp_packet_copy_part(odp_packet_t pkt, uint32_t offset, + uint32_t len, odp_pool_t pool) +{ + uint32_t pktlen = odp_packet_len(pkt); + odp_packet_t newpkt; + + if (offset >= pktlen || offset + len > pktlen) + return ODP_PACKET_INVALID; + + newpkt = odp_packet_alloc(pool, len); + if (newpkt != ODP_PACKET_INVALID) + odp_packet_copy_from_pkt(newpkt, 0, pkt, offset, len); + + return newpkt; +} + +int odp_packet_copy_to_mem(odp_packet_t pkt, uint32_t offset, + uint32_t len, void *dst) +{ + void *mapaddr; + uint32_t seglen = 0; /* GCC */ + uint32_t cpylen; + uint8_t *dstaddr = (uint8_t *)dst; + + if (offset + len > odp_packet_len(pkt)) + return -1; + + while (len > 0) { + mapaddr = odp_packet_offset(pkt, offset, &seglen, NULL); + cpylen = len > seglen ? seglen : len; + memcpy(dstaddr, mapaddr, cpylen); + offset += cpylen; + dstaddr += cpylen; + len -= cpylen; + } + + return 0; +} + +int odp_packet_copy_from_mem(odp_packet_t pkt, uint32_t offset, + uint32_t len, const void *src) +{ + void *mapaddr; + uint32_t seglen = 0; /* GCC */ + uint32_t cpylen; + const uint8_t *srcaddr = (const uint8_t *)src; + + if (offset + len > odp_packet_len(pkt)) + return -1; + + while (len > 0) { + mapaddr = odp_packet_offset(pkt, offset, &seglen, NULL); + cpylen = len > seglen ? seglen : len; + memcpy(mapaddr, srcaddr, cpylen); + offset += cpylen; + srcaddr += cpylen; + len -= cpylen; + } + + return 0; +} + +int odp_packet_copy_from_pkt(odp_packet_t dst, uint32_t dst_offset, + odp_packet_t src, uint32_t src_offset, + uint32_t len) +{ + odp_packet_hdr_t *dst_hdr = odp_packet_hdr(dst); + odp_packet_hdr_t *src_hdr = odp_packet_hdr(src); + void *dst_map; + void *src_map; + uint32_t cpylen, minseg; + uint32_t dst_seglen = 0; /* GCC */ + uint32_t src_seglen = 0; /* GCC */ + int overlap; + + if (dst_offset + len > odp_packet_len(dst) || + src_offset + len > odp_packet_len(src)) + return -1; + + overlap = (dst_hdr == src_hdr && + ((dst_offset <= src_offset && + dst_offset + len >= src_offset) || + (src_offset <= dst_offset && + src_offset + len >= dst_offset))); + + if (overlap && src_offset < dst_offset) { + odp_packet_t temp = + odp_packet_copy_part(src, src_offset, len, + odp_packet_pool(src)); + if (temp == ODP_PACKET_INVALID) + return -1; + odp_packet_copy_from_pkt(dst, dst_offset, temp, 0, len); + odp_packet_free(temp); + return 0; + } + + while (len > 0) { + dst_map = odp_packet_offset(dst, dst_offset, &dst_seglen, NULL); + src_map = odp_packet_offset(src, src_offset, &src_seglen, NULL); + + minseg = dst_seglen > src_seglen ? src_seglen : dst_seglen; + cpylen = len > minseg ? minseg : len; + + if (overlap) + memmove(dst_map, src_map, cpylen); + else + memcpy(dst_map, src_map, cpylen); + + dst_offset += cpylen; + src_offset += cpylen; + len -= cpylen; + } + + return 0; +} + +int odp_packet_copy_data(odp_packet_t pkt, uint32_t dst_offset, + uint32_t src_offset, uint32_t len) +{ + return odp_packet_copy_from_pkt(pkt, dst_offset, + pkt, src_offset, len); +} + +int odp_packet_move_data(odp_packet_t pkt, uint32_t dst_offset, + uint32_t src_offset, uint32_t len) +{ + return odp_packet_copy_from_pkt(pkt, dst_offset, + pkt, src_offset, len); +} + ++int _odp_packet_set_data(odp_packet_t pkt, uint32_t offset, ++ uint8_t c, uint32_t len) ++{ ++ void *mapaddr; ++ uint32_t seglen = 0; /* GCC */ ++ uint32_t setlen; ++ odp_packet_hdr_t *hdr = odp_packet_hdr(pkt); ++ ++ if (offset + len > hdr->buf_hdr.mb.pkt_len) ++ return -1; ++ ++ while (len > 0) { ++ mapaddr = odp_packet_offset(pkt, offset, &seglen, NULL); ++ setlen = len > seglen ? seglen : len; ++ memset(mapaddr, c, setlen); ++ offset += setlen; ++ len -= setlen; ++ } ++ ++ return 0; ++} ++ ++int _odp_packet_cmp_data(odp_packet_t pkt, uint32_t offset, ++ const void *s, uint32_t len) ++{ ++ const uint8_t *ptr = s; ++ void *mapaddr; ++ uint32_t seglen = 0; /* GCC */ ++ uint32_t cmplen; ++ int ret; ++ odp_packet_hdr_t *hdr = odp_packet_hdr(pkt); ++ ++ ODP_ASSERT(offset + len <= hdr->buf_hdr.mb.pkt_len); ++ ++ while (len > 0) { ++ mapaddr = odp_packet_offset(pkt, offset, &seglen, NULL); ++ cmplen = len > seglen ? seglen : len; ++ ret = memcmp(mapaddr, ptr, cmplen); ++ if (ret != 0) ++ return ret; ++ offset += cmplen; ++ len -= cmplen; ++ ptr += cmplen; ++ } ++ ++ return 0; ++} ++ +/* + * + * Debugging + * ******************************************************** + * + */ + +void odp_packet_print(odp_packet_t pkt) +{ + odp_packet_seg_t seg; + int max_len = 512; + char str[max_len]; + uint8_t *p; + int len = 0; + int n = max_len - 1; + odp_packet_hdr_t *hdr = odp_packet_hdr(pkt); + odp_buffer_t buf = packet_to_buffer(pkt); + + len += snprintf(&str[len], n - len, "Packet "); + len += odp_buffer_snprint(&str[len], n - len, buf); + len += snprintf(&str[len], n - len, " input_flags 0x%" PRIx64 "\n", + hdr->p.input_flags.all); + len += snprintf(&str[len], n - len, " error_flags 0x%" PRIx32 "\n", + hdr->p.error_flags.all); + len += snprintf(&str[len], n - len, " output_flags 0x%" PRIx32 "\n", + hdr->p.output_flags.all); + len += snprintf(&str[len], n - len, + " l2_offset %" PRIu32 "\n", hdr->p.l2_offset); + len += snprintf(&str[len], n - len, + " l3_offset %" PRIu32 "\n", hdr->p.l3_offset); + len += snprintf(&str[len], n - len, + " l4_offset %" PRIu32 "\n", hdr->p.l4_offset); + len += snprintf(&str[len], n - len, + " frame_len %" PRIu32 "\n", + hdr->buf_hdr.mb.pkt_len); + len += snprintf(&str[len], n - len, + " input %" PRIu64 "\n", + odp_pktio_to_u64(hdr->input)); + len += snprintf(&str[len], n - len, + " headroom %" PRIu32 "\n", + odp_packet_headroom(pkt)); + len += snprintf(&str[len], n - len, + " tailroom %" PRIu32 "\n", + odp_packet_tailroom(pkt)); + len += snprintf(&str[len], n - len, + " num_segs %i\n", odp_packet_num_segs(pkt)); + + seg = odp_packet_first_seg(pkt); + + while (seg != ODP_PACKET_SEG_INVALID) { + len += snprintf(&str[len], n - len, + " seg_len %" PRIu32 "\n", + odp_packet_seg_data_len(pkt, seg)); + + seg = odp_packet_next_seg(pkt, seg); + } + + str[len] = '\0'; + + ODP_PRINT("\n%s\n", str); + rte_pktmbuf_dump(stdout, &hdr->buf_hdr.mb, 32); + + p = odp_packet_data(pkt); + ODP_ERR("00000000: %02X %02X %02X %02X %02X %02X %02X %02X\n", + p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]); + ODP_ERR("00000008: %02X %02X %02X %02X %02X %02X %02X %02X\n", + p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]); +} + ++void odp_packet_print_data(odp_packet_t pkt, uint32_t offset, ++ uint32_t byte_len) ++{ ++ odp_packet_hdr_t *hdr = odp_packet_hdr(pkt); ++ uint32_t bytes_per_row = 16; ++ int num_rows = (byte_len + bytes_per_row - 1) / bytes_per_row; ++ int max_len = 256 + (3 * byte_len) + (3 * num_rows); ++ char str[max_len]; ++ int len = 0; ++ int n = max_len - 1; ++ uint32_t data_len = odp_packet_len(pkt); ++ odp_pool_t pool = hdr->buf_hdr.pool_hdl; ++ ++ len += snprintf(&str[len], n - len, "Packet\n------\n"); ++ len += snprintf(&str[len], n - len, ++ " pool index %" PRIu32 "\n", pool_handle_to_index(pool)); ++ len += snprintf(&str[len], n - len, ++ " buf index %" PRIu32 "\n", hdr->buf_hdr.index); ++ len += snprintf(&str[len], n - len, ++ " data len %" PRIu32 "\n", data_len); ++ len += snprintf(&str[len], n - len, ++ " data ptr %p\n", odp_packet_data(pkt)); ++ len += snprintf(&str[len], n - len, ++ " print offset %" PRIu32 "\n", offset); ++ len += snprintf(&str[len], n - len, ++ " print length %" PRIu32 "\n", byte_len); ++ ++ if (offset + byte_len > data_len) { ++ len += snprintf(&str[len], n - len, " BAD OFFSET OR LEN\n"); ++ ODP_PRINT("%s\n", str); ++ return; ++ } ++ ++ while (byte_len) { ++ uint32_t copy_len; ++ uint8_t data[bytes_per_row]; ++ uint32_t i; ++ ++ if (byte_len > bytes_per_row) ++ copy_len = bytes_per_row; ++ else ++ copy_len = byte_len; ++ ++ odp_packet_copy_to_mem(pkt, offset, copy_len, data); ++ ++ len += snprintf(&str[len], n - len, " "); ++ ++ for (i = 0; i < copy_len; i++) ++ len += snprintf(&str[len], n - len, " %02x", data[i]); ++ ++ len += snprintf(&str[len], n - len, "\n"); ++ ++ byte_len -= copy_len; ++ offset += copy_len; ++ } ++ ++ ODP_PRINT("%s\n", str); ++} ++ +int odp_packet_is_valid(odp_packet_t pkt) +{ + odp_buffer_t buf = packet_to_buffer(pkt); + + return odp_buffer_is_valid(buf); +} + +/* + * + * Internal Use Routines + * ******************************************************** + * + */ + +int _odp_packet_copy_md_to_packet(odp_packet_t srcpkt, odp_packet_t dstpkt) +{ + odp_packet_hdr_t *srchdr = odp_packet_hdr(srcpkt); + odp_packet_hdr_t *dsthdr = odp_packet_hdr(dstpkt); + uint32_t src_size = odp_packet_user_area_size(srcpkt); + uint32_t dst_size = odp_packet_user_area_size(dstpkt); + + dsthdr->input = srchdr->input; + dsthdr->dst_queue = srchdr->dst_queue; + dsthdr->buf_hdr.buf_u64 = srchdr->buf_hdr.buf_u64; + + dsthdr->buf_hdr.mb.port = srchdr->buf_hdr.mb.port; + dsthdr->buf_hdr.mb.ol_flags = srchdr->buf_hdr.mb.ol_flags; + dsthdr->buf_hdr.mb.packet_type = srchdr->buf_hdr.mb.packet_type; + dsthdr->buf_hdr.mb.vlan_tci = srchdr->buf_hdr.mb.vlan_tci; + dsthdr->buf_hdr.mb.hash = srchdr->buf_hdr.mb.hash; + dsthdr->buf_hdr.mb.vlan_tci_outer = srchdr->buf_hdr.mb.vlan_tci_outer; + dsthdr->buf_hdr.mb.tx_offload = srchdr->buf_hdr.mb.tx_offload; + + if (dst_size != 0) + memcpy(odp_packet_user_area(dstpkt), + odp_packet_user_area(srcpkt), + dst_size <= src_size ? dst_size : src_size); + + copy_packet_parser_metadata(srchdr, dsthdr); + + /* Metadata copied, but return indication of whether the packet + * user area was truncated in the process. Note this can only + * happen when copying between different pools. + */ + return dst_size < src_size; +} + ++/** Parser helper function for Ethernet packets */ ++static inline uint16_t parse_eth(packet_parser_t *prs, const uint8_t **parseptr, ++ uint32_t *offset, uint32_t frame_len) ++{ ++ uint16_t ethtype; ++ const _odp_ethhdr_t *eth; ++ uint16_t macaddr0, macaddr2, macaddr4; ++ const _odp_vlanhdr_t *vlan; ++ ++ /* Detect jumbo frames */ ++ if (frame_len > _ODP_ETH_LEN_MAX) ++ prs->input_flags.jumbo = 1; ++ ++ eth = (const _odp_ethhdr_t *)*parseptr; ++ ++ /* Handle Ethernet broadcast/multicast addresses */ ++ macaddr0 = odp_be_to_cpu_16(*((const uint16_t *)(const void *)eth)); ++ prs->input_flags.eth_mcast = (macaddr0 & 0x0100) == 0x0100; ++ ++ if (macaddr0 == 0xffff) { ++ macaddr2 = ++ odp_be_to_cpu_16(*((const uint16_t *) ++ (const void *)eth + 1)); ++ macaddr4 = ++ odp_be_to_cpu_16(*((const uint16_t *) ++ (const void *)eth + 2)); ++ prs->input_flags.eth_bcast = ++ (macaddr2 == 0xffff) && (macaddr4 == 0xffff); ++ } else { ++ prs->input_flags.eth_bcast = 0; ++ } ++ ++ /* Get Ethertype */ ++ ethtype = odp_be_to_cpu_16(eth->type); ++ *offset += sizeof(*eth); ++ *parseptr += sizeof(*eth); ++ ++ /* Check for SNAP vs. DIX */ ++ if (ethtype < _ODP_ETH_LEN_MAX) { ++ prs->input_flags.snap = 1; ++ if (ethtype > frame_len - *offset) { ++ prs->error_flags.snap_len = 1; ++ return 0; ++ } ++ ethtype = odp_be_to_cpu_16(*((const uint16_t *)(uintptr_t) ++ (parseptr + 6))); ++ *offset += 8; ++ *parseptr += 8; ++ } ++ ++ /* Parse the VLAN header(s), if present */ ++ if (ethtype == _ODP_ETHTYPE_VLAN_OUTER) { ++ prs->input_flags.vlan_qinq = 1; ++ prs->input_flags.vlan = 1; ++ ++ vlan = (const _odp_vlanhdr_t *)*parseptr; ++ ethtype = odp_be_to_cpu_16(vlan->type); ++ *offset += sizeof(_odp_vlanhdr_t); ++ *parseptr += sizeof(_odp_vlanhdr_t); ++ } ++ ++ if (ethtype == _ODP_ETHTYPE_VLAN) { ++ prs->input_flags.vlan = 1; ++ vlan = (const _odp_vlanhdr_t *)*parseptr; ++ ethtype = odp_be_to_cpu_16(vlan->type); ++ *offset += sizeof(_odp_vlanhdr_t); ++ *parseptr += sizeof(_odp_vlanhdr_t); ++ } ++ ++ return ethtype; ++} ++ +/** + * Parser helper function for IPv4 + */ +static inline uint8_t parse_ipv4(packet_parser_t *prs, const uint8_t **parseptr, + uint32_t *offset, uint32_t frame_len) +{ + const _odp_ipv4hdr_t *ipv4 = (const _odp_ipv4hdr_t *)*parseptr; + uint8_t ver = _ODP_IPV4HDR_VER(ipv4->ver_ihl); + uint8_t ihl = _ODP_IPV4HDR_IHL(ipv4->ver_ihl); + uint16_t frag_offset; + uint32_t dstaddr = odp_be_to_cpu_32(ipv4->dst_addr); + uint32_t l3_len = odp_be_to_cpu_16(ipv4->tot_len); + + if (odp_unlikely(ihl < _ODP_IPV4HDR_IHL_MIN) || + odp_unlikely(ver != 4) || + (l3_len > frame_len - *offset)) { + prs->error_flags.ip_err = 1; + return 0; + } + + *offset += ihl * 4; + *parseptr += ihl * 4; + + if (odp_unlikely(ihl > _ODP_IPV4HDR_IHL_MIN)) + prs->input_flags.ipopt = 1; + + /* A packet is a fragment if: + * "more fragments" flag is set (all fragments except the last) + * OR + * "fragment offset" field is nonzero (all fragments except the first) + */ + frag_offset = odp_be_to_cpu_16(ipv4->frag_offset); + if (odp_unlikely(_ODP_IPV4HDR_IS_FRAGMENT(frag_offset))) + prs->input_flags.ipfrag = 1; + + /* Handle IPv4 broadcast / multicast */ + prs->input_flags.ip_bcast = (dstaddr == 0xffffffff); + prs->input_flags.ip_mcast = (dstaddr >> 28) == 0xd; + + return ipv4->proto; +} + +/** + * Parser helper function for IPv6 + */ +static inline uint8_t parse_ipv6(packet_parser_t *prs, const uint8_t **parseptr, + uint32_t *offset, uint32_t frame_len, + uint32_t seg_len) +{ + const _odp_ipv6hdr_t *ipv6 = (const _odp_ipv6hdr_t *)*parseptr; + const _odp_ipv6hdr_ext_t *ipv6ext; + uint32_t dstaddr0 = odp_be_to_cpu_32(ipv6->dst_addr.u8[0]); + uint32_t l3_len = odp_be_to_cpu_16(ipv6->payload_len) + + _ODP_IPV6HDR_LEN; + + /* Basic sanity checks on IPv6 header */ + if ((odp_be_to_cpu_32(ipv6->ver_tc_flow) >> 28) != 6 || + l3_len > frame_len - *offset) { + prs->error_flags.ip_err = 1; + return 0; + } + + /* IPv6 broadcast / multicast flags */ + prs->input_flags.ip_mcast = (dstaddr0 & 0xff000000) == 0xff000000; + prs->input_flags.ip_bcast = 0; + + /* Skip past IPv6 header */ + *offset += sizeof(_odp_ipv6hdr_t); + *parseptr += sizeof(_odp_ipv6hdr_t); + + /* Skip past any IPv6 extension headers */ + if (ipv6->next_hdr == _ODP_IPPROTO_HOPOPTS || + ipv6->next_hdr == _ODP_IPPROTO_ROUTE) { + prs->input_flags.ipopt = 1; + + do { + ipv6ext = (const _odp_ipv6hdr_ext_t *)*parseptr; + uint16_t extlen = 8 + ipv6ext->ext_len * 8; + + *offset += extlen; + *parseptr += extlen; + } while ((ipv6ext->next_hdr == _ODP_IPPROTO_HOPOPTS || + ipv6ext->next_hdr == _ODP_IPPROTO_ROUTE) && + *offset < seg_len); + + if (*offset >= prs->l3_offset + + odp_be_to_cpu_16(ipv6->payload_len)) { + prs->error_flags.ip_err = 1; + return 0; + } + + if (ipv6ext->next_hdr == _ODP_IPPROTO_FRAG) + prs->input_flags.ipfrag = 1; + + return ipv6ext->next_hdr; + } + + if (odp_unlikely(ipv6->next_hdr == _ODP_IPPROTO_FRAG)) { + prs->input_flags.ipopt = 1; + prs->input_flags.ipfrag = 1; + } + + return ipv6->next_hdr; +} + +/** + * Parser helper function for TCP + */ +static inline void parse_tcp(packet_parser_t *prs, + const uint8_t **parseptr, uint32_t *offset) +{ + const _odp_tcphdr_t *tcp = (const _odp_tcphdr_t *)*parseptr; + + if (tcp->hl < sizeof(_odp_tcphdr_t) / sizeof(uint32_t)) + prs->error_flags.tcp_err = 1; + else if ((uint32_t)tcp->hl * 4 > sizeof(_odp_tcphdr_t)) + prs->input_flags.tcpopt = 1; + + if (offset) + *offset += (uint32_t)tcp->hl * 4; + *parseptr += (uint32_t)tcp->hl * 4; +} + +/** + * Parser helper function for UDP + */ +static inline void parse_udp(packet_parser_t *prs, + const uint8_t **parseptr, uint32_t *offset) +{ + const _odp_udphdr_t *udp = (const _odp_udphdr_t *)*parseptr; + uint32_t udplen = odp_be_to_cpu_16(udp->length); + + if (odp_unlikely(udplen < sizeof(_odp_udphdr_t))) + prs->error_flags.udp_err = 1; + + if (offset) + *offset += sizeof(_odp_udphdr_t); + *parseptr += sizeof(_odp_udphdr_t); +} + - /** - * Parse common packet headers up to given layer - * - * The function expects at least PACKET_PARSE_SEG_LEN bytes of data to be - * available from the ptr. - */ - int packet_parse_common(packet_parser_t *prs, const uint8_t *ptr, - uint32_t frame_len, uint32_t seg_len, - odp_pktio_parser_layer_t layer) ++static inline ++int packet_parse_common_l3_l4(packet_parser_t *prs, const uint8_t *parseptr, ++ uint32_t offset, ++ uint32_t frame_len, uint32_t seg_len, ++ odp_pktio_parser_layer_t layer, ++ uint16_t ethtype) +{ - uint32_t offset; - uint16_t ethtype; - const uint8_t *parseptr; + uint8_t ip_proto; - const _odp_ethhdr_t *eth; - uint16_t macaddr0, macaddr2, macaddr4; - const _odp_vlanhdr_t *vlan; - - if (layer == ODP_PKTIO_PARSER_LAYER_NONE) - return 0; - - /* We only support Ethernet for now */ - prs->input_flags.eth = 1; - /* Assume valid L2 header, no CRC/FCS check in SW */ - prs->input_flags.l2 = 1; - /* Detect jumbo frames */ - if (frame_len > _ODP_ETH_LEN_MAX) - prs->input_flags.jumbo = 1; - - offset = sizeof(_odp_ethhdr_t); - eth = (const _odp_ethhdr_t *)ptr; - - /* Handle Ethernet broadcast/multicast addresses */ - macaddr0 = odp_be_to_cpu_16(*((const uint16_t *)(const void *)eth)); - prs->input_flags.eth_mcast = (macaddr0 & 0x0100) == 0x0100; - - if (macaddr0 == 0xffff) { - macaddr2 = - odp_be_to_cpu_16(*((const uint16_t *) - (const void *)eth + 1)); - macaddr4 = - odp_be_to_cpu_16(*((const uint16_t *) - (const void *)eth + 2)); - prs->input_flags.eth_bcast = - (macaddr2 == 0xffff) && (macaddr4 == 0xffff); - } else { - prs->input_flags.eth_bcast = 0; - } - - /* Get Ethertype */ - ethtype = odp_be_to_cpu_16(eth->type); - parseptr = (const uint8_t *)(eth + 1); - - /* Check for SNAP vs. DIX */ - if (ethtype < _ODP_ETH_LEN_MAX) { - prs->input_flags.snap = 1; - if (ethtype > frame_len - offset) { - prs->error_flags.snap_len = 1; - goto parse_exit; - } - ethtype = odp_be_to_cpu_16(*((const uint16_t *)(uintptr_t) - (parseptr + 6))); - offset += 8; - parseptr += 8; - } - - /* Parse the VLAN header(s), if present */ - if (ethtype == _ODP_ETHTYPE_VLAN_OUTER) { - prs->input_flags.vlan_qinq = 1; - prs->input_flags.vlan = 1; + - vlan = (const _odp_vlanhdr_t *)parseptr; - ethtype = odp_be_to_cpu_16(vlan->type); - offset += sizeof(_odp_vlanhdr_t); - parseptr += sizeof(_odp_vlanhdr_t); - } - - if (ethtype == _ODP_ETHTYPE_VLAN) { - prs->input_flags.vlan = 1; - vlan = (const _odp_vlanhdr_t *)parseptr; - ethtype = odp_be_to_cpu_16(vlan->type); - offset += sizeof(_odp_vlanhdr_t); - parseptr += sizeof(_odp_vlanhdr_t); - } - - if (layer == ODP_PKTIO_PARSER_LAYER_L2) ++ if (layer <= ODP_PKTIO_PARSER_LAYER_L2) + return prs->error_flags.all != 0; + + /* Set l3_offset+flag only for known ethtypes */ + prs->l3_offset = offset; + prs->input_flags.l3 = 1; + + /* Parse Layer 3 headers */ + switch (ethtype) { + case _ODP_ETHTYPE_IPV4: + prs->input_flags.ipv4 = 1; + ip_proto = parse_ipv4(prs, &parseptr, &offset, frame_len); + break; + + case _ODP_ETHTYPE_IPV6: + prs->input_flags.ipv6 = 1; + ip_proto = parse_ipv6(prs, &parseptr, &offset, frame_len, + seg_len); + break; + + case _ODP_ETHTYPE_ARP: + prs->input_flags.arp = 1; + ip_proto = 255; /* Reserved invalid by IANA */ + break; + + default: + prs->input_flags.l3 = 0; + prs->l3_offset = ODP_PACKET_OFFSET_INVALID; + ip_proto = 255; /* Reserved invalid by IANA */ + } + + if (layer == ODP_PKTIO_PARSER_LAYER_L3) + return prs->error_flags.all != 0; + + /* Set l4_offset+flag only for known ip_proto */ + prs->l4_offset = offset; + prs->input_flags.l4 = 1; + + /* Parse Layer 4 headers */ + switch (ip_proto) { + case _ODP_IPPROTO_ICMPv4: + /* Fall through */ + + case _ODP_IPPROTO_ICMPv6: + prs->input_flags.icmp = 1; + break; + ++ case _ODP_IPPROTO_IPIP: ++ /* Do nothing */ ++ break; ++ + case _ODP_IPPROTO_TCP: + if (odp_unlikely(offset + _ODP_TCPHDR_LEN > seg_len)) + return -1; + prs->input_flags.tcp = 1; + parse_tcp(prs, &parseptr, NULL); + break; + + case _ODP_IPPROTO_UDP: + if (odp_unlikely(offset + _ODP_UDPHDR_LEN > seg_len)) + return -1; + prs->input_flags.udp = 1; + parse_udp(prs, &parseptr, NULL); + break; + + case _ODP_IPPROTO_AH: + prs->input_flags.ipsec = 1; + prs->input_flags.ipsec_ah = 1; + break; + + case _ODP_IPPROTO_ESP: + prs->input_flags.ipsec = 1; + prs->input_flags.ipsec_esp = 1; + break; + + case _ODP_IPPROTO_SCTP: + prs->input_flags.sctp = 1; + break; + + default: + prs->input_flags.l4 = 0; + prs->l4_offset = ODP_PACKET_OFFSET_INVALID; + break; + } - parse_exit: ++ + return prs->error_flags.all != 0; +} ++ ++/** ++ * Parse common packet headers up to given layer ++ * ++ * The function expects at least PACKET_PARSE_SEG_LEN bytes of data to be ++ * available from the ptr. ++ */ ++int packet_parse_common(packet_parser_t *prs, const uint8_t *ptr, ++ uint32_t frame_len, uint32_t seg_len, ++ odp_pktio_parser_layer_t layer) ++{ ++ uint32_t offset; ++ uint16_t ethtype; ++ const uint8_t *parseptr; ++ ++ parseptr = ptr; ++ offset = 0; ++ ++ if (layer == ODP_PKTIO_PARSER_LAYER_NONE) ++ return 0; ++ ++ /* Assume valid L2 header, no CRC/FCS check in SW */ ++ prs->l2_offset = offset; ++ prs->input_flags.l2 = 1; ++ /* We only support Ethernet for now */ ++ prs->input_flags.eth = 1; ++ ++ ethtype = parse_eth(prs, &parseptr, &offset, frame_len); ++ ++ return packet_parse_common_l3_l4(prs, parseptr, offset, frame_len, ++ seg_len, layer, ethtype); ++} ++ +/** + * Simple packet parser + */ +int packet_parse_layer(odp_packet_hdr_t *pkt_hdr, + odp_pktio_parser_layer_t layer) +{ + uint32_t seg_len = odp_packet_seg_len((odp_packet_t)pkt_hdr); + uint32_t len = packet_len(pkt_hdr); + void *base = odp_packet_data((odp_packet_t)pkt_hdr); + + return packet_parse_common(&pkt_hdr->p, base, len, seg_len, layer); +} + ++int packet_parse_l3_l4(odp_packet_hdr_t *pkt_hdr, ++ odp_pktio_parser_layer_t layer, ++ uint32_t l3_offset, ++ uint16_t ethtype) ++{ ++ uint32_t seg_len = 0; ++ void *base = odp_packet_offset((odp_packet_t)pkt_hdr, ++ l3_offset, &seg_len, NULL); ++ ++ if (seg_len == 0) ++ return -1; ++ ++ return packet_parse_common_l3_l4(&pkt_hdr->p, base, l3_offset, ++ pkt_hdr->buf_hdr.mb.pkt_len, seg_len, ++ layer, ethtype); ++} ++ +uint64_t odp_packet_to_u64(odp_packet_t hdl) +{ + return _odp_pri(hdl); +} + +uint64_t odp_packet_seg_to_u64(odp_packet_seg_t hdl) +{ + return _odp_pri(hdl); +} + +odp_packet_t odp_packet_ref_static(odp_packet_t pkt) +{ + return odp_packet_copy(pkt, odp_packet_pool(pkt)); +} + +odp_packet_t odp_packet_ref(odp_packet_t pkt, uint32_t offset) +{ + odp_packet_t new; + int ret; + + new = odp_packet_copy(pkt, odp_packet_pool(pkt)); + + if (new == ODP_PACKET_INVALID) { + ODP_ERR("copy failed\n"); + return ODP_PACKET_INVALID; + } + + ret = odp_packet_trunc_head(&new, offset, NULL, NULL); + + if (ret < 0) { + ODP_ERR("trunk_head failed\n"); + odp_packet_free(new); + return ODP_PACKET_INVALID; + } + + return new; +} + +odp_packet_t odp_packet_ref_pkt(odp_packet_t pkt, uint32_t offset, + odp_packet_t hdr) +{ + odp_packet_t new; + int ret; + + new = odp_packet_copy(pkt, odp_packet_pool(pkt)); + + if (new == ODP_PACKET_INVALID) { + ODP_ERR("copy failed\n"); + return ODP_PACKET_INVALID; + } + + if (offset) { + ret = odp_packet_trunc_head(&new, offset, NULL, NULL); + + if (ret < 0) { + ODP_ERR("trunk_head failed\n"); + odp_packet_free(new); + return ODP_PACKET_INVALID; + } + } + + ret = odp_packet_concat(&hdr, new); + + if (ret < 0) { + ODP_ERR("concat failed\n"); + odp_packet_free(new); + return ODP_PACKET_INVALID; + } + + return hdr; +} + +int odp_packet_has_ref(odp_packet_t pkt) +{ + (void)pkt; + + return 0; +} + +/* Include non-inlined versions of API functions */ +#if ODP_ABI_COMPAT == 1 +#include <odp/api/plat/packet_inlines_api.h> +#endif diff --cc platform/linux-dpdk/test/.gitignore index 5dabf91c,00000000..5dabf91c mode 100644,000000..100644 --- a/platform/linux-dpdk/test/.gitignore +++ b/platform/linux-dpdk/test/.gitignore diff --cc platform/linux-dpdk/test/Makefile.am index 00000000,00000000..a872400e new file mode 100644 --- /dev/null +++ b/platform/linux-dpdk/test/Makefile.am @@@ -1,0 -1,0 +1,35 @@@ ++include $(top_srcdir)/test/Makefile.inc ++TESTS_ENVIRONMENT += TEST_DIR=${top_builddir}/test/validation ++ ++SUBDIRS = ++ ++if test_vald ++TESTS = validation/api/pktio/pktio_run.sh ++ ++SUBDIRS += validation/api/pktio ++else ++#performance tests refer to pktio_env ++if test_perf ++SUBDIRS += validation/api/pktio ++endif ++endif ++ ++TEST_EXTENSIONS = .sh ++ ++TESTNAME = linux-dpdk ++ ++TESTENV = tests-$(TESTNAME).env ++ ++test_DATA = $(TESTENV) ++ ++DISTCLEANFILES = $(TESTENV) ++.PHONY: $(TESTENV) ++$(TESTENV): ++ echo "TESTS="$(TESTS)"" > $@ ++ echo "$(TESTS_ENVIRONMENT)" >> $@ ++ echo "$(LOG_COMPILER)" >> $@ ++ ++if test_installdir ++installcheck-local: ++ $(DESTDIR)/$(testdir)/run-test.sh $(TESTNAME) ++endif diff --cc platform/linux-dpdk/test/Makefile.inc index 25493d86,00000000..7b81c9a6 mode 100644,000000..100644 --- a/platform/linux-dpdk/test/Makefile.inc +++ b/platform/linux-dpdk/test/Makefile.inc @@@ -1,21 -1,0 +1,22 @@@ +# 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 ++AM_LDFLAGS = -static + - AM_CPPFLAGS += $(CUNIT_CPPFLAGS) ++AM_CFLAGS = $(CUNIT_CFLAGS) + - LIBCUNIT_COMMON = $(top_builddir)/test/common_plat/common/libcunit_common.la ++LIBCUNIT_COMMON = $(top_builddir)/test/common/libcunit_common.la +LIB = $(top_builddir)/lib +LIBODP = $(LIB)/libodphelper.la $(LIB)/libodp-dpdk.la + - INCCUNIT_COMMON = -I$(top_srcdir)/test/common_plat/common - INCODP = -I$(top_builddir)/platform/@with_platform@/include \ ++INCCUNIT_COMMON = -I$(top_srcdir)/test/common ++INCODP = \ + -I$(top_builddir)/include \ ++ -I$(top_builddir)/platform/@with_platform@/include \ + -I$(top_srcdir)/helper/include \ + -I$(top_srcdir)/include \ - -I$(top_srcdir)/include/odp/arch/@ARCH_ABI@ \ ++ -I$(top_srcdir)/include/odp/arch/@ARCH_ABI@ \ + -I$(top_srcdir)/platform/@with_platform@/arch/$(ARCH_DIR) \ + -I$(top_srcdir)/platform/@with_platform@/include \ + -I$(top_srcdir)/test diff --cc platform/linux-dpdk/test/validation/api/pktio/.gitignore index 00000000,00000000..42a9f364 new file mode 120000 --- /dev/null +++ b/platform/linux-dpdk/test/validation/api/pktio/.gitignore @@@ -1,0 -1,0 +1,1 @@@ ++../../../../../linux-generic/test/validation/api/pktio/.gitignore diff --cc platform/linux-dpdk/test/validation/api/pktio/Makefile.am index e401a29a,00000000..e401a29a mode 100644,000000..100644 --- a/platform/linux-dpdk/test/validation/api/pktio/Makefile.am +++ b/platform/linux-dpdk/test/validation/api/pktio/Makefile.am diff --cc platform/linux-dpdk/test/validation/api/pktio/pktio_env index 00000000,00000000..161505ff new file mode 120000 --- /dev/null +++ b/platform/linux-dpdk/test/validation/api/pktio/pktio_env @@@ -1,0 -1,0 +1,1 @@@ ++../../../../../linux-generic/test/validation/api/pktio/pktio_env diff --cc platform/linux-dpdk/test/validation/api/pktio/pktio_run.sh index 538c87d0,00000000..538c87d0 mode 100755,000000..100755 --- a/platform/linux-dpdk/test/validation/api/pktio/pktio_run.sh +++ b/platform/linux-dpdk/test/validation/api/pktio/pktio_run.sh diff --cc platform/linux-dpdk/test/wrapper-script.sh index 1fbb16f7,00000000..1fbb16f7 mode 100755,000000..100755 --- a/platform/linux-dpdk/test/wrapper-script.sh +++ b/platform/linux-dpdk/test/wrapper-script.sh diff --cc platform/linux-generic/Makefile.am index db466dd2,c5406760..3c505495 --- a/platform/linux-generic/Makefile.am +++ b/platform/linux-generic/Makefile.am @@@ -3,11 -3,8 +3,14 @@@
include $(top_srcdir)/platform/Makefile.inc
++pkgconfigdir = $(libdir)/pkgconfig ++pkgconfig_DATA = libodp-linux.pc ++ +lib_LTLIBRARIES = $(LIB)/libodp-linux.la + AM_CPPFLAGS = -I$(srcdir)/include AM_CPPFLAGS += -I$(top_srcdir)/include +AM_CPPFLAGS += -I$(top_srcdir)/frameworks/modular AM_CPPFLAGS += -I$(top_srcdir)/include/odp/arch/@ARCH_ABI@ AM_CPPFLAGS += -I$(top_builddir)/include AM_CPPFLAGS += -Iinclude @@@ -125,93 -118,82 +125,94 @@@ nodist_odpapiplatinclude_HEADERS =
odpdrvincludedir = $(includedir)/odp/drv odpdrvinclude_HEADERS = \ - $(srcdir)/include/odp/drv/align.h \ - $(srcdir)/include/odp/drv/atomic.h \ - $(srcdir)/include/odp/drv/barrier.h \ - $(srcdir)/include/odp/drv/byteorder.h \ - $(srcdir)/include/odp/drv/compiler.h \ - $(srcdir)/include/odp/drv/driver.h \ - $(srcdir)/include/odp/drv/hints.h \ - $(srcdir)/include/odp/drv/shm.h \ - $(srcdir)/include/odp/drv/spinlock.h \ - $(srcdir)/include/odp/drv/std_types.h \ - $(srcdir)/include/odp/drv/sync.h + include/odp/drv/align.h \ + include/odp/drv/atomic.h \ + include/odp/drv/barrier.h \ + include/odp/drv/byteorder.h \ + include/odp/drv/compiler.h \ + include/odp/drv/driver.h \ ++ include/odp/drv/hints.h \ + include/odp/drv/shm.h \ + include/odp/drv/spinlock.h \ + include/odp/drv/std_types.h \ + include/odp/drv/sync.h
odpdrvplatincludedir = $(includedir)/odp/drv/plat odpdrvplatinclude_HEADERS = \ - $(srcdir)/include/odp/drv/plat/atomic_types.h \ - $(srcdir)/include/odp/drv/plat/barrier_types.h \ - $(srcdir)/include/odp/drv/plat/byteorder_types.h \ - $(srcdir)/include/odp/drv/compiler.h \ - $(srcdir)/include/odp/drv/plat/driver_types.h \ - $(srcdir)/include/odp/drv/plat/shm_types.h \ - $(srcdir)/include/odp/drv/plat/spinlock_types.h \ - $(srcdir)/include/odp/drv/plat/strong_types.h + include/odp/drv/plat/atomic_types.h \ + include/odp/drv/plat/barrier_types.h \ + include/odp/drv/plat/byteorder_types.h \ + include/odp/drv/compiler.h \ + include/odp/drv/plat/driver_types.h \ + include/odp/drv/plat/shm_types.h \ + include/odp/drv/plat/spinlock_types.h \ + include/odp/drv/plat/strong_types.h
noinst_HEADERS = \ - ${srcdir}/include/_fdserver_internal.h \ - ${srcdir}/include/_ishm_internal.h \ - ${srcdir}/include/_ishmphy_internal.h \ - ${srcdir}/include/_ishmpool_internal.h \ - ${srcdir}/include/drv_driver_internal.h\ - ${srcdir}/include/odp_align_internal.h \ - ${srcdir}/include/odp_atomic_internal.h \ - ${srcdir}/include/odp_buffer_inlines.h \ - ${srcdir}/include/odp_bitmap_internal.h \ - ${srcdir}/include/odp_bitset.h \ - ${srcdir}/include/odp_buffer_internal.h \ - ${srcdir}/include/odp_buffer_subsystem.h \ - ${srcdir}/include/odp_classification_datamodel.h \ - ${srcdir}/include/odp_classification_inlines.h \ - ${srcdir}/include/odp_classification_internal.h \ - ${srcdir}/include/odp_config_internal.h \ - ${srcdir}/include/odp_crypto_internal.h \ - ${srcdir}/include/odp_debug_internal.h \ - ${srcdir}/include/odp_errno_define.h \ - ${srcdir}/include/odp_forward_typedefs_internal.h \ - ${srcdir}/include/odp_internal.h \ - ${srcdir}/include/odp_llqueue.h \ - ${srcdir}/include/odp_name_table_internal.h \ - ${srcdir}/include/odp_packet_internal.h \ - ${srcdir}/include/odp_packet_io_internal.h \ - ${srcdir}/include/odp_packet_io_ring_internal.h \ - ${srcdir}/pktio/ethtool.h \ - ${srcdir}/pktio/common.h \ - ${srcdir}/pktio/sysfs.h \ - ${srcdir}/pktio/dpdk.h \ - ${srcdir}/include/odp_pktio_ops_ipc.h \ - ${srcdir}/include/odp_pktio_ops_loopback.h \ - ${srcdir}/include/odp_pktio_ops_netmap.h \ - ${srcdir}/include/odp_pktio_ops_pcap.h \ - ${srcdir}/include/odp_pktio_ops_socket.h \ - ${srcdir}/include/odp_pktio_ops_tap.h \ - ${srcdir}/include/odp_pktio_ops_subsystem.h \ - ${srcdir}/include/odp_pkt_queue_internal.h \ - ${srcdir}/include/odp_queue_subsystem.h \ - ${srcdir}/include/odp_pool_internal.h \ - ${srcdir}/include/odp_pool_subsystem.h \ - ${srcdir}/include/odp_posix_extensions.h \ - ${srcdir}/include/odp_queue_internal.h \ - ${srcdir}/include/odp_queue_scalable_internal.h \ - ${srcdir}/include/odp_ring_internal.h \ - ${srcdir}/include/odp_queue_if.h \ - ${srcdir}/include/odp_schedule_if.h \ - ${srcdir}/include/odp_schedule_scalable.h \ - ${srcdir}/include/odp_schedule_scalable_config.h \ - ${srcdir}/include/odp_schedule_scalable_ordered.h \ - ${srcdir}/include/odp_schedule_subsystem.h \ - ${srcdir}/include/odp_sorted_list_internal.h \ - ${srcdir}/include/odp_shm_internal.h \ - ${srcdir}/include/odp_time_internal.h \ - ${srcdir}/include/odp_timer_internal.h \ - ${srcdir}/include/odp_timer_wheel_internal.h \ - ${srcdir}/include/odp_traffic_mngr_internal.h \ - ${srcdir}/include/protocols/eth.h \ - ${srcdir}/include/protocols/ip.h \ - ${srcdir}/include/protocols/ipsec.h \ - ${srcdir}/include/protocols/tcp.h \ - ${srcdir}/include/protocols/thash.h \ - ${srcdir}/include/protocols/udp.h + include/_fdserver_internal.h \ + include/_ishm_internal.h \ + include/_ishmphy_internal.h \ + include/_ishmpool_internal.h \ ++ include/drv_driver_internal.h \ + include/odp_align_internal.h \ + include/odp_atomic_internal.h \ + include/odp_buffer_inlines.h \ + include/odp_bitmap_internal.h \ + include/odp_bitset.h \ + include/odp_buffer_internal.h \ ++ include/odp_buffer_subsystem.h \ + include/odp_classification_datamodel.h \ + include/odp_classification_inlines.h \ + include/odp_classification_internal.h \ + include/odp_config_internal.h \ + include/odp_crypto_internal.h \ + include/odp_debug_internal.h \ + include/odp_errno_define.h \ + include/odp_forward_typedefs_internal.h \ + include/odp_internal.h \ + include/odp_ipsec_internal.h \ + include/odp_llqueue.h \ + include/odp_name_table_internal.h \ + include/odp_packet_internal.h \ + include/odp_packet_io_internal.h \ - include/odp_packet_io_ipc_internal.h \ + include/odp_packet_io_ring_internal.h \ - include/odp_packet_netmap.h \ - include/odp_packet_dpdk.h \ - include/odp_packet_socket.h \ - include/odp_packet_tap.h \ ++ pktio/ethtool.h \ ++ pktio/common.h \ ++ pktio/sysfs.h \ ++ pktio/dpdk.h \ ++ include/odp_pktio_ops_ipc.h \ ++ include/odp_pktio_ops_loopback.h \ ++ include/odp_pktio_ops_netmap.h \ ++ include/odp_pktio_ops_pcap.h \ ++ include/odp_pktio_ops_socket.h \ ++ include/odp_pktio_ops_tap.h \ ++ include/odp_pktio_ops_subsystem.h \ + include/odp_pkt_queue_internal.h \ ++ include/odp_queue_subsystem.h \ + include/odp_pool_internal.h \ ++ include/odp_pool_subsystem.h \ + include/odp_posix_extensions.h \ + include/odp_queue_internal.h \ + include/odp_queue_scalable_internal.h \ + include/odp_ring_internal.h \ + include/odp_queue_if.h \ + include/odp_schedule_if.h \ + include/odp_schedule_scalable.h \ + include/odp_schedule_scalable_config.h \ + include/odp_schedule_scalable_ordered.h \ ++ include/odp_schedule_subsystem.h \ + include/odp_sorted_list_internal.h \ + include/odp_shm_internal.h \ + include/odp_time_internal.h \ + include/odp_timer_internal.h \ + include/odp_timer_wheel_internal.h \ + include/odp_traffic_mngr_internal.h \ + include/protocols/eth.h \ + include/protocols/ip.h \ + include/protocols/ipsec.h \ + include/protocols/tcp.h \ + include/protocols/thash.h \ + include/protocols/udp.h
__LIB__libodp_linux_la_SOURCES = \ _fdserver.c \ diff --cc platform/linux-generic/include/odp_internal.h index f81644b1,d01b4f15..6811d8d0 --- a/platform/linux-generic/include/odp_internal.h +++ b/platform/linux-generic/include/odp_internal.h @@@ -74,7 -74,8 +74,9 @@@ enum init_stage CLASSIFICATION_INIT, TRAFFIC_MNGR_INIT, NAME_TABLE_INIT, + DRIVER_INIT, + IPSEC_EVENTS_INIT, + IPSEC_SAD_INIT, MODULES_INIT, ALL_INIT /* All init stages completed */ }; @@@ -141,10 -135,12 +143,16 @@@ int _odp_ishm_init_local(void) int _odp_ishm_term_global(void); int _odp_ishm_term_local(void);
+int _odpdrv_driver_init_global(void); +int _odpdrv_driver_init_local(void); +int _odpdrv_driver_term_global(void); + + int _odp_ipsec_sad_init_global(void); + int _odp_ipsec_sad_term_global(void); + + int _odp_ipsec_events_init_global(void); + int _odp_ipsec_events_term_global(void); + int _odp_modules_init_global(void);
int cpuinfo_parser(FILE *file, system_info_t *sysinfo); diff --cc platform/linux-generic/m4/configure.m4 index c1d3509d,f4504bf9..fc29f9cb --- a/platform/linux-generic/m4/configure.m4 +++ b/platform/linux-generic/m4/configure.m4 @@@ -86,20 -15,19 +15,35 @@@ m4_include([platform/linux-generic/m4/o m4_include([platform/linux-generic/m4/odp_dpdk.m4]) m4_include([platform/linux-generic/m4/odp_schedule.m4])
+ m4_include([platform/linux-generic/m4/performance.m4]) + + AC_CONFIG_COMMANDS_PRE([dnl + AM_CONDITIONAL([PLATFORM_IS_LINUX_GENERIC], + [test "${with_platform}" = "linux-generic"]) ++]) ++ AC_CONFIG_FILES([platform/linux-generic/Makefile - platform/linux-generic/include/odp/api/plat/static_inline.h]) + platform/linux-generic/libodp-linux.pc + platform/linux-generic/include/odp/api/plat/static_inline.h + platform/linux-generic/test/Makefile + platform/linux-generic/test/validation/api/shmem/Makefile + platform/linux-generic/test/validation/api/pktio/Makefile + platform/linux-generic/test/mmap_vlan_ins/Makefile + platform/linux-generic/test/pktio_ipc/Makefile + platform/linux-generic/test/ring/Makefile + platform/linux-generic/test/performance/Makefile]) -]) + +########################################################################## +# Enable default pktios build +########################################################################## +AC_DEFINE([ODP_PKTIO_IPC], [1], + [Define to 1 to enable IPC packet I/O support]) + +AC_DEFINE([ODP_PKTIO_TAP], [1], + [Define to 1 to enable TAP packet I/O support]) + +AC_DEFINE([ODP_PKTIO_SOCKET], [1], + [Define to 1 to enable SOCKET packet I/O support]) + +AC_DEFINE([ODP_PKTIO_SOCKET_MMAP], [1], + [Define to 1 to enable SOCKET_MMAP packet I/O support]) diff --cc platform/linux-generic/odp_init.c index d267cc82,1412c03a..0268a3bd --- a/platform/linux-generic/odp_init.c +++ b/platform/linux-generic/odp_init.c @@@ -223,12 -223,18 +223,24 @@@ int odp_init_global(odp_instance_t *ins } stage = NAME_TABLE_INIT;
+ if (_odpdrv_driver_init_global()) { + ODP_ERR("ODP drivers init failed\n"); + goto init_failed; + } + stage = DRIVER_INIT; + + if (_odp_ipsec_events_init_global()) { + ODP_ERR("ODP IPsec events init failed.\n"); + goto init_failed; + } + stage = IPSEC_EVENTS_INIT; + + if (_odp_ipsec_sad_init_global()) { + ODP_ERR("ODP IPsec SAD init failed.\n"); + goto init_failed; + } + stage = IPSEC_SAD_INIT; + if (_odp_modules_init_global()) { ODP_ERR("ODP modules init failed\n"); goto init_failed; @@@ -259,13 -265,20 +271,27 @@@ int _odp_term_global(enum init_stage st switch (stage) { case ALL_INIT: case MODULES_INIT: + case IPSEC_SAD_INIT: + if (_odp_ipsec_sad_term_global()) { + ODP_ERR("ODP IPsec SAD term failed.\n"); + rc = -1; + } + /* Fall through */ + + case IPSEC_EVENTS_INIT: + if (_odp_ipsec_events_term_global()) { + ODP_ERR("ODP IPsec events term failed.\n"); + rc = -1; + } + /* Fall through */ + + case DRIVER_INIT: + if (_odpdrv_driver_term_global()) { + ODP_ERR("driver term failed.\n"); + rc = -1; + } + /* Fall through */ + case NAME_TABLE_INIT: if (_odp_int_name_tbl_term_global()) { ODP_ERR("Name table term failed.\n"); diff --cc platform/linux-generic/odp_packet.c index 3011183d,3b2fac21..c65d7011 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@@ -1766,9 -1879,81 +1882,81 @@@ int _odp_packet_copy_md_to_packet(odp_p * user area was truncated in the process. Note this can only * happen when copying between different pools. */ - return dsthdr->buf_hdr.uarea_size < srchdr->buf_hdr.uarea_size; + return dst_size < src_size; }
+ /** Parser helper function for Ethernet packets */ + static inline uint16_t parse_eth(packet_parser_t *prs, const uint8_t **parseptr, + uint32_t *offset, uint32_t frame_len) + { + uint16_t ethtype; + const _odp_ethhdr_t *eth; + uint16_t macaddr0, macaddr2, macaddr4; + const _odp_vlanhdr_t *vlan; + + /* Detect jumbo frames */ + if (frame_len > _ODP_ETH_LEN_MAX) + prs->input_flags.jumbo = 1; + + eth = (const _odp_ethhdr_t *)*parseptr; + + /* Handle Ethernet broadcast/multicast addresses */ + macaddr0 = odp_be_to_cpu_16(*((const uint16_t *)(const void *)eth)); + prs->input_flags.eth_mcast = (macaddr0 & 0x0100) == 0x0100; + + if (macaddr0 == 0xffff) { + macaddr2 = + odp_be_to_cpu_16(*((const uint16_t *) + (const void *)eth + 1)); + macaddr4 = + odp_be_to_cpu_16(*((const uint16_t *) + (const void *)eth + 2)); + prs->input_flags.eth_bcast = + (macaddr2 == 0xffff) && (macaddr4 == 0xffff); + } else { + prs->input_flags.eth_bcast = 0; + } + + /* Get Ethertype */ + ethtype = odp_be_to_cpu_16(eth->type); + *offset += sizeof(*eth); + *parseptr += sizeof(*eth); + + /* Check for SNAP vs. DIX */ + if (ethtype < _ODP_ETH_LEN_MAX) { + prs->input_flags.snap = 1; + if (ethtype > frame_len - *offset) { + prs->error_flags.snap_len = 1; + return 0; + } + ethtype = odp_be_to_cpu_16(*((const uint16_t *)(uintptr_t) + (parseptr + 6))); + *offset += 8; + *parseptr += 8; + } + + /* Parse the VLAN header(s), if present */ + if (ethtype == _ODP_ETHTYPE_VLAN_OUTER) { + prs->input_flags.vlan_qinq = 1; + prs->input_flags.vlan = 1; + + vlan = (const _odp_vlanhdr_t *)*parseptr; + ethtype = odp_be_to_cpu_16(vlan->type); + *offset += sizeof(_odp_vlanhdr_t); + *parseptr += sizeof(_odp_vlanhdr_t); + } + + if (ethtype == _ODP_ETHTYPE_VLAN) { + prs->input_flags.vlan = 1; + vlan = (const _odp_vlanhdr_t *)*parseptr; + ethtype = odp_be_to_cpu_16(vlan->type); + *offset += sizeof(_odp_vlanhdr_t); + *parseptr += sizeof(_odp_vlanhdr_t); + } + + return ethtype; + } + /** * Parser helper function for IPv4 */ diff --cc platform/linux-generic/odp_packet_io.c index d5f8d5de,5f7da263..a1c70861 --- a/platform/linux-generic/odp_packet_io.c +++ b/platform/linux-generic/odp_packet_io.c @@@ -179,10 -201,11 +178,12 @@@ static odp_pktio_t setup_pktio_entry(co
/* if successful, alloc_pktio_entry() returns with the entry locked */ pktio_entry = get_pktio_entry(hdl); - if (!pktio_entry) + if (!pktio_entry) { + unlock_entry(pktio_entry); return ODP_PKTIO_INVALID; + }
+ pktio_entry->s.ops = NULL; /* Reset stale ops */ pktio_entry->s.pool = pool; memcpy(&pktio_entry->s.param, param, sizeof(odp_pktio_param_t)); pktio_entry->s.handle = hdl; @@@ -190,28 -212,28 +191,28 @@@
odp_pktio_config_init(&pktio_entry->s.config);
- for (pktio_if = 0; pktio_if_ops[pktio_if]; ++pktio_if) { - ret = pktio_if_ops[pktio_if]->open(hdl, pktio_entry, name, - pool); - if (!ret) + odp_subsystem_lock(read, pktio_ops); + odp_subsystem_foreach_module(pktio_ops, mod) { + if (0 == mod->open(hdl, pktio_entry, name, pool)) { + pktio_entry->s.ops = mod; + ODP_DBG("%s uses %s\n", name, mod->base.name); break; + } } + odp_subsystem_unlock(read, pktio_ops);
- if (ret != 0) { + if (pktio_entry->s.ops == NULL) { pktio_entry->s.state = PKTIO_STATE_FREE; - hdl = ODP_PKTIO_INVALID; + unlock_entry(pktio_entry); ODP_ERR("Unable to init any I/O type.\n"); - } else { - snprintf(pktio_entry->s.name, - sizeof(pktio_entry->s.name), "%s", name); - pktio_entry->s.state = PKTIO_STATE_OPENED; + return ODP_PKTIO_INVALID; }
+ snprintf(pktio_entry->s.name, + sizeof(pktio_entry->s.name), "%s", name); + pktio_entry->s.state = PKTIO_STATE_OPENED; - pktio_entry->s.ops = pktio_if_ops[pktio_if]; unlock_entry(pktio_entry);
- ODP_DBG("%s uses %s\n", name, pktio_if_ops[pktio_if]->name); - return hdl; }
diff --cc platform/linux-generic/pktio/dpdk.c index 563d70a3,9782d60c..4ef111c3 --- a/platform/linux-generic/pktio/dpdk.c +++ b/platform/linux-generic/pktio/dpdk.c @@@ -1567,14 -1575,11 +1618,14 @@@ static int dpdk_stats_reset(pktio_entry return 0; }
-const pktio_if_ops_t dpdk_pktio_ops = { - .name = "dpdk", - .init_global = dpdk_pktio_init_global, - .init_local = dpdk_pktio_init_local, - .term = dpdk_pktio_term, +static pktio_ops_module_t dpdk_pktio_ops = { + .base = { + .name = "dpdk", + .init_local = dpdk_pktio_init_local, + .init_global = dpdk_pktio_init_global, + .term_local = NULL, - .term_global = NULL, ++ .term_global = dpdk_pktio_term, + }, .open = dpdk_open, .close = dpdk_close, .start = dpdk_start, diff --cc platform/linux-generic/pktio/loopback.c index 01bbc8bc,8bb4b4f1..60bee591 --- a/platform/linux-generic/pktio/loopback.c +++ b/platform/linux-generic/pktio/loopback.c @@@ -175,9 -170,25 +181,25 @@@ static int loopback_send(pktio_entry_t bytes += odp_packet_len(pkt_tbl[i]); }
+ if (pktio_entry->s.config.outbound_ipsec) + for (i = 0; i < len; ++i) { + odp_buffer_t buf = buf_from_buf_hdr(hdr_tbl[i]); + odp_ipsec_packet_result_t result; + + if (_odp_buffer_event_subtype(buf) != + ODP_EVENT_PACKET_IPSEC) + continue; + + /* Possibly postprocessing packet */ + odp_ipsec_result(&result, pkt_tbl[i]); + + _odp_buffer_event_subtype_set(buf, + ODP_EVENT_PACKET_BASIC); + } + odp_ticketlock_lock(&pktio_entry->s.txl);
- queue = queue_fn->from_ext(pktio_entry->s.pkt_loop.loopq); + queue = queue_fn->from_ext(pkt_lbk->loopq); ret = queue_fn->enq_multi(queue, hdr_tbl, len);
if (ret > 0) { diff --cc platform/linux-generic/pktio/tap.c index fffc4c82,d8b78f3f..5bc7481d --- a/platform/linux-generic/pktio/tap.c +++ b/platform/linux-generic/pktio/tap.c @@@ -137,8 -157,30 +160,30 @@@ static int tap_pktio_open(odp_pktio_t i goto sock_err; }
- /* Up interface by default. */ - if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0) { + tap->fd = fd; + tap->skfd = skfd; + tap->mtu = mtu; + tap->pool = pool; + return 0; + sock_err: + close(skfd); + tap_err: + close(fd); + ODP_ERR("Tap device alloc failed.\n"); + return -1; + } + + static int tap_pktio_start(pktio_entry_t *pktio_entry) + { + struct ifreq ifr; - pkt_tap_t *tap = &pktio_entry->s.pkt_tap; ++ pktio_ops_tap_data_t *tap = odp_ops_data(pktio_entry, tap); + + odp_memset(&ifr, 0, sizeof(ifr)); + snprintf(ifr.ifr_name, IF_NAMESIZE, "%s", + (char *)pktio_entry->s.name + 4); + + /* Up interface by default. */ + if (ioctl(tap->skfd, SIOCGIFFLAGS, &ifr) < 0) { __odp_errno = errno; ODP_ERR("ioctl(SIOCGIFFLAGS) failed: %s\n", strerror(errno)); goto sock_err; @@@ -153,16 -195,40 +198,40 @@@ goto sock_err; }
- tap->fd = fd; - tap->skfd = skfd; - tap->mtu = mtu; - tap->pool = pool; return 0; sock_err: - close(skfd); - tap_err: - close(fd); - ODP_ERR("Tap device alloc failed.\n"); + ODP_ERR("Tap device open failed.\n"); + return -1; + } + + static int tap_pktio_stop(pktio_entry_t *pktio_entry) + { + struct ifreq ifr; - pkt_tap_t *tap = &pktio_entry->s.pkt_tap; ++ pktio_ops_tap_data_t *tap = odp_ops_data(pktio_entry, tap); + + odp_memset(&ifr, 0, sizeof(ifr)); + snprintf(ifr.ifr_name, IF_NAMESIZE, "%s", + (char *)pktio_entry->s.name + 4); + + /* Up interface by default. */ + if (ioctl(tap->skfd, SIOCGIFFLAGS, &ifr) < 0) { + __odp_errno = errno; + ODP_ERR("ioctl(SIOCGIFFLAGS) failed: %s\n", strerror(errno)); + goto sock_err; + } + + ifr.ifr_flags &= ~IFF_UP; + ifr.ifr_flags &= ~IFF_RUNNING; + + if (ioctl(tap->skfd, SIOCSIFFLAGS, &ifr) < 0) { + __odp_errno = errno; + ODP_ERR("failed to come up: %s\n", strerror(errno)); + goto sock_err; + } + + return 0; + sock_err: + ODP_ERR("Tap device open failed.\n"); return -1; }
@@@ -368,6 -429,22 +437,23 @@@ static int tap_mac_addr_get(pktio_entry return ETH_ALEN; }
+ static int tap_mac_addr_set(pktio_entry_t *pktio_entry, const void *mac_addr) + { - pkt_tap_t *tap = &pktio_entry->s.pkt_tap; ++ pktio_ops_tap_data_t *tap = odp_ops_data(pktio_entry, tap); + + memcpy(tap->if_mac, mac_addr, ETH_ALEN); + + return mac_addr_set_fd(tap->fd, (char *)pktio_entry->s.name + 4, - tap->if_mac); ++ tap->if_mac); + } + + static int tap_link_status(pktio_entry_t *pktio_entry) + { - return link_status_fd(pktio_entry->s.pkt_tap.skfd, - pktio_entry->s.name + 4); ++ pktio_ops_tap_data_t *tap = odp_ops_data(pktio_entry, tap); ++ ++ return link_status_fd(tap->skfd, pktio_entry->s.name + 4); + } + static int tap_capability(pktio_entry_t *pktio_entry ODP_UNUSED, odp_pktio_capability_t *capa) { @@@ -383,47 -461,26 +470,47 @@@ return 0; }
-const pktio_if_ops_t tap_pktio_ops = { - .name = "tap", - .print = NULL, - .init_global = NULL, - .init_local = NULL, - .term = NULL, +static pktio_ops_module_t tap_pktio_ops = { + .base = { + .name = "tap", + .init_local = NULL, + .term_local = NULL, + .init_global = NULL, + .term_global = NULL, + }, .open = tap_pktio_open, .close = tap_pktio_close, - .start = NULL, - .stop = NULL, + .start = tap_pktio_start, + .stop = tap_pktio_stop, + .stats = NULL, + .stats_reset = NULL, + .pktin_ts_res = NULL, + .pktin_ts_from_ns = NULL, .recv = tap_pktio_recv, .send = tap_pktio_send, .mtu_get = tap_mtu_get, .promisc_mode_set = tap_promisc_mode_set, .promisc_mode_get = tap_promisc_mode_get, .mac_get = tap_mac_addr_get, - .mac_set = NULL, - .link_status = NULL, + .mac_set = tap_mac_addr_set, + .link_status = tap_link_status, .capability = tap_capability, - .pktin_ts_res = NULL, - .pktin_ts_from_ns = NULL, - .config = NULL + .config = NULL, + .input_queues_config = NULL, + .output_queues_config = NULL, + .print = NULL, }; + +ODP_MODULE_CONSTRUCTOR(tap_pktio_ops) +{ + odp_module_constructor(&tap_pktio_ops); + + odp_subsystem_register_module(pktio_ops, &tap_pktio_ops); +} + +/* Temporary variable to enable link this module, + * will remove in Makefile scheme changes. + */ +int enable_link_tap_pktio_ops = 0; + +#endif /* ODP_PKTIO_TAP */ diff --cc platform/linux-generic/pool/generic.c index 37628b13,40114093..c55f6757 --- a/platform/linux-generic/pool/generic.c +++ b/platform/linux-generic/pool/generic.c @@@ -29,8 -29,13 +29,12 @@@ #define UNLOCK(a) _odp_ticketlock_unlock(a) #define LOCK_INIT(a) odp_ticketlock_init(a)
-#define CACHE_BURST 32 #define RING_SIZE_MIN (2 * CACHE_BURST)
+ /* Make sure packet buffers don't cross huge page boundaries starting from this + * page size. 2MB is typically the smallest used huge page size. */ + #define FIRST_HP_SIZE (2 * 1024 * 1024) + /* Define a practical limit for contiguous memory allocations */ #define MAX_SIZE (10 * 1024 * 1024)
diff --cc test/m4/configure.m4 index 460e8449,92bb53ad..a9e345bf --- a/test/m4/configure.m4 +++ b/test/m4/configure.m4 @@@ -1,3 -1,38 +1,39 @@@ - m4_include([test/common_plat/m4/configure.m4]) + m4_include([test/m4/miscellaneous.m4]) + m4_include([test/m4/performance.m4]) + m4_include([test/m4/validation.m4])
- AC_CONFIG_FILES([test/Makefile]) + AC_CONFIG_FILES([test/Makefile + test/common/Makefile + test/miscellaneous/Makefile + test/performance/Makefile + test/validation/Makefile + test/validation/api/atomic/Makefile + test/validation/api/barrier/Makefile + test/validation/api/buffer/Makefile + test/validation/api/chksum/Makefile + test/validation/api/classification/Makefile + test/validation/api/cpumask/Makefile + test/validation/api/crypto/Makefile + test/validation/api/errno/Makefile + test/validation/api/hash/Makefile + test/validation/api/init/Makefile + test/validation/api/ipsec/Makefile + test/validation/api/lock/Makefile + test/validation/api/Makefile + test/validation/api/packet/Makefile + test/validation/api/pktio/Makefile + test/validation/api/pool/Makefile + test/validation/api/queue/Makefile + test/validation/api/random/Makefile + test/validation/api/scheduler/Makefile + test/validation/api/shmem/Makefile + test/validation/api/std_clib/Makefile + test/validation/api/system/Makefile + test/validation/api/thread/Makefile + test/validation/api/time/Makefile + test/validation/api/timer/Makefile + test/validation/api/traffic_mngr/Makefile + test/validation/drv/Makefile + test/validation/drv/drvatomic/Makefile ++ test/validation/drv/drvdriver/Makefile + test/validation/drv/drvshmem/Makefile]) diff --cc test/validation/Makefile.inc index 5512cc0e,4f946b8a..c597d65f --- a/test/validation/Makefile.inc +++ b/test/validation/Makefile.inc @@@ -1,14 -1,8 +1,14 @@@ include $(top_srcdir)/test/Makefile.inc
- COMMON_DIR = $(top_builddir)/test/common_plat/common + COMMON_DIR = $(top_builddir)/test/common
+#the following option ensure that option '-I.' is not passed to gcc, +#therefore distinguishing between '#include "X"' and '#include <X>'. +#It allows common filenames (such as 'errno.h') to be used locally. +AUTOMAKE_OPTIONS = nostdinc + - AM_CFLAGS += -I$(top_srcdir)/test/common_plat/common + AM_CFLAGS += -I$(top_srcdir)/test/common +AM_LDFLAGS += -static
LIBCUNIT_COMMON = $(COMMON_DIR)/libcunit_common.la LIBCPUMASK_COMMON = $(COMMON_DIR)/libcpumask_common.la diff --cc test/validation/drv/drvdriver/.gitignore index 76bb6baf,00000000..76bb6baf mode 100644,000000..100644 --- a/test/validation/drv/drvdriver/.gitignore +++ b/test/validation/drv/drvdriver/.gitignore diff --cc test/validation/drv/drvdriver/Makefile.am index 88bd828a,00000000..88bd828a mode 100644,000000..100644 --- a/test/validation/drv/drvdriver/Makefile.am +++ b/test/validation/drv/drvdriver/Makefile.am diff --cc test/validation/drv/drvdriver/drvdriver_device.c index d010026f,00000000..d010026f mode 100644,000000..100644 --- a/test/validation/drv/drvdriver/drvdriver_device.c +++ b/test/validation/drv/drvdriver/drvdriver_device.c diff --cc test/validation/drv/drvdriver/drvdriver_device.h index afc04c59,00000000..afc04c59 mode 100644,000000..100644 --- a/test/validation/drv/drvdriver/drvdriver_device.h +++ b/test/validation/drv/drvdriver/drvdriver_device.h diff --cc test/validation/drv/drvdriver/drvdriver_device_main.c index 27de9c5b,00000000..27de9c5b mode 100644,000000..100644 --- a/test/validation/drv/drvdriver/drvdriver_device_main.c +++ b/test/validation/drv/drvdriver/drvdriver_device_main.c diff --cc test/validation/drv/drvdriver/drvdriver_devio.c index cf7c7c93,00000000..cf7c7c93 mode 100644,000000..100644 --- a/test/validation/drv/drvdriver/drvdriver_devio.c +++ b/test/validation/drv/drvdriver/drvdriver_devio.c diff --cc test/validation/drv/drvdriver/drvdriver_devio.h index eea9623f,00000000..eea9623f mode 100644,000000..100644 --- a/test/validation/drv/drvdriver/drvdriver_devio.h +++ b/test/validation/drv/drvdriver/drvdriver_devio.h diff --cc test/validation/drv/drvdriver/drvdriver_devio_main.c index 10733adf,00000000..10733adf mode 100644,000000..100644 --- a/test/validation/drv/drvdriver/drvdriver_devio_main.c +++ b/test/validation/drv/drvdriver/drvdriver_devio_main.c diff --cc test/validation/drv/drvdriver/drvdriver_driver.c index edcb0f43,00000000..edcb0f43 mode 100644,000000..100644 --- a/test/validation/drv/drvdriver/drvdriver_driver.c +++ b/test/validation/drv/drvdriver/drvdriver_driver.c diff --cc test/validation/drv/drvdriver/drvdriver_driver.h index d80c6890,00000000..d80c6890 mode 100644,000000..100644 --- a/test/validation/drv/drvdriver/drvdriver_driver.h +++ b/test/validation/drv/drvdriver/drvdriver_driver.h diff --cc test/validation/drv/drvdriver/drvdriver_driver_main.c index 671689c7,00000000..671689c7 mode 100644,000000..100644 --- a/test/validation/drv/drvdriver/drvdriver_driver_main.c +++ b/test/validation/drv/drvdriver/drvdriver_driver_main.c diff --cc test/validation/drv/drvdriver/drvdriver_enumr.c index 38aac3d0,00000000..38aac3d0 mode 100644,000000..100644 --- a/test/validation/drv/drvdriver/drvdriver_enumr.c +++ b/test/validation/drv/drvdriver/drvdriver_enumr.c diff --cc test/validation/drv/drvdriver/drvdriver_enumr.h index afe814ac,00000000..afe814ac mode 100644,000000..100644 --- a/test/validation/drv/drvdriver/drvdriver_enumr.h +++ b/test/validation/drv/drvdriver/drvdriver_enumr.h diff --cc test/validation/drv/drvdriver/drvdriver_enumr_class.c index f7dd42cf,00000000..f7dd42cf mode 100644,000000..100644 --- a/test/validation/drv/drvdriver/drvdriver_enumr_class.c +++ b/test/validation/drv/drvdriver/drvdriver_enumr_class.c diff --cc test/validation/drv/drvdriver/drvdriver_enumr_class.h index a4f6cdc7,00000000..a4f6cdc7 mode 100644,000000..100644 --- a/test/validation/drv/drvdriver/drvdriver_enumr_class.h +++ b/test/validation/drv/drvdriver/drvdriver_enumr_class.h diff --cc test/validation/drv/drvdriver/drvdriver_enumr_class_main.c index 45a4c1a1,00000000..45a4c1a1 mode 100644,000000..100644 --- a/test/validation/drv/drvdriver/drvdriver_enumr_class_main.c +++ b/test/validation/drv/drvdriver/drvdriver_enumr_class_main.c diff --cc test/validation/drv/drvdriver/drvdriver_enumr_main.c index 53bc192e,00000000..53bc192e mode 100644,000000..100644 --- a/test/validation/drv/drvdriver/drvdriver_enumr_main.c +++ b/test/validation/drv/drvdriver/drvdriver_enumr_main.c
-----------------------------------------------------------------------
Summary of changes: .gitignore | 4 +- .shippable.yml | 45 + .travis.yml | 36 +- DEPENDENCIES | 6 +- Makefile.am | 20 +- configure.ac | 23 +- doc/users-guide/users-guide.adoc | 18 + example/Makefile.am | 2 + example/Makefile.inc | 4 +- example/classifier/Makefile.am | 9 +- example/classifier/odp_classifier.c | 14 +- example/generator/Makefile.am | 9 +- example/generator/odp_generator.c | 12 +- example/hello/Makefile.am | 6 +- example/ipfragreass/Makefile.am | 27 +- example/ipsec/Makefile.am | 53 +- example/ipsec/odp_ipsec.c | 12 +- example/l2fwd/odp_l2fwd.c | 2 +- example/l2fwd_simple/Makefile.am | 9 +- example/l2fwd_simple/l2fwd_simple_run.sh | 3 +- example/l3fwd/Makefile.am | 15 +- example/l3fwd/odp_l3fwd.c | 63 +- example/l3fwd/odp_l3fwd_run.sh | 2 +- example/packet/Makefile.am | 9 +- example/packet/odp_pktio.c | 12 +- example/packet/pktio_run.sh | 8 +- example/switch/Makefile.am | 9 +- example/switch/odp_switch.c | 14 +- example/switch/switch_run.sh | 2 +- example/time/Makefile.am | 9 +- example/timer/Makefile.am | 15 +- example/timer/odp_timer_test.c | 10 +- example/traffic_mgmt/Makefile.am | 10 +- example/traffic_mgmt/odp_traffic_mgmt.c | 30 +- helper/.gitignore | 1 + helper/Makefile.am | 57 +- {pkgconfig => helper}/libodphelper.pc.in | 0 helper/m4/configure.m4 | 3 +- helper/test/Makefile.am | 18 +- helper/test/linux/Makefile.am | 5 - helper/test/odpthreads_as_processes | 2 +- helper/test/odpthreads_as_pthreads | 2 +- include/Makefile.am | 163 +++ include/odp/api/spec/ipsec.h | 20 +- include/odp/api/spec/packet.h | 25 +- include/odp/api/spec/pool.h | 16 + include/odp/api/spec/shared_memory.h | 74 +- m4/ax_valgrind_check.m4 | 23 +- m4/odp_atomic.m4 | 95 ++ m4/odp_openssl.m4 | 60 + {platform/linux-generic/m4 => m4}/odp_timer.m4 | 7 +- m4/odp_visibility.m4 | 21 + platform/Makefile.inc | 90 -- platform/linux-dpdk/Makefile.am | 6 + .../linux-dpdk/include/odp/api/plat/timer_types.h | 4 +- platform/linux-dpdk/include/odp_packet_internal.h | 15 + .../linux-dpdk}/libodp-dpdk.pc.in | 0 platform/linux-dpdk/m4/configure.m4 | 16 +- platform/linux-dpdk/m4/odp_openssl.m4 | 1 - platform/linux-dpdk/m4/odp_timer.m4 | 1 - platform/linux-dpdk/m4/performance.m4 | 1 + platform/linux-dpdk/odp_init.c | 36 +- platform/linux-dpdk/odp_packet.c | 325 +++-- .../linux-dpdk/test}/.gitignore | 0 platform/linux-dpdk/test/Makefile.am | 35 + .../linux-dpdk/test}/Makefile.inc | 13 +- .../test/validation/api/pktio/.gitignore | 1 + .../test}/validation/api/pktio/Makefile.am | 0 .../linux-dpdk/test/validation/api/pktio/pktio_env | 1 + .../test}/validation/api/pktio/pktio_run.sh | 0 .../linux-dpdk/test}/wrapper-script.sh | 0 platform/linux-generic/.gitignore | 1 + platform/linux-generic/Makefile.am | 407 ++++--- platform/linux-generic/_ishm.c | 118 +- .../linux-generic/arch/default/odp_sysinfo_parse.c | 5 + .../linux-generic/arch/mips64/odp_sysinfo_parse.c | 5 + .../linux-generic/arch/powerpc/odp_sysinfo_parse.c | 5 + .../linux-generic/arch/x86/odp_sysinfo_parse.c | 36 + platform/linux-generic/include/_ishm_internal.h | 1 + .../include/odp/api/plat/timer_types.h | 4 +- .../linux-generic/include/odp_buffer_internal.h | 6 +- .../linux-generic/include/odp_config_internal.h | 17 +- .../linux-generic/include/odp_debug_internal.h | 2 +- platform/linux-generic/include/odp_internal.h | 9 + .../linux-generic/include/odp_ipsec_internal.h | 201 ++++ .../linux-generic/include/odp_packet_internal.h | 21 +- platform/linux-generic/include/odp_pool_internal.h | 3 +- platform/linux-generic/include/protocols/ip.h | 1 + .../linux-generic}/libodp-linux.pc.in | 0 platform/linux-generic/m4/configure.m4 | 98 +- platform/linux-generic/m4/odp_dpdk.m4 | 4 +- platform/linux-generic/m4/odp_netmap.m4 | 4 +- platform/linux-generic/m4/odp_openssl.m4 | 37 - platform/linux-generic/m4/odp_pcap.m4 | 4 +- {test => platform}/linux-generic/m4/performance.m4 | 2 + platform/linux-generic/odp_event.c | 4 + platform/linux-generic/odp_init.c | 26 + platform/linux-generic/odp_ipsec.c | 1251 ++++++++++++++++++-- platform/linux-generic/odp_ipsec_events.c | 156 +++ platform/linux-generic/odp_ipsec_sad.c | 500 ++++++++ platform/linux-generic/odp_packet.c | 413 +++++-- platform/linux-generic/odp_packet_io.c | 34 +- platform/linux-generic/odp_pkt_queue.c | 22 +- platform/linux-generic/odp_shared_memory.c | 5 + platform/linux-generic/odp_sorted_list.c | 12 +- platform/linux-generic/odp_system_info.c | 7 +- platform/linux-generic/odp_timer.c | 110 +- platform/linux-generic/odp_timer_wheel.c | 44 +- platform/linux-generic/odp_traffic_mngr.c | 42 +- platform/linux-generic/pktio/dpdk.c | 105 +- platform/linux-generic/pktio/loopback.c | 25 + platform/linux-generic/pktio/netmap.c | 17 +- platform/linux-generic/pktio/socket_mmap.c | 2 +- platform/linux-generic/pktio/tap.c | 117 +- platform/linux-generic/pool/generic.c | 103 +- .../linux-generic/test}/.gitignore | 1 + platform/linux-generic/test/Makefile.am | 57 + .../linux-generic/test}/Makefile.inc | 4 +- .../linux-generic/test}/mmap_vlan_ins/.gitignore | 0 .../linux-generic/test}/mmap_vlan_ins/Makefile.am | 2 +- .../test}/mmap_vlan_ins/mmap_vlan_ins.c | 0 .../test}/mmap_vlan_ins/mmap_vlan_ins.sh | 0 .../linux-generic/test/mmap_vlan_ins}/pktio_env | 0 .../linux-generic/test}/mmap_vlan_ins/vlan.pcap | Bin .../linux-generic/test/performance}/.gitignore | 0 .../linux-generic/test}/performance/Makefile.am | 0 .../test}/performance/odp_scheduling_run_proc.sh | 2 +- .../linux-generic/test}/pktio_ipc/.gitignore | 0 .../linux-generic/test}/pktio_ipc/Makefile.am | 0 .../linux-generic/test}/pktio_ipc/ipc_common.c | 8 +- .../linux-generic/test}/pktio_ipc/ipc_common.h | 0 .../linux-generic/test}/pktio_ipc/pktio_ipc1.c | 0 .../linux-generic/test}/pktio_ipc/pktio_ipc2.c | 0 .../linux-generic/test}/pktio_ipc/pktio_ipc_run.sh | 0 .../linux-generic/test}/ring/.gitignore | 0 .../linux-generic/test}/ring/Makefile.am | 2 +- .../linux-generic/test}/ring/ring_basic.c | 0 .../linux-generic/test}/ring/ring_main.c | 0 .../linux-generic/test}/ring/ring_stress.c | 0 .../linux-generic/test}/ring/ring_suites.c | 0 .../linux-generic/test}/ring/ring_suites.h | 0 .../linux-generic/test/validation/Makefile.inc | 1 + .../linux-generic/test/validation/api/Makefile.inc | 1 + .../test/validation/api/pktio}/.gitignore | 0 .../test}/validation/api/pktio/Makefile.am | 0 .../test/validation/api/pktio}/pktio_env | 0 .../test}/validation/api/pktio/pktio_run.sh | 2 +- .../test}/validation/api/pktio/pktio_run_dpdk.sh | 4 +- .../test}/validation/api/pktio/pktio_run_netmap.sh | 2 +- .../test}/validation/api/pktio/pktio_run_pcap.sh | 2 +- .../test}/validation/api/pktio/pktio_run_tap.sh | 2 +- .../test}/validation/api/shmem/.gitignore | 0 .../test}/validation/api/shmem/Makefile.am | 2 +- .../test}/validation/api/shmem/shmem_common.h | 0 .../test}/validation/api/shmem/shmem_linux.c | 8 +- .../test}/validation/api/shmem/shmem_linux.h | 0 .../test}/validation/api/shmem/shmem_odp1.c | 0 .../test}/validation/api/shmem/shmem_odp1.h | 0 .../test}/validation/api/shmem/shmem_odp2.c | 0 .../test}/validation/api/shmem/shmem_odp2.h | 0 scripts/Dockerfile | 26 + scripts/build-pktio-dpdk | 8 +- scripts/ci-checkpatches.sh | 22 +- test/Makefile.am | 2 +- test/Makefile.inc | 3 +- test/README | 2 +- test/{common_plat => }/common/Makefile.am | 7 + test/{common_plat => }/common/mask_common.c | 0 test/{common_plat => }/common/mask_common.h | 0 test/{common_plat => }/common/odp_cunit_common.c | 0 test/{common_plat => }/common/odp_cunit_common.h | 0 .../{linux-generic/run-test => common/run-test.sh} | 0 test/{ => common}/test_debug.h | 0 test/common_plat/Makefile.am | 7 - test/common_plat/m4/configure.m4 | 39 - test/common_plat/validation/api/Makefile.am | 27 - test/common_plat/validation/api/Makefile.inc | 13 - test/common_plat/validation/api/ipsec/.gitignore | 1 - test/common_plat/validation/api/ipsec/Makefile.am | 10 - test/common_plat/validation/api/ipsec/ipsec.c | 44 - test/common_plat/validation/api/ipsec/ipsec.h | 24 - test/common_plat/validation/api/ipsec/ipsec_main.c | 12 - test/common_plat/validation/drv/Makefile.inc | 1 - test/linux-dpdk/Makefile.am | 56 - test/linux-dpdk/m4/configure.m4 | 4 - test/linux-dpdk/run-test | 1 - test/linux-dpdk/validation/api/pktio/.gitignore | 1 - test/linux-dpdk/validation/api/pktio/pktio_env | 1 - test/linux-generic/Makefile.am | 90 -- test/linux-generic/m4/configure.m4 | 9 - test/linux-generic/validation/Makefile.inc | 1 - test/linux-generic/validation/api/Makefile.inc | 1 - test/linux-generic/validation/api/pktio/.gitignore | 2 - test/m4/configure.m4 | 40 +- test/{common_plat => }/m4/miscellaneous.m4 | 0 test/{common_plat => }/m4/performance.m4 | 0 test/{common_plat => }/m4/validation.m4 | 2 +- test/{common_plat => }/miscellaneous/.gitignore | 0 test/{common_plat => }/miscellaneous/Makefile.am | 4 +- .../miscellaneous/odp_api_from_cpp.cpp | 0 test/{common_plat => }/performance/.gitignore | 0 test/{common_plat => }/performance/Makefile.am | 17 +- test/{common_plat => }/performance/dummy_crc.h | 0 .../performance/odp_bench_packet.c | 14 +- test/{common_plat => }/performance/odp_crypto.c | 0 test/{common_plat => }/performance/odp_l2fwd.c | 14 +- .../{common_plat => }/performance/odp_l2fwd_run.sh | 5 +- .../performance/odp_pktio_ordered.c | 14 +- .../performance/odp_pktio_ordered_run.sh | 0 .../{common_plat => }/performance/odp_pktio_perf.c | 42 +- .../performance/odp_sched_latency.c | 0 .../performance/odp_sched_latency_run.sh | 0 .../{common_plat => }/performance/odp_scheduling.c | 12 +- .../performance/odp_scheduling_run.sh | 0 test/{common_plat => }/performance/udp64.pcap | Bin test/{common_plat => }/validation/Makefile.am | 0 test/{common_plat => }/validation/Makefile.inc | 4 +- test/{linux-generic => validation/api}/.gitignore | 0 test/validation/api/Makefile.am | 79 ++ test/validation/api/Makefile.inc | 6 + test/{common_plat => }/validation/api/README | 0 .../validation/api/atomic/.gitignore | 0 .../validation/api/atomic/Makefile.am | 2 +- .../validation/api/atomic/atomic.c | 0 .../validation/api/atomic/atomic.h | 0 .../validation/api/atomic/atomic_main.c | 0 .../validation/api/barrier/.gitignore | 0 .../validation/api/barrier/Makefile.am | 2 +- .../validation/api/barrier/barrier.c | 0 .../validation/api/barrier/barrier.h | 0 .../validation/api/barrier/barrier_main.c | 0 .../validation/api/buffer/.gitignore | 0 .../validation/api/buffer/Makefile.am | 2 +- .../validation/api/buffer/buffer.c | 0 .../validation/api/buffer/buffer.h | 0 .../validation/api/buffer/buffer_main.c | 0 .../validation/api/chksum/.gitignore | 0 .../validation/api/chksum/Makefile.am | 0 .../validation/api/chksum/chksum.c | 0 .../validation/api/chksum/chksum.h | 0 .../validation/api/chksum/chksum_main.c | 0 .../validation/api/classification/.gitignore | 0 .../validation/api/classification/Makefile.am | 2 +- .../validation/api/classification/classification.c | 0 .../validation/api/classification/classification.h | 0 .../api/classification/classification_main.c | 0 .../api/classification/odp_classification_basic.c | 0 .../api/classification/odp_classification_common.c | 0 .../classification/odp_classification_test_pmr.c | 0 .../api/classification/odp_classification_tests.c | 0 .../classification/odp_classification_testsuites.h | 0 .../validation/api/cpumask/.gitignore | 0 .../validation/api/cpumask/Makefile.am | 2 +- .../validation/api/cpumask/cpumask.c | 0 .../validation/api/cpumask/cpumask.h | 0 .../validation/api/cpumask/cpumask_main.c | 0 .../validation/api/crypto/.gitignore | 0 .../validation/api/crypto/Makefile.am | 2 +- .../validation/api/crypto/crypto.c | 0 .../validation/api/crypto/crypto.h | 0 .../validation/api/crypto/crypto_main.c | 0 .../validation/api/crypto/odp_crypto_test_inp.c | 0 .../validation/api/crypto/odp_crypto_test_inp.h | 0 .../validation/api/crypto/test_vectors.h | 0 .../validation/api/crypto/test_vectors_len.h | 0 .../validation/api/errno/.gitignore | 0 .../validation/api/errno/Makefile.am | 2 +- .../{common_plat => }/validation/api/errno/errno.c | 0 .../{common_plat => }/validation/api/errno/errno.h | 0 .../validation/api/errno/errno_main.c | 0 .../validation/api/hash/.gitignore | 0 .../validation/api/hash/Makefile.am | 2 +- test/{common_plat => }/validation/api/hash/hash.c | 0 test/{common_plat => }/validation/api/hash/hash.h | 0 .../validation/api/hash/hash_main.c | 0 .../validation/api/init/.gitignore | 0 .../validation/api/init/Makefile.am | 2 +- test/{common_plat => }/validation/api/init/init.c | 0 test/{common_plat => }/validation/api/init/init.h | 0 .../validation/api/init/init_main_abort.c | 0 .../validation/api/init/init_main_log.c | 0 .../validation/api/init/init_main_ok.c | 0 test/validation/api/ipsec/.gitignore | 4 + test/validation/api/ipsec/Makefile.am | 27 + test/validation/api/ipsec/ipsec.c | 887 ++++++++++++++ test/validation/api/ipsec/ipsec.h | 89 ++ test/validation/api/ipsec/ipsec_async.c | 55 + test/validation/api/ipsec/ipsec_inline_in.c | 56 + test/validation/api/ipsec/ipsec_inline_out.c | 56 + test/validation/api/ipsec/ipsec_sync.c | 53 + test/validation/api/ipsec/ipsec_sync_in.c | 27 + test/validation/api/ipsec/ipsec_test_in.c | 815 +++++++++++++ test/validation/api/ipsec/ipsec_test_out.c | 348 ++++++ test/validation/api/ipsec/test_vectors.h | 965 +++++++++++++++ .../validation/api/lock/.gitignore | 0 .../validation/api/lock/Makefile.am | 2 +- test/{common_plat => }/validation/api/lock/lock.c | 0 test/{common_plat => }/validation/api/lock/lock.h | 0 .../validation/api/lock/lock_main.c | 0 .../validation/api/packet/.gitignore | 0 .../validation/api/packet/Makefile.am | 2 +- .../validation/api/packet/packet.c | 36 +- .../validation/api/packet/packet.h | 0 .../validation/api/packet/packet_main.c | 0 .../validation/api/pktio/.gitignore | 0 .../validation/api/pktio/Makefile.am | 2 +- .../validation/api/pktio/parser.c | 0 .../validation/api/pktio/parser.h | 0 .../{common_plat => }/validation/api/pktio/pktio.c | 0 .../{common_plat => }/validation/api/pktio/pktio.h | 0 .../validation/api/pktio/pktio_main.c | 0 .../validation/api/pool/.gitignore | 0 .../validation/api/pool/Makefile.am | 2 +- test/{common_plat => }/validation/api/pool/pool.c | 0 test/{common_plat => }/validation/api/pool/pool.h | 0 .../validation/api/pool/pool_main.c | 0 .../validation/api/queue/.gitignore | 0 .../validation/api/queue/Makefile.am | 2 +- .../{common_plat => }/validation/api/queue/queue.c | 0 .../{common_plat => }/validation/api/queue/queue.h | 0 .../validation/api/queue/queue_main.c | 0 .../validation/api/random/.gitignore | 0 .../validation/api/random/Makefile.am | 2 +- .../validation/api/random/random.c | 0 .../validation/api/random/random.h | 0 .../validation/api/random/random_main.c | 0 .../validation/api/scheduler/.gitignore | 0 .../validation/api/scheduler/Makefile.am | 2 +- .../validation/api/scheduler/scheduler.c | 0 .../validation/api/scheduler/scheduler.h | 0 .../validation/api/scheduler/scheduler_main.c | 0 .../validation/api/shmem/.gitignore | 0 .../validation/api/shmem/Makefile.am | 2 +- .../{common_plat => }/validation/api/shmem/shmem.c | 26 +- .../{common_plat => }/validation/api/shmem/shmem.h | 0 .../validation/api/shmem/shmem_main.c | 0 .../validation/api/std_clib/.gitignore | 0 .../validation/api/std_clib/Makefile.am | 2 +- .../validation/api/std_clib/std_clib.c | 0 .../validation/api/std_clib/std_clib.h | 0 .../validation/api/std_clib/std_clib_main.c | 0 .../validation/api/system/.gitignore | 0 .../validation/api/system/Makefile.am | 2 +- .../validation/api/system/system.c | 0 .../validation/api/system/system.h | 0 .../validation/api/system/system_main.c | 0 .../validation/api/thread/.gitignore | 0 .../validation/api/thread/Makefile.am | 2 +- .../validation/api/thread/thread.c | 0 .../validation/api/thread/thread.h | 0 .../validation/api/thread/thread_main.c | 0 .../validation/api/time/.gitignore | 0 .../validation/api/time/Makefile.am | 2 +- test/{common_plat => }/validation/api/time/time.c | 0 test/{common_plat => }/validation/api/time/time.sh | 2 +- .../validation/api/time/time_main.c | 0 .../validation/api/time/time_test.h | 0 .../validation/api/timer/.gitignore | 0 .../validation/api/timer/Makefile.am | 2 +- .../{common_plat => }/validation/api/timer/timer.c | 0 .../{common_plat => }/validation/api/timer/timer.h | 0 .../validation/api/timer/timer_main.c | 0 .../validation/api/traffic_mngr/.gitignore | 0 .../validation/api/traffic_mngr/Makefile.am | 2 +- .../validation/api/traffic_mngr/traffic_mngr.c | 0 .../validation/api/traffic_mngr/traffic_mngr.h | 0 .../validation/api/traffic_mngr/traffic_mngr.sh | 2 +- .../api/traffic_mngr/traffic_mngr_main.c | 0 .../performance => validation/drv}/.gitignore | 0 test/{common_plat => }/validation/drv/Makefile.am | 0 test/validation/drv/Makefile.inc | 1 + test/{common_plat => }/validation/drv/README | 0 .../validation/drv/drvatomic/.gitignore | 0 .../validation/drv/drvatomic/Makefile.am | 0 .../validation/drv/drvatomic/drvatomic.c | 0 .../validation/drv/drvatomic/drvatomic.h | 0 .../validation/drv/drvatomic/drvatomic_main.c | 0 .../validation/drv/drvdriver/.gitignore | 0 .../validation/drv/drvdriver/Makefile.am | 0 .../validation/drv/drvdriver/drvdriver_device.c | 0 .../validation/drv/drvdriver/drvdriver_device.h | 0 .../drv/drvdriver/drvdriver_device_main.c | 0 .../validation/drv/drvdriver/drvdriver_devio.c | 0 .../validation/drv/drvdriver/drvdriver_devio.h | 0 .../drv/drvdriver/drvdriver_devio_main.c | 0 .../validation/drv/drvdriver/drvdriver_driver.c | 0 .../validation/drv/drvdriver/drvdriver_driver.h | 0 .../drv/drvdriver/drvdriver_driver_main.c | 0 .../validation/drv/drvdriver/drvdriver_enumr.c | 0 .../validation/drv/drvdriver/drvdriver_enumr.h | 0 .../drv/drvdriver/drvdriver_enumr_class.c | 0 .../drv/drvdriver/drvdriver_enumr_class.h | 0 .../drv/drvdriver/drvdriver_enumr_class_main.c | 0 .../drv/drvdriver/drvdriver_enumr_main.c | 0 .../validation/drv/drvshmem/.gitignore | 0 .../validation/drv/drvshmem/Makefile.am | 0 .../validation/drv/drvshmem/drvshmem.c | 0 .../validation/drv/drvshmem/drvshmem.h | 0 .../validation/drv/drvshmem/drvshmem_main.c | 0 399 files changed, 8101 insertions(+), 1806 deletions(-) create mode 100644 .shippable.yml create mode 100644 helper/.gitignore rename {pkgconfig => helper}/libodphelper.pc.in (100%) delete mode 100644 helper/test/linux/Makefile.am create mode 100644 include/Makefile.am create mode 100644 m4/odp_atomic.m4 create mode 100644 m4/odp_openssl.m4 rename {platform/linux-generic/m4 => m4}/odp_timer.m4 (63%) create mode 100644 m4/odp_visibility.m4 rename {pkgconfig => platform/linux-dpdk}/libodp-dpdk.pc.in (100%) delete mode 120000 platform/linux-dpdk/m4/odp_openssl.m4 delete mode 120000 platform/linux-dpdk/m4/odp_timer.m4 create mode 120000 platform/linux-dpdk/m4/performance.m4 copy {test/linux-dpdk => platform/linux-dpdk/test}/.gitignore (100%) create mode 100644 platform/linux-dpdk/test/Makefile.am rename {test/linux-dpdk => platform/linux-dpdk/test}/Makefile.inc (61%) create mode 120000 platform/linux-dpdk/test/validation/api/pktio/.gitignore rename {test/linux-dpdk => platform/linux-dpdk/test}/validation/api/pktio/Makefile.am (100%) create mode 120000 platform/linux-dpdk/test/validation/api/pktio/pktio_env rename {test/linux-dpdk => platform/linux-dpdk/test}/validation/api/pktio/pktio_run.sh (100%) rename {test/linux-dpdk => platform/linux-dpdk/test}/wrapper-script.sh (100%) create mode 100644 platform/linux-generic/include/odp_ipsec_internal.h rename {pkgconfig => platform/linux-generic}/libodp-linux.pc.in (100%) delete mode 100644 platform/linux-generic/m4/odp_openssl.m4 rename {test => platform}/linux-generic/m4/performance.m4 (93%) create mode 100644 platform/linux-generic/odp_ipsec_events.c create mode 100644 platform/linux-generic/odp_ipsec_sad.c rename {test/linux-dpdk => platform/linux-generic/test}/.gitignore (57%) create mode 100644 platform/linux-generic/test/Makefile.am rename {test/linux-generic => platform/linux-generic/test}/Makefile.inc (82%) rename {test/linux-generic => platform/linux-generic/test}/mmap_vlan_ins/.gitignore (100%) rename {test/linux-generic => platform/linux-generic/test}/mmap_vlan_ins/Makefile.am (88%) rename {test/linux-generic => platform/linux-generic/test}/mmap_vlan_ins/mmap_vlan_ins.c (100%) rename {test/linux-generic => platform/linux-generic/test}/mmap_vlan_ins/mmap_vlan_ins.sh (100%) rename {test/linux-generic/validation/api/pktio => platform/linux-generic/test/mmap_vlan_ins}/pktio_env (100%) rename {test/linux-generic => platform/linux-generic/test}/mmap_vlan_ins/vlan.pcap (100%) rename {test/common_plat/validation/api => platform/linux-generic/test/performance}/.gitignore (100%) rename {test/linux-generic => platform/linux-generic/test}/performance/Makefile.am (100%) rename {test/linux-generic => platform/linux-generic/test}/performance/odp_scheduling_run_proc.sh (90%) rename {test/linux-generic => platform/linux-generic/test}/pktio_ipc/.gitignore (100%) rename {test/linux-generic => platform/linux-generic/test}/pktio_ipc/Makefile.am (100%) rename {test/linux-generic => platform/linux-generic/test}/pktio_ipc/ipc_common.c (94%) rename {test/linux-generic => platform/linux-generic/test}/pktio_ipc/ipc_common.h (100%) rename {test/linux-generic => platform/linux-generic/test}/pktio_ipc/pktio_ipc1.c (100%) rename {test/linux-generic => platform/linux-generic/test}/pktio_ipc/pktio_ipc2.c (100%) rename {test/linux-generic => platform/linux-generic/test}/pktio_ipc/pktio_ipc_run.sh (100%) rename {test/linux-generic => platform/linux-generic/test}/ring/.gitignore (100%) rename {test/linux-generic => platform/linux-generic/test}/ring/Makefile.am (89%) rename {test/linux-generic => platform/linux-generic/test}/ring/ring_basic.c (100%) rename {test/linux-generic => platform/linux-generic/test}/ring/ring_main.c (100%) rename {test/linux-generic => platform/linux-generic/test}/ring/ring_stress.c (100%) rename {test/linux-generic => platform/linux-generic/test}/ring/ring_suites.c (100%) rename {test/linux-generic => platform/linux-generic/test}/ring/ring_suites.h (100%) create mode 100644 platform/linux-generic/test/validation/Makefile.inc create mode 100644 platform/linux-generic/test/validation/api/Makefile.inc rename {test/common_plat/validation/drv => platform/linux-generic/test/validation/api/pktio}/.gitignore (100%) rename {test/linux-generic => platform/linux-generic/test}/validation/api/pktio/Makefile.am (100%) rename {test/linux-generic/mmap_vlan_ins => platform/linux-generic/test/validation/api/pktio}/pktio_env (100%) rename {test/linux-generic => platform/linux-generic/test}/validation/api/pktio/pktio_run.sh (97%) rename {test/linux-generic => platform/linux-generic/test}/validation/api/pktio/pktio_run_dpdk.sh (92%) rename {test/linux-generic => platform/linux-generic/test}/validation/api/pktio/pktio_run_netmap.sh (97%) rename {test/linux-generic => platform/linux-generic/test}/validation/api/pktio/pktio_run_pcap.sh (93%) rename {test/linux-generic => platform/linux-generic/test}/validation/api/pktio/pktio_run_tap.sh (97%) rename {test/linux-generic => platform/linux-generic/test}/validation/api/shmem/.gitignore (100%) rename {test/linux-generic => platform/linux-generic/test}/validation/api/shmem/Makefile.am (90%) rename {test/linux-generic => platform/linux-generic/test}/validation/api/shmem/shmem_common.h (100%) rename {test/linux-generic => platform/linux-generic/test}/validation/api/shmem/shmem_linux.c (97%) rename {test/linux-generic => platform/linux-generic/test}/validation/api/shmem/shmem_linux.h (100%) rename {test/linux-generic => platform/linux-generic/test}/validation/api/shmem/shmem_odp1.c (100%) rename {test/linux-generic => platform/linux-generic/test}/validation/api/shmem/shmem_odp1.h (100%) rename {test/linux-generic => platform/linux-generic/test}/validation/api/shmem/shmem_odp2.c (100%) rename {test/linux-generic => platform/linux-generic/test}/validation/api/shmem/shmem_odp2.h (100%) create mode 100644 scripts/Dockerfile rename test/{common_plat => }/common/Makefile.am (82%) rename test/{common_plat => }/common/mask_common.c (100%) rename test/{common_plat => }/common/mask_common.h (100%) rename test/{common_plat => }/common/odp_cunit_common.c (100%) rename test/{common_plat => }/common/odp_cunit_common.h (100%) rename test/{linux-generic/run-test => common/run-test.sh} (100%) rename test/{ => common}/test_debug.h (100%) delete mode 100644 test/common_plat/Makefile.am delete mode 100644 test/common_plat/m4/configure.m4 delete mode 100644 test/common_plat/validation/api/Makefile.am delete mode 100644 test/common_plat/validation/api/Makefile.inc delete mode 100644 test/common_plat/validation/api/ipsec/.gitignore delete mode 100644 test/common_plat/validation/api/ipsec/Makefile.am delete mode 100644 test/common_plat/validation/api/ipsec/ipsec.c delete mode 100644 test/common_plat/validation/api/ipsec/ipsec.h delete mode 100644 test/common_plat/validation/api/ipsec/ipsec_main.c delete mode 100644 test/common_plat/validation/drv/Makefile.inc delete mode 100644 test/linux-dpdk/Makefile.am delete mode 100644 test/linux-dpdk/m4/configure.m4 delete mode 120000 test/linux-dpdk/run-test delete mode 120000 test/linux-dpdk/validation/api/pktio/.gitignore delete mode 120000 test/linux-dpdk/validation/api/pktio/pktio_env delete mode 100644 test/linux-generic/Makefile.am delete mode 100644 test/linux-generic/m4/configure.m4 delete mode 100644 test/linux-generic/validation/Makefile.inc delete mode 100644 test/linux-generic/validation/api/Makefile.inc delete mode 100644 test/linux-generic/validation/api/pktio/.gitignore rename test/{common_plat => }/m4/miscellaneous.m4 (100%) rename test/{common_plat => }/m4/performance.m4 (100%) rename test/{common_plat => }/m4/validation.m4 (96%) rename test/{common_plat => }/miscellaneous/.gitignore (100%) rename test/{common_plat => }/miscellaneous/Makefile.am (58%) rename test/{common_plat => }/miscellaneous/odp_api_from_cpp.cpp (100%) rename test/{common_plat => }/performance/.gitignore (100%) rename test/{common_plat => }/performance/Makefile.am (69%) rename test/{common_plat => }/performance/dummy_crc.h (100%) rename test/{common_plat => }/performance/odp_bench_packet.c (98%) rename test/{common_plat => }/performance/odp_crypto.c (100%) rename test/{common_plat => }/performance/odp_l2fwd.c (98%) rename test/{common_plat => }/performance/odp_l2fwd_run.sh (94%) rename test/{common_plat => }/performance/odp_pktio_ordered.c (98%) rename test/{common_plat => }/performance/odp_pktio_ordered_run.sh (100%) rename test/{common_plat => }/performance/odp_pktio_perf.c (97%) rename test/{common_plat => }/performance/odp_sched_latency.c (100%) rename test/{common_plat => }/performance/odp_sched_latency_run.sh (100%) rename test/{common_plat => }/performance/odp_scheduling.c (97%) rename test/{common_plat => }/performance/odp_scheduling_run.sh (100%) rename test/{common_plat => }/performance/udp64.pcap (100%) rename test/{common_plat => }/validation/Makefile.am (100%) rename test/{common_plat => }/validation/Makefile.inc (83%) rename test/{linux-generic => validation/api}/.gitignore (100%) create mode 100644 test/validation/api/Makefile.am create mode 100644 test/validation/api/Makefile.inc rename test/{common_plat => }/validation/api/README (100%) rename test/{common_plat => }/validation/api/atomic/.gitignore (100%) rename test/{common_plat => }/validation/api/atomic/Makefile.am (77%) rename test/{common_plat => }/validation/api/atomic/atomic.c (100%) rename test/{common_plat => }/validation/api/atomic/atomic.h (100%) rename test/{common_plat => }/validation/api/atomic/atomic_main.c (100%) rename test/{common_plat => }/validation/api/barrier/.gitignore (100%) rename test/{common_plat => }/validation/api/barrier/Makefile.am (77%) rename test/{common_plat => }/validation/api/barrier/barrier.c (100%) rename test/{common_plat => }/validation/api/barrier/barrier.h (100%) rename test/{common_plat => }/validation/api/barrier/barrier_main.c (100%) rename test/{common_plat => }/validation/api/buffer/.gitignore (100%) rename test/{common_plat => }/validation/api/buffer/Makefile.am (77%) rename test/{common_plat => }/validation/api/buffer/buffer.c (100%) rename test/{common_plat => }/validation/api/buffer/buffer.h (100%) rename test/{common_plat => }/validation/api/buffer/buffer_main.c (100%) rename test/{common_plat => }/validation/api/chksum/.gitignore (100%) rename test/{common_plat => }/validation/api/chksum/Makefile.am (100%) rename test/{common_plat => }/validation/api/chksum/chksum.c (100%) rename test/{common_plat => }/validation/api/chksum/chksum.h (100%) rename test/{common_plat => }/validation/api/chksum/chksum_main.c (100%) rename test/{common_plat => }/validation/api/classification/.gitignore (100%) rename test/{common_plat => }/validation/api/classification/Makefile.am (89%) rename test/{common_plat => }/validation/api/classification/classification.c (100%) rename test/{common_plat => }/validation/api/classification/classification.h (100%) rename test/{common_plat => }/validation/api/classification/classification_main.c (100%) rename test/{common_plat => }/validation/api/classification/odp_classification_basic.c (100%) rename test/{common_plat => }/validation/api/classification/odp_classification_common.c (100%) rename test/{common_plat => }/validation/api/classification/odp_classification_test_pmr.c (100%) rename test/{common_plat => }/validation/api/classification/odp_classification_tests.c (100%) rename test/{common_plat => }/validation/api/classification/odp_classification_testsuites.h (100%) rename test/{common_plat => }/validation/api/cpumask/.gitignore (100%) rename test/{common_plat => }/validation/api/cpumask/Makefile.am (80%) rename test/{common_plat => }/validation/api/cpumask/cpumask.c (100%) rename test/{common_plat => }/validation/api/cpumask/cpumask.h (100%) rename test/{common_plat => }/validation/api/cpumask/cpumask_main.c (100%) rename test/{common_plat => }/validation/api/crypto/.gitignore (100%) rename test/{common_plat => }/validation/api/crypto/Makefile.am (87%) rename test/{common_plat => }/validation/api/crypto/crypto.c (100%) rename test/{common_plat => }/validation/api/crypto/crypto.h (100%) rename test/{common_plat => }/validation/api/crypto/crypto_main.c (100%) rename test/{common_plat => }/validation/api/crypto/odp_crypto_test_inp.c (100%) rename test/{common_plat => }/validation/api/crypto/odp_crypto_test_inp.h (100%) rename test/{common_plat => }/validation/api/crypto/test_vectors.h (100%) rename test/{common_plat => }/validation/api/crypto/test_vectors_len.h (100%) rename test/{common_plat => }/validation/api/errno/.gitignore (100%) rename test/{common_plat => }/validation/api/errno/Makefile.am (77%) rename test/{common_plat => }/validation/api/errno/errno.c (100%) rename test/{common_plat => }/validation/api/errno/errno.h (100%) rename test/{common_plat => }/validation/api/errno/errno_main.c (100%) rename test/{common_plat => }/validation/api/hash/.gitignore (100%) rename test/{common_plat => }/validation/api/hash/Makefile.am (77%) rename test/{common_plat => }/validation/api/hash/hash.c (100%) rename test/{common_plat => }/validation/api/hash/hash.h (100%) rename test/{common_plat => }/validation/api/hash/hash_main.c (100%) rename test/{common_plat => }/validation/api/init/.gitignore (100%) rename test/{common_plat => }/validation/api/init/Makefile.am (85%) rename test/{common_plat => }/validation/api/init/init.c (100%) rename test/{common_plat => }/validation/api/init/init.h (100%) rename test/{common_plat => }/validation/api/init/init_main_abort.c (100%) rename test/{common_plat => }/validation/api/init/init_main_log.c (100%) rename test/{common_plat => }/validation/api/init/init_main_ok.c (100%) create mode 100644 test/validation/api/ipsec/.gitignore create mode 100644 test/validation/api/ipsec/Makefile.am create mode 100644 test/validation/api/ipsec/ipsec.c create mode 100644 test/validation/api/ipsec/ipsec.h create mode 100644 test/validation/api/ipsec/ipsec_async.c create mode 100644 test/validation/api/ipsec/ipsec_inline_in.c create mode 100644 test/validation/api/ipsec/ipsec_inline_out.c create mode 100644 test/validation/api/ipsec/ipsec_sync.c create mode 100644 test/validation/api/ipsec/ipsec_sync_in.c create mode 100644 test/validation/api/ipsec/ipsec_test_in.c create mode 100644 test/validation/api/ipsec/ipsec_test_out.c create mode 100644 test/validation/api/ipsec/test_vectors.h rename test/{common_plat => }/validation/api/lock/.gitignore (100%) rename test/{common_plat => }/validation/api/lock/Makefile.am (77%) rename test/{common_plat => }/validation/api/lock/lock.c (100%) rename test/{common_plat => }/validation/api/lock/lock.h (100%) rename test/{common_plat => }/validation/api/lock/lock_main.c (100%) rename test/{common_plat => }/validation/api/packet/.gitignore (100%) rename test/{common_plat => }/validation/api/packet/Makefile.am (77%) rename test/{common_plat => }/validation/api/packet/packet.c (98%) rename test/{common_plat => }/validation/api/packet/packet.h (100%) rename test/{common_plat => }/validation/api/packet/packet_main.c (100%) rename test/{common_plat => }/validation/api/pktio/.gitignore (100%) rename test/{common_plat => }/validation/api/pktio/Makefile.am (79%) rename test/{common_plat => }/validation/api/pktio/parser.c (100%) rename test/{common_plat => }/validation/api/pktio/parser.h (100%) rename test/{common_plat => }/validation/api/pktio/pktio.c (100%) rename test/{common_plat => }/validation/api/pktio/pktio.h (100%) rename test/{common_plat => }/validation/api/pktio/pktio_main.c (100%) rename test/{common_plat => }/validation/api/pool/.gitignore (100%) rename test/{common_plat => }/validation/api/pool/Makefile.am (77%) rename test/{common_plat => }/validation/api/pool/pool.c (100%) rename test/{common_plat => }/validation/api/pool/pool.h (100%) rename test/{common_plat => }/validation/api/pool/pool_main.c (100%) rename test/{common_plat => }/validation/api/queue/.gitignore (100%) rename test/{common_plat => }/validation/api/queue/Makefile.am (77%) rename test/{common_plat => }/validation/api/queue/queue.c (100%) rename test/{common_plat => }/validation/api/queue/queue.h (100%) rename test/{common_plat => }/validation/api/queue/queue_main.c (100%) rename test/{common_plat => }/validation/api/random/.gitignore (100%) rename test/{common_plat => }/validation/api/random/Makefile.am (77%) rename test/{common_plat => }/validation/api/random/random.c (100%) rename test/{common_plat => }/validation/api/random/random.h (100%) rename test/{common_plat => }/validation/api/random/random_main.c (100%) rename test/{common_plat => }/validation/api/scheduler/.gitignore (100%) rename test/{common_plat => }/validation/api/scheduler/Makefile.am (78%) rename test/{common_plat => }/validation/api/scheduler/scheduler.c (100%) rename test/{common_plat => }/validation/api/scheduler/scheduler.h (100%) rename test/{common_plat => }/validation/api/scheduler/scheduler_main.c (100%) rename test/{common_plat => }/validation/api/shmem/.gitignore (100%) rename test/{common_plat => }/validation/api/shmem/Makefile.am (77%) rename test/{common_plat => }/validation/api/shmem/shmem.c (97%) rename test/{common_plat => }/validation/api/shmem/shmem.h (100%) rename test/{common_plat => }/validation/api/shmem/shmem_main.c (100%) rename test/{common_plat => }/validation/api/std_clib/.gitignore (100%) rename test/{common_plat => }/validation/api/std_clib/Makefile.am (77%) rename test/{common_plat => }/validation/api/std_clib/std_clib.c (100%) rename test/{common_plat => }/validation/api/std_clib/std_clib.h (100%) rename test/{common_plat => }/validation/api/std_clib/std_clib_main.c (100%) rename test/{common_plat => }/validation/api/system/.gitignore (100%) rename test/{common_plat => }/validation/api/system/Makefile.am (77%) rename test/{common_plat => }/validation/api/system/system.c (100%) rename test/{common_plat => }/validation/api/system/system.h (100%) rename test/{common_plat => }/validation/api/system/system_main.c (100%) rename test/{common_plat => }/validation/api/thread/.gitignore (100%) rename test/{common_plat => }/validation/api/thread/Makefile.am (84%) rename test/{common_plat => }/validation/api/thread/thread.c (100%) rename test/{common_plat => }/validation/api/thread/thread.h (100%) rename test/{common_plat => }/validation/api/thread/thread_main.c (100%) rename test/{common_plat => }/validation/api/time/.gitignore (100%) rename test/{common_plat => }/validation/api/time/Makefile.am (89%) rename test/{common_plat => }/validation/api/time/time.c (100%) rename test/{common_plat => }/validation/api/time/time.sh (93%) rename test/{common_plat => }/validation/api/time/time_main.c (100%) rename test/{common_plat => }/validation/api/time/time_test.h (100%) rename test/{common_plat => }/validation/api/timer/.gitignore (100%) rename test/{common_plat => }/validation/api/timer/Makefile.am (77%) rename test/{common_plat => }/validation/api/timer/timer.c (100%) rename test/{common_plat => }/validation/api/timer/timer.h (100%) rename test/{common_plat => }/validation/api/timer/timer_main.c (100%) rename test/{common_plat => }/validation/api/traffic_mngr/.gitignore (100%) rename test/{common_plat => }/validation/api/traffic_mngr/Makefile.am (89%) rename test/{common_plat => }/validation/api/traffic_mngr/traffic_mngr.c (100%) rename test/{common_plat => }/validation/api/traffic_mngr/traffic_mngr.h (100%) rename test/{common_plat => }/validation/api/traffic_mngr/traffic_mngr.sh (93%) rename test/{common_plat => }/validation/api/traffic_mngr/traffic_mngr_main.c (100%) rename test/{linux-generic/performance => validation/drv}/.gitignore (100%) rename test/{common_plat => }/validation/drv/Makefile.am (100%) create mode 100644 test/validation/drv/Makefile.inc rename test/{common_plat => }/validation/drv/README (100%) rename test/{common_plat => }/validation/drv/drvatomic/.gitignore (100%) rename test/{common_plat => }/validation/drv/drvatomic/Makefile.am (100%) rename test/{common_plat => }/validation/drv/drvatomic/drvatomic.c (100%) rename test/{common_plat => }/validation/drv/drvatomic/drvatomic.h (100%) rename test/{common_plat => }/validation/drv/drvatomic/drvatomic_main.c (100%) rename test/{common_plat => }/validation/drv/drvdriver/.gitignore (100%) rename test/{common_plat => }/validation/drv/drvdriver/Makefile.am (100%) rename test/{common_plat => }/validation/drv/drvdriver/drvdriver_device.c (100%) rename test/{common_plat => }/validation/drv/drvdriver/drvdriver_device.h (100%) rename test/{common_plat => }/validation/drv/drvdriver/drvdriver_device_main.c (100%) rename test/{common_plat => }/validation/drv/drvdriver/drvdriver_devio.c (100%) rename test/{common_plat => }/validation/drv/drvdriver/drvdriver_devio.h (100%) rename test/{common_plat => }/validation/drv/drvdriver/drvdriver_devio_main.c (100%) rename test/{common_plat => }/validation/drv/drvdriver/drvdriver_driver.c (100%) rename test/{common_plat => }/validation/drv/drvdriver/drvdriver_driver.h (100%) rename test/{common_plat => }/validation/drv/drvdriver/drvdriver_driver_main.c (100%) rename test/{common_plat => }/validation/drv/drvdriver/drvdriver_enumr.c (100%) rename test/{common_plat => }/validation/drv/drvdriver/drvdriver_enumr.h (100%) rename test/{common_plat => }/validation/drv/drvdriver/drvdriver_enumr_class.c (100%) rename test/{common_plat => }/validation/drv/drvdriver/drvdriver_enumr_class.h (100%) rename test/{common_plat => }/validation/drv/drvdriver/drvdriver_enumr_class_main.c (100%) rename test/{common_plat => }/validation/drv/drvdriver/drvdriver_enumr_main.c (100%) rename test/{common_plat => }/validation/drv/drvshmem/.gitignore (100%) rename test/{common_plat => }/validation/drv/drvshmem/Makefile.am (100%) rename test/{common_plat => }/validation/drv/drvshmem/drvshmem.c (100%) rename test/{common_plat => }/validation/drv/drvshmem/drvshmem.h (100%) rename test/{common_plat => }/validation/drv/drvshmem/drvshmem_main.c (100%)
hooks/post-receive