diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..fe555f8
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,3 @@
+*.c diff=cpp
+*.h diff=cpp
+*.py diff=python
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6df5ba0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,14 @@
+doc/guides/nics/overview_table.txt
+doc/guides/cryptodevs/overview_feature_table.txt
+doc/guides/cryptodevs/overview_cipher_table.txt
+doc/guides/cryptodevs/overview_auth_table.txt
+doc/guides/cryptodevs/overview_aead_table.txt
+cscope.out.po
+cscope.out.in
+cscope.out
+cscope.files
+GTAGS
+GPATH
+GRTAGS
+tags
+TAGS
diff --git a/GNUmakefile b/GNUmakefile
new file mode 100644
index 0000000..d07fef0
--- /dev/null
+++ b/GNUmakefile
@@ -0,0 +1,18 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2010-2015 Intel Corporation
+
+#
+# Head Makefile for compiling rte SDK
+#
+
+RTE_SDK := $(CURDIR)
+export RTE_SDK
+
+#
+# directory list
+#
+
+ROOTDIRS-y := buildtools lib drivers app
+ROOTDIRS- := test
+
+include $(RTE_SDK)/mk/rte.sdkroot.mk
diff --git a/MAINTAINERS b/MAINTAINERS
new file mode 100644
index 0000000..a646ca3
--- /dev/null
+++ b/MAINTAINERS
@@ -0,0 +1,1094 @@
+DPDK Maintainers
+================
+
+The intention of this file is to provide a set of names that we can rely on
+for helping in patch reviews and questions.
+These names are additional recipients for emails sent to dev@dpdk.org.
+Please avoid private emails.
+
+Descriptions of section entries:
+
+ M: Maintainer's Full Name
+ T: Git tree location.
+ F: Files and directories with wildcard patterns.
+ A trailing slash includes all files and subdirectory files.
+ A wildcard includes all files but not subdirectories.
+ One pattern per line. Multiple F: lines acceptable.
+ X: Files and directories exclusion, same rules as F:
+ K: Keyword regex pattern to match content.
+ One regex pattern per line. Multiple K: lines acceptable.
+
+
+General Project Administration
+------------------------------
+
+Main Branch
+M: Thomas Monjalon
+M: Ferruh Yigit
+T: git://dpdk.org/dpdk
+
+Stable Branches
+M: Yuanhan Liu
+M: Luca Boccassi
+T: git://dpdk.org/dpdk-stable
+
+Security Issues
+M: maintainers@dpdk.org
+
+Documentation (with overlaps)
+M: John McNamara
+M: Marko Kovacevic
+F: README
+F: doc/
+
+Developers and Maintainers Tools
+M: Thomas Monjalon
+F: MAINTAINERS
+F: devtools/check-dup-includes.sh
+F: devtools/check-maintainers.sh
+F: devtools/check-git-log.sh
+F: devtools/check-includes.sh
+F: devtools/checkpatches.sh
+F: devtools/get-maintainer.sh
+F: devtools/git-log-fixes.sh
+F: devtools/load-devel-config
+F: devtools/test-build.sh
+F: license/
+
+
+Build System
+------------
+M: Thomas Monjalon
+F: GNUmakefile
+F: Makefile
+F: config/
+F: mk/
+F: pkg/
+F: buildtools/auto-config-h.sh
+F: buildtools/gen-build-mk.sh
+F: buildtools/gen-config-h.sh
+F: buildtools/relpath.sh
+F: doc/build-sdk-quick.txt
+F: doc/guides/prog_guide/build_app.rst
+F: doc/guides/prog_guide/dev_kit_*
+F: doc/guides/prog_guide/ext_app_lib_make_help.rst
+
+Meson build
+M: Bruce Richardson
+F: meson.build
+F: lib/librte_eal/bsdapp/BSDmakefile.meson
+F: meson_options.txt
+F: config/rte_config.h
+F: buildtools/gen-pmdinfo-cfile.sh
+F: buildtools/symlink-drivers-solibs.sh
+
+ABI versioning
+M: Neil Horman
+F: lib/librte_compat/
+F: doc/guides/rel_notes/deprecation.rst
+F: devtools/validate-abi.sh
+F: buildtools/check-experimental-syms.sh
+
+Driver information
+M: Neil Horman
+F: buildtools/pmdinfogen/
+F: usertools/dpdk-pmdinfo.py
+F: doc/guides/tools/pmdinfo.rst
+
+
+Environment Abstraction Layer
+-----------------------------
+
+EAL API and common code
+F: lib/librte_eal/common/*
+F: lib/librte_eal/common/include/*
+F: lib/librte_eal/common/include/generic/
+F: lib/librte_eal/rte_eal_version.map
+F: doc/guides/prog_guide/env_abstraction_layer.rst
+F: test/test/test_alarm.c
+F: test/test/test_atomic.c
+F: test/test/test_barrier.c
+F: test/test/test_byteorder.c
+F: test/test/test_common.c
+F: test/test/test_cpuflags.c
+F: test/test/test_cycles.c
+F: test/test/test_debug.c
+F: test/test/test_devargs.c
+F: test/test/test_eal*
+F: test/test/test_errno.c
+F: test/test/test_interrupts.c
+F: test/test/test_logs.c
+F: test/test/test_memcpy*
+F: test/test/test_per_lcore.c
+F: test/test/test_prefetch.c
+F: test/test/test_reciprocal_division*
+F: test/test/test_rwlock.c
+F: test/test/test_spinlock.c
+F: test/test/test_string_fns.c
+F: test/test/test_tailq.c
+F: test/test/test_version.c
+
+Memory Allocation
+M: Anatoly Burakov
+F: lib/librte_eal/common/include/rte_mem*
+F: lib/librte_eal/common/include/rte_malloc.h
+F: lib/librte_eal/common/*malloc*
+F: lib/librte_eal/common/eal_common_mem*
+F: lib/librte_eal/common/eal_hugepages.h
+F: doc/guides/prog_guide/env_abstraction_layer.rst
+F: test/test/test_func_reentrancy.c
+F: test/test/test_malloc.c
+F: test/test/test_memory.c
+F: test/test/test_memzone.c
+
+Keep alive
+M: Remy Horton
+F: lib/librte_eal/common/include/rte_keepalive.h
+F: lib/librte_eal/common/rte_keepalive.c
+F: examples/l2fwd-keepalive/
+F: doc/guides/sample_app_ug/keep_alive.rst
+
+Secondary process
+M: Anatoly Burakov
+K: RTE_PROC_
+F: doc/guides/prog_guide/multi_proc_support.rst
+F: test/test/test_mp_secondary.c
+F: examples/multi_process/
+F: doc/guides/sample_app_ug/multi_process.rst
+
+Service Cores - EXPERIMENTAL
+M: Harry van Haaren
+F: lib/librte_eal/common/include/rte_service.h
+F: lib/librte_eal/common/include/rte_service_component.h
+F: lib/librte_eal/common/rte_service.c
+F: doc/guides/prog_guide/service_cores.rst
+F: test/test/test_service_cores.c
+
+Bitmap
+M: Cristian Dumitrescu
+F: lib/librte_eal/common/include/rte_bitmap.h
+F: test/test/test_bitmap.c
+
+ARM v7
+M: Jan Viktorin
+M: Jianbo Liu
+F: lib/librte_eal/common/arch/arm/
+F: lib/librte_eal/common/include/arch/arm/
+
+ARM v8
+M: Jerin Jacob
+M: Jianbo Liu
+F: lib/librte_eal/common/include/arch/arm/*_64.h
+F: lib/librte_net/net_crc_neon.h
+F: lib/librte_acl/acl_run_neon.*
+F: lib/librte_lpm/rte_lpm_neon.h
+F: lib/librte_hash/rte*_arm64.h
+F: lib/librte_efd/rte*_arm64.h
+F: lib/librte_table/rte*_arm64.h
+F: drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c
+F: drivers/net/i40e/i40e_rxtx_vec_neon.c
+F: drivers/net/virtio/virtio_rxtx_simple_neon.c
+
+IBM POWER
+M: Chao Zhu
+F: lib/librte_eal/common/arch/ppc_64/
+F: lib/librte_eal/common/include/arch/ppc_64/
+F: drivers/net/i40e/i40e_rxtx_vec_altivec.c
+F: examples/l3fwd/*altivec.h
+
+Intel x86
+M: Bruce Richardson
+M: Konstantin Ananyev
+F: lib/librte_eal/common/arch/x86/
+F: lib/librte_eal/common/include/arch/x86/
+
+Linux EAL (with overlaps)
+F: lib/librte_eal/linuxapp/Makefile
+F: lib/librte_eal/linuxapp/eal/
+F: doc/guides/linux_gsg/
+
+Linux UIO
+M: Ferruh Yigit
+F: lib/librte_eal/linuxapp/igb_uio/
+F: drivers/bus/pci/linux/*uio*
+
+Linux VFIO
+M: Anatoly Burakov
+F: lib/librte_eal/linuxapp/eal/*vfio*
+F: drivers/bus/pci/linux/*vfio*
+
+FreeBSD EAL (with overlaps)
+M: Bruce Richardson
+F: lib/librte_eal/bsdapp/Makefile
+F: lib/librte_eal/bsdapp/eal/
+F: doc/guides/freebsd_gsg/
+
+FreeBSD contigmem
+M: Bruce Richardson
+F: lib/librte_eal/bsdapp/contigmem/
+
+FreeBSD UIO
+M: Bruce Richardson
+F: lib/librte_eal/bsdapp/nic_uio/
+
+
+Core Libraries
+--------------
+
+Memory pool
+M: Olivier Matz
+F: lib/librte_mempool/
+F: drivers/mempool/Makefile
+F: drivers/mempool/ring/
+F: drivers/mempool/stack/
+F: doc/guides/prog_guide/mempool_lib.rst
+F: test/test/test_mempool*
+F: test/test/test_func_reentrancy.c
+
+Ring queue
+M: Olivier Matz
+F: lib/librte_ring/
+F: doc/guides/prog_guide/ring_lib.rst
+F: test/test/test_ring*
+F: test/test/test_func_reentrancy.c
+
+Packet buffer
+M: Olivier Matz
+F: lib/librte_mbuf/
+F: doc/guides/prog_guide/mbuf_lib.rst
+F: test/test/test_mbuf.c
+
+Ethernet API
+M: Thomas Monjalon
+T: git://dpdk.org/next/dpdk-next-net
+F: lib/librte_ether/
+F: devtools/test-null.sh
+
+Flow API
+M: Adrien Mazarguil
+T: git://dpdk.org/next/dpdk-next-net
+F: lib/librte_ether/rte_flow*
+
+Traffic Management API - EXPERIMENTAL
+M: Cristian Dumitrescu
+T: git://dpdk.org/next/dpdk-next-tm
+F: lib/librte_ether/rte_tm*
+
+Traffic Metering and Policing API - EXPERIMENTAL
+M: Cristian Dumitrescu
+F: lib/librte_ether/rte_mtr*
+
+Baseband API - EXPERIMENTAL
+M: Amr Mokhtar
+F: lib/librte_bbdev/
+F: doc/guides/prog_guide/bbdev.rst
+F: drivers/bbdev/
+F: doc/guides/bbdevs/
+F: app/test-bbdev/
+F: doc/guides/tools/testbbdev.rst
+F: examples/bbdev_app/
+F: doc/guides/sample_app_ug/bbdev_app.rst
+
+Crypto API
+M: Pablo de Lara
+M: Declan Doherty
+T: git://dpdk.org/next/dpdk-next-crypto
+F: lib/librte_cryptodev/
+F: test/test/test_cryptodev*
+F: examples/l2fwd-crypto/
+
+Security API - EXPERIMENTAL
+M: Akhil Goyal
+M: Declan Doherty
+F: lib/librte_security/
+F: doc/guides/prog_guide/rte_security.rst
+
+Eventdev API
+M: Jerin Jacob
+T: git://dpdk.org/next/dpdk-next-eventdev
+F: lib/librte_eventdev/
+F: drivers/event/skeleton/
+F: test/test/test_eventdev.c
+
+Eventdev Ethdev Rx Adapter API - EXPERIMENTAL
+M: Nikhil Rao
+T: git://dpdk.org/next/dpdk-next-eventdev
+F: lib/librte_eventdev/*eth_rx_adapter*
+F: test/test/test_event_eth_rx_adapter.c
+F: doc/guides/prog_guide/event_ethernet_rx_adapter.rst
+
+Raw device API - EXPERIMENTAL
+M: Shreyansh Jain
+M: Hemant Agrawal
+F: lib/librte_rawdev/
+F: drivers/raw/skeleton_rawdev/
+F: test/test/test_rawdev.c
+F: doc/guides/prog_guide/rawdev.rst
+
+
+Bus Drivers
+-----------
+
+NXP buses
+M: Hemant Agrawal
+M: Shreyansh Jain
+F: drivers/bus/dpaa/
+F: drivers/bus/fslmc/
+
+PCI bus driver
+F: drivers/bus/pci/
+
+VDEV bus driver
+M: Jianfeng Tan
+F: drivers/bus/vdev/
+
+
+Networking Drivers
+------------------
+M: Ferruh Yigit
+T: git://dpdk.org/next/dpdk-next-net
+F: doc/guides/nics/features/default.ini
+
+Link bonding
+M: Declan Doherty
+F: drivers/net/bonding/
+F: doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.rst
+F: test/test/test_link_bonding*
+F: examples/bond/
+F: doc/guides/nics/features/bonding.ini
+
+Linux KNI
+M: Ferruh Yigit
+F: lib/librte_eal/linuxapp/kni/
+F: lib/librte_kni/
+F: doc/guides/prog_guide/kernel_nic_interface.rst
+F: test/test/test_kni.c
+F: examples/kni/
+F: doc/guides/sample_app_ug/kernel_nic_interface.rst
+
+Linux AF_PACKET
+M: John W. Linville
+F: drivers/net/af_packet/
+F: doc/guides/nics/features/afpacket.ini
+
+Amazon ENA
+M: Marcin Wojtas
+M: Michal Krawczyk
+M: Guy Tzalik
+M: Evgeny Schemeilin
+F: drivers/net/ena/
+F: doc/guides/nics/ena.rst
+F: doc/guides/nics/features/ena.ini
+
+Atomic Rules ARK
+M: Shepard Siegel
+M: Ed Czeck
+M: John Miller
+F: drivers/net/ark/
+F: doc/guides/nics/ark.rst
+F: doc/guides/nics/features/ark.ini
+
+Broadcom bnxt
+M: Ajit Khaparde
+M: Somnath Kotur
+F: drivers/net/bnxt/
+F: doc/guides/nics/bnxt.rst
+F: doc/guides/nics/features/bnxt.ini
+
+Cavium ThunderX nicvf
+M: Jerin Jacob
+M: Maciej Czekaj
+F: drivers/net/thunderx/
+F: doc/guides/nics/thunderx.rst
+F: doc/guides/nics/features/thunderx.ini
+
+Cavium LiquidIO
+M: Shijith Thotton
+M: Srisivasubramanian Srinivasan
+F: drivers/net/liquidio/
+F: doc/guides/nics/liquidio.rst
+F: doc/guides/nics/features/liquidio.ini
+
+Cavium OcteonTX
+M: Santosh Shukla
+M: Jerin Jacob
+F: drivers/mempool/octeontx/
+F: drivers/net/octeontx/
+F: doc/guides/nics/octeontx.rst
+F: doc/guides/nics/features/octeontx.ini
+
+Chelsio cxgbe
+M: Rahul Lakkireddy
+F: drivers/net/cxgbe/
+F: doc/guides/nics/cxgbe.rst
+F: doc/guides/nics/features/cxgbe.ini
+
+Cisco enic
+M: John Daley
+M: Hyong Youb Kim
+F: drivers/net/enic/
+F: doc/guides/nics/enic.rst
+F: doc/guides/nics/features/enic.ini
+
+Intel e1000
+M: Wenzhuo Lu
+T: git://dpdk.org/next/dpdk-next-net-intel
+F: drivers/net/e1000/
+F: doc/guides/nics/e1000em.rst
+F: doc/guides/nics/intel_vf.rst
+F: doc/guides/nics/features/e1000.ini
+F: doc/guides/nics/features/igb*.ini
+
+Intel ixgbe
+M: Wenzhuo Lu
+M: Konstantin Ananyev
+T: git://dpdk.org/next/dpdk-next-net-intel
+F: drivers/net/ixgbe/
+F: doc/guides/nics/ixgbe.rst
+F: doc/guides/nics/intel_vf.rst
+F: doc/guides/nics/features/ixgbe*.ini
+
+Intel i40e
+M: Beilei Xing
+M: Qi Zhang
+T: git://dpdk.org/next/dpdk-next-net-intel
+F: drivers/net/i40e/
+F: doc/guides/nics/i40e.rst
+F: doc/guides/nics/intel_vf.rst
+F: doc/guides/nics/features/i40e*.ini
+
+Intel fm10k
+M: Qi Zhang
+M: Xiao Wang
+T: git://dpdk.org/next/dpdk-next-net-intel
+F: drivers/net/fm10k/
+F: doc/guides/nics/features/fm10k*.ini
+
+Intel avf
+M: Jingjing Wu
+M: Wenzhuo Lu
+F: drivers/net/avf/
+F: doc/guides/nics/features/avf*.ini
+
+Mellanox mlx4
+M: Adrien Mazarguil
+T: git://dpdk.org/next/dpdk-next-net-mlx
+F: drivers/net/mlx4/
+F: doc/guides/nics/mlx4.rst
+F: doc/guides/nics/features/mlx4.ini
+
+Mellanox mlx5
+M: Adrien Mazarguil
+M: Nelio Laranjeiro
+M: Yongseok Koh
+T: git://dpdk.org/next/dpdk-next-net-mlx
+F: drivers/net/mlx5/
+F: doc/guides/nics/mlx5.rst
+F: doc/guides/nics/features/mlx5.ini
+
+Marvell mrvl
+M: Jacek Siuda
+M: Tomasz Duszynski
+M: Dmitri Epshtein
+M: Natalie Samsonov
+M: Jianbo Liu
+F: drivers/net/mrvl/
+F: doc/guides/nics/mrvl.rst
+F: doc/guides/nics/features/mrvl.ini
+
+Microsoft vdev_netvsc - EXPERIMENTAL
+M: Matan Azrad
+F: drivers/net/vdev_netvsc/
+F: doc/guides/nics/vdev_netvsc.rst
+F: doc/guides/nics/features/vdev_netvsc.ini
+
+Netcope szedata2
+M: Matej Vido
+F: drivers/net/szedata2/
+F: doc/guides/nics/szedata2.rst
+F: doc/guides/nics/features/szedata2.ini
+
+Netronome nfp
+M: Alejandro Lucero
+F: drivers/net/nfp/
+F: doc/guides/nics/nfp.rst
+F: doc/guides/nics/features/nfp*.ini
+
+NXP dpaa
+M: Hemant Agrawal
+M: Shreyansh Jain
+F: drivers/mempool/dpaa/
+F: drivers/net/dpaa/
+F: doc/guides/nics/dpaa.rst
+F: doc/guides/nics/features/dpaa.ini
+
+NXP dpaa2
+M: Hemant Agrawal
+M: Shreyansh Jain
+F: drivers/mempool/dpaa2/
+F: drivers/net/dpaa2/
+F: doc/guides/nics/dpaa2.rst
+F: doc/guides/nics/features/dpaa2.ini
+
+QLogic bnx2x
+M: Harish Patil
+M: Rasesh Mody
+F: drivers/net/bnx2x/
+F: doc/guides/nics/bnx2x.rst
+F: doc/guides/nics/features/bnx2x*.ini
+
+QLogic qede PMD
+M: Rasesh Mody
+M: Harish Patil
+M: Shahed Shaikh
+F: drivers/net/qede/
+F: doc/guides/nics/qede.rst
+F: doc/guides/nics/features/qede*.ini
+
+Solarflare sfc_efx
+M: Andrew Rybchenko
+F: drivers/net/sfc/
+F: doc/guides/nics/sfc_efx.rst
+F: doc/guides/nics/features/sfc_efx.ini
+
+VMware vmxnet3
+M: Shrikrishna Khare
+F: drivers/net/vmxnet3/
+F: doc/guides/nics/vmxnet3.rst
+F: doc/guides/nics/features/vmxnet3.ini
+
+Vhost-user
+M: Yuanhan Liu
+M: Maxime Coquelin
+T: git://dpdk.org/next/dpdk-next-virtio
+F: lib/librte_vhost/
+F: doc/guides/prog_guide/vhost_lib.rst
+F: examples/vhost/
+F: doc/guides/sample_app_ug/vhost.rst
+F: examples/vhost_scsi/
+F: doc/guides/sample_app_ug/vhost_scsi.rst
+
+Vhost PMD
+M: Tetsuya Mukawa
+M: Yuanhan Liu
+M: Maxime Coquelin
+T: git://dpdk.org/next/dpdk-next-virtio
+F: drivers/net/vhost/
+F: doc/guides/nics/features/vhost.ini
+
+Virtio PMD
+M: Yuanhan Liu
+M: Maxime Coquelin
+M: Tiwei Bie
+T: git://dpdk.org/next/dpdk-next-virtio
+F: drivers/net/virtio/
+F: doc/guides/nics/virtio.rst
+F: doc/guides/nics/features/virtio*.ini
+
+Wind River AVP
+M: Allain Legacy
+M: Matt Peters
+F: drivers/net/avp/
+F: doc/guides/nics/avp.rst
+F: doc/guides/nics/features/avp.ini
+
+PCAP PMD
+M: Ferruh Yigit
+F: drivers/net/pcap/
+F: doc/guides/nics/pcap_ring.rst
+F: doc/guides/nics/features/pcap.ini
+
+Tap PMD
+M: Pascal Mazon
+F: drivers/net/tap/
+F: doc/guides/nics/tap.rst
+F: doc/guides/nics/features/tap.ini
+
+KNI PMD
+M: Ferruh Yigit
+F: drivers/net/kni/
+F: doc/guides/nics/kni.rst
+F: doc/guides/nics/features/kni.ini
+
+Ring PMD
+M: Bruce Richardson
+F: drivers/net/ring/
+F: doc/guides/nics/pcap_ring.rst
+F: test/test/test_pmd_ring.c
+F: test/test/test_pmd_ring_perf.c
+F: doc/guides/nics/features/ring.ini
+
+Null Networking PMD
+M: Tetsuya Mukawa
+F: drivers/net/null/
+F: doc/guides/nics/features/null.ini
+
+Fail-safe PMD
+M: Gaetan Rivet
+F: drivers/net/failsafe/
+F: doc/guides/nics/fail_safe.rst
+
+Softnic PMD
+M: Jasvinder Singh
+M: Cristian Dumitrescu
+F: drivers/net/softnic/
+
+
+Crypto Drivers
+--------------
+M: Pablo de Lara
+T: git://dpdk.org/next/dpdk-next-crypto
+F: doc/guides/cryptodevs/features/default.ini
+
+ARMv8 Crypto
+M: Jerin Jacob
+F: drivers/crypto/armv8/
+F: doc/guides/cryptodevs/armv8.rst
+F: doc/guides/cryptodevs/features/armv8.ini
+
+Crypto Scheduler
+M: Fan Zhang
+F: drivers/crypto/scheduler/
+F: doc/guides/cryptodevs/scheduler.rst
+
+Intel AES-NI GCM
+M: Declan Doherty
+F: drivers/crypto/aesni_gcm/
+F: doc/guides/cryptodevs/aesni_gcm.rst
+F: doc/guides/cryptodevs/features/aesni_gcm.ini
+
+Intel AES-NI Multi-Buffer
+M: Declan Doherty
+F: drivers/crypto/aesni_mb/
+F: doc/guides/cryptodevs/aesni_mb.rst
+F: doc/guides/cryptodevs/features/aesni_mb.ini
+
+Intel QuickAssist
+M: John Griffin
+M: Fiona Trahe
+M: Deepak Kumar Jain
+F: drivers/crypto/qat/
+F: doc/guides/cryptodevs/qat.rst
+F: doc/guides/cryptodevs/features/qat.ini
+
+KASUMI
+M: Pablo de Lara
+F: drivers/crypto/kasumi/
+F: doc/guides/cryptodevs/kasumi.rst
+F: doc/guides/cryptodevs/features/kasumi.ini
+
+Marvell Mrvl
+M: Jacek Siuda
+M: Tomasz Duszynski
+M: Dmitri Epshtein
+M: Natalie Samsonov
+M: Jianbo Liu
+F: drivers/crypto/mrvl/
+F: doc/guides/cryptodevs/mrvl.rst
+F: doc/guides/cryptodevs/features/mrvl.ini
+
+Null Crypto
+M: Declan Doherty
+F: drivers/crypto/null/
+F: doc/guides/cryptodevs/null.rst
+F: doc/guides/cryptodevs/features/null.ini
+
+NXP DPAA_SEC
+M: Akhil Goyal
+M: Hemant Agrawal
+F: drivers/crypto/dpaa_sec/
+F: doc/guides/cryptodevs/dpaa_sec.rst
+F: doc/guides/cryptodevs/features/dpaa_sec.ini
+
+NXP DPAA2_SEC
+M: Akhil Goyal
+M: Hemant Agrawal
+F: drivers/crypto/dpaa2_sec/
+F: doc/guides/cryptodevs/dpaa2_sec.rst
+F: doc/guides/cryptodevs/features/dpaa2_sec.ini
+
+OpenSSL
+M: Declan Doherty
+F: drivers/crypto/openssl/
+F: doc/guides/cryptodevs/openssl.rst
+F: doc/guides/cryptodevs/features/openssl.ini
+
+SNOW 3G
+M: Pablo de Lara
+F: drivers/crypto/snow3g/
+F: doc/guides/cryptodevs/snow3g.rst
+F: doc/guides/cryptodevs/features/snow3g.ini
+
+ZUC
+M: Pablo de Lara
+F: drivers/crypto/zuc/
+F: doc/guides/cryptodevs/zuc.rst
+F: doc/guides/cryptodevs/features/zuc.ini
+
+
+Eventdev Drivers
+----------------
+M: Jerin Jacob
+T: git://dpdk.org/next/dpdk-next-eventdev
+
+Cavium OCTEONTX ssovf
+M: Jerin Jacob
+M: Santosh Shukla
+F: drivers/event/octeontx/
+F: doc/guides/eventdevs/octeontx.rst
+
+NXP DPAA2 eventdev
+M: Hemant Agrawal
+M: Nipun Gupta
+F: drivers/event/dpaa2/
+F: doc/guides/eventdevs/dpaa2.rst
+
+NXP DPAA eventdev
+M: Hemant Agrawal
+M: Sunil Kumar Kori
+F: drivers/event/dpaa/
+F: doc/guides/eventdevs/dpaa.rst
+
+Software Eventdev PMD
+M: Harry van Haaren
+F: drivers/event/sw/
+F: doc/guides/eventdevs/sw.rst
+F: examples/eventdev_pipeline/
+F: doc/guides/sample_app_ug/eventdev_pipeline.rst
+
+Software OPDL Eventdev PMD
+M: Liang Ma
+M: Peter Mccarthy
+F: drivers/event/opdl/
+F: doc/guides/eventdevs/opdl.rst
+
+
+Packet processing
+-----------------
+
+Network headers
+M: Olivier Matz
+F: lib/librte_net/
+
+Packet CRC
+M: Jasvinder Singh
+F: lib/librte_net/rte_net_crc*
+F: lib/librte_net/net_crc_sse.h
+F: test/test/test_crc.c
+
+IP fragmentation & reassembly
+M: Konstantin Ananyev
+F: lib/librte_ip_frag/
+F: doc/guides/prog_guide/ip_fragment_reassembly_lib.rst
+F: examples/ip_fragmentation/
+F: doc/guides/sample_app_ug/ip_frag.rst
+F: examples/ip_reassembly/
+F: doc/guides/sample_app_ug/ip_reassembly.rst
+
+Generic Receive Offload - EXPERIMENTAL
+M: Jiayu Hu
+F: lib/librte_gro/
+F: doc/guides/prog_guide/generic_receive_offload_lib.rst
+
+Generic Segmentation Offload
+M: Jiayu Hu
+M: Mark Kavanagh
+F: lib/librte_gso/
+F: doc/guides/prog_guide/generic_segmentation_offload_lib.rst
+
+Flow Classify - EXPERIMENTAL
+M: Bernard Iremonger
+F: lib/librte_flow_classify/
+F: test/test/test_flow_classify*
+F: doc/guides/prog_guide/flow_classify_lib.rst
+F: examples/flow_classify/
+F: doc/guides/sample_app_ug/flow_classify.rst
+
+Distributor
+M: Bruce Richardson
+M: David Hunt
+F: lib/librte_distributor/
+F: doc/guides/prog_guide/packet_distrib_lib.rst
+F: test/test/test_distributor*
+F: examples/distributor/
+F: doc/guides/sample_app_ug/dist_app.rst
+
+Reorder
+M: Reshma Pattan
+F: lib/librte_reorder/
+F: doc/guides/prog_guide/reorder_lib.rst
+F: test/test/test_reorder*
+F: examples/packet_ordering/
+F: doc/guides/sample_app_ug/packet_ordering.rst
+
+Hierarchical scheduler
+M: Cristian Dumitrescu
+F: lib/librte_sched/
+F: doc/guides/prog_guide/qos_framework.rst
+F: test/test/test_red.c
+F: test/test/test_sched.c
+F: examples/qos_sched/
+F: doc/guides/sample_app_ug/qos_scheduler.rst
+
+Packet capture
+M: Reshma Pattan
+F: lib/librte_pdump/
+F: doc/guides/prog_guide/pdump_lib.rst
+F: app/pdump/
+F: doc/guides/tools/pdump.rst
+
+Packet Framework
+----------------
+M: Cristian Dumitrescu
+F: lib/librte_pipeline/
+F: lib/librte_port/
+F: lib/librte_table/
+F: doc/guides/prog_guide/packet_framework.rst
+F: test/test/test_table*
+F: test/test-pipeline/
+F: doc/guides/sample_app_ug/test_pipeline.rst
+F: examples/ip_pipeline/
+F: doc/guides/sample_app_ug/ip_pipeline.rst
+
+
+Algorithms
+----------
+
+ACL
+M: Konstantin Ananyev
+F: lib/librte_acl/
+F: doc/guides/prog_guide/packet_classif_access_ctrl.rst
+F: test/test-acl/
+F: test/test/test_acl.*
+F: examples/l3fwd-acl/
+F: doc/guides/sample_app_ug/l3_forward_access_ctrl.rst
+
+EFD
+M: Byron Marohn
+M: Pablo de Lara Guarch
+F: lib/librte_efd/
+F: doc/guides/prog_guide/efd_lib.rst
+F: test/test/test_efd*
+F: examples/server_node_efd/
+F: doc/guides/sample_app_ug/server_node_efd.rst
+
+Hashes
+M: Bruce Richardson
+M: Pablo de Lara
+F: lib/librte_hash/
+F: doc/guides/prog_guide/hash_lib.rst
+F: test/test/test_*hash*
+F: test/test/test_func_reentrancy.c
+
+LPM
+M: Bruce Richardson
+F: lib/librte_lpm/
+F: doc/guides/prog_guide/lpm*
+F: test/test/test_lpm*
+F: test/test/test_func_reentrancy.c
+F: test/test/test_xmmt_ops.h
+
+Membership - EXPERIMENTAL
+M: Yipeng Wang
+M: Sameh Gobriel
+F: lib/librte_member/
+F: doc/guides/prog_guide/member_lib.rst
+F: test/test/test_member*
+
+Traffic metering
+M: Cristian Dumitrescu
+F: lib/librte_meter/
+F: doc/guides/sample_app_ug/qos_scheduler.rst
+F: test/test/test_meter.c
+F: examples/qos_meter/
+F: doc/guides/sample_app_ug/qos_metering.rst
+
+Other libraries
+---------------
+
+Configuration file
+M: Cristian Dumitrescu
+F: lib/librte_cfgfile/
+F: test/test/test_cfgfile.c
+F: test/test/test_cfgfiles/
+
+Interactive command line
+M: Olivier Matz
+F: lib/librte_cmdline/
+F: test/cmdline_test/
+F: test/test/test_cmdline*
+F: examples/cmdline/
+F: doc/guides/sample_app_ug/cmd_line.rst
+
+Key/Value parsing
+M: Olivier Matz
+F: lib/librte_kvargs/
+F: test/test/test_kvargs.c
+
+PCI
+M: Gaetan Rivet
+F: lib/librte_pci/
+
+Power management
+M: David Hunt
+F: lib/librte_power/
+F: doc/guides/prog_guide/power_man.rst
+F: test/test/test_power*
+F: examples/l3fwd-power/
+F: doc/guides/sample_app_ug/l3_forward_power_man.rst
+F: examples/vm_power_manager/
+F: doc/guides/sample_app_ug/vm_power_management.rst
+
+Timers
+M: Robert Sanford
+F: lib/librte_timer/
+F: doc/guides/prog_guide/timer_lib.rst
+F: test/test/test_timer*
+F: examples/timer/
+F: doc/guides/sample_app_ug/timer.rst
+
+Job statistics
+M: Pablo de Lara
+F: lib/librte_jobstats/
+F: examples/l2fwd-jobstats/
+F: doc/guides/sample_app_ug/l2_forward_job_stats.rst
+
+Metrics
+M: Remy Horton
+F: lib/librte_metrics/
+
+Bit-rate statistics
+M: Remy Horton
+F: lib/librte_bitratestats/
+
+Latency statistics
+M: Reshma Pattan
+F: lib/librte_latencystats/
+
+
+Test Applications
+-----------------
+
+Unit tests framework
+F: test/Makefile
+F: test/test/Makefile
+F: test/test/autotest*
+F: test/test/commands.c
+F: test/test/packet_burst_generator.c
+F: test/test/packet_burst_generator.h
+F: test/test/process.h
+F: test/test/resource.*
+F: test/test/test.c
+F: test/test/test.h
+F: test/test/test_pmd_perf.c
+F: test/test/test_resource.c
+F: test/test/virtual_pmd.c
+F: test/test/virtual_pmd.h
+
+Driver testing tool
+M: Wenzhuo Lu
+M: Jingjing Wu
+F: app/test-pmd/
+F: doc/guides/testpmd_app_ug/
+
+Crypto performance test application
+M: Declan Doherty
+F: app/test-crypto-perf/
+F: doc/guides/tools/cryptoperf.rst
+
+Eventdev test application
+M: Jerin Jacob
+F: app/test-eventdev/
+F: doc/guides/tools/testeventdev.rst
+F: doc/guides/tools/img/eventdev_*
+F: test/test/test_event_ring.c
+
+Procinfo tool
+M: Maryam Tahhan
+M: Reshma Pattan
+F: app/proc_info/
+F: doc/guides/tools/proc_info.rst
+
+
+Other Example Applications
+--------------------------
+
+M: Remy Horton
+F: examples/ethtool/
+F: doc/guides/sample_app_ug/ethtool.rst
+
+F: examples/exception_path/
+F: doc/guides/sample_app_ug/exception_path.rst
+
+M: Ori Kam
+F: examples/flow_filtering/
+F: doc/guides/sample_app_ug/flow_filtering.rst
+
+M: Bruce Richardson
+M: Pablo de Lara
+F: examples/helloworld/
+F: doc/guides/sample_app_ug/hello_world.rst
+
+M: Radu Nicolau
+M: Akhil Goyal
+F: examples/ipsec-secgw/
+F: doc/guides/sample_app_ug/ipsec_secgw.rst
+
+F: examples/ipv4_multicast/
+F: doc/guides/sample_app_ug/ipv4_multicast.rst
+
+M: Bruce Richardson
+M: Pablo de Lara
+F: examples/l2fwd/
+F: doc/guides/sample_app_ug/l2_forward_real_virtual.rst
+
+M: Tomasz Kantecki
+F: doc/guides/sample_app_ug/l2_forward_cat.rst
+F: examples/l2fwd-cat/
+
+F: examples/l3fwd/
+F: doc/guides/sample_app_ug/l3_forward.rst
+
+F: examples/l3fwd-vf/
+F: doc/guides/sample_app_ug/l3_forward_virtual.rst
+
+F: examples/link_status_interrupt/
+F: doc/guides/sample_app_ug/link_status_intr.rst
+
+F: examples/load_balancer/
+F: doc/guides/sample_app_ug/load_balancer.rst
+
+F: examples/netmap_compat/
+F: doc/guides/sample_app_ug/netmap_compatibility.rst
+
+L-threads - EXPERIMENTAL
+M: John McNamara
+F: examples/performance-thread/
+F: doc/guides/sample_app_ug/performance_thread.rst
+
+M: Pablo de Lara
+F: examples/ptpclient/
+
+F: examples/quota_watermark/
+F: doc/guides/sample_app_ug/quota_watermark.rst
+
+M: Bruce Richardson
+M: John McNamara
+F: examples/rxtx_callbacks/
+F: doc/guides/sample_app_ug/rxtx_callbacks.rst
+
+M: Harry van Haaren
+F: examples/service_cores/
+F: doc/guides/sample_app_ug/service_cores.rst
+
+M: Bruce Richardson
+M: John McNamara
+F: examples/skeleton/
+F: doc/guides/sample_app_ug/skeleton.rst
+
+M: Jijiang Liu
+F: examples/tep_termination/
+
+F: examples/vmdq/
+F: examples/vmdq_dcb/
+F: doc/guides/sample_app_ug/vmdq_dcb_forwarding.rst
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..6cd70a0
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2010-2014 Intel Corporation
+
+.error Error please compile using GNU Make (gmake)
+
diff --git a/README b/README
new file mode 100644
index 0000000..55df158
--- /dev/null
+++ b/README
@@ -0,0 +1,11 @@
+DPDK is a set of libraries and drivers for fast packet processing.
+It supports many processor architectures and both FreeBSD and Linux.
+
+The DPDK uses the Open Source BSD-3-Clause license for the core libraries
+and drivers. The kernel components are GPL-2.0 licensed.
+
+Please check the doc directory for release notes,
+API documentation, and sample application information.
+
+For questions and usage discussions, subscribe to: users@dpdk.org
+Report bugs and issues to the development mailing list: dev@dpdk.org
diff --git a/app/Makefile b/app/Makefile
new file mode 100644
index 0000000..0eaed53
--- /dev/null
+++ b/app/Makefile
@@ -0,0 +1,22 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2010-2014 Intel Corporation
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+DIRS-$(CONFIG_RTE_TEST_PMD) += test-pmd
+DIRS-$(CONFIG_RTE_PROC_INFO) += proc_info
+DIRS-$(CONFIG_RTE_LIBRTE_PDUMP) += pdump
+
+ifeq ($(CONFIG_RTE_LIBRTE_BBDEV),y)
+DIRS-$(CONFIG_RTE_TEST_BBDEV) += test-bbdev
+endif
+
+ifeq ($(CONFIG_RTE_LIBRTE_CRYPTODEV),y)
+DIRS-$(CONFIG_RTE_APP_CRYPTO_PERF) += test-crypto-perf
+endif
+
+ifeq ($(CONFIG_RTE_LIBRTE_EVENTDEV),y)
+DIRS-$(CONFIG_RTE_APP_EVENTDEV) += test-eventdev
+endif
+
+include $(RTE_SDK)/mk/rte.subdir.mk
diff --git a/app/meson.build b/app/meson.build
new file mode 100644
index 0000000..0088de4
--- /dev/null
+++ b/app/meson.build
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2017 Intel Corporation
+
+subdir('test-pmd')
+subdir('test-eventdev')
diff --git a/app/pdump/Makefile b/app/pdump/Makefile
new file mode 100644
index 0000000..bd3c208
--- /dev/null
+++ b/app/pdump/Makefile
@@ -0,0 +1,19 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2016 Intel Corporation
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+ifeq ($(CONFIG_RTE_LIBRTE_PDUMP),y)
+
+APP = dpdk-pdump
+
+CFLAGS += -DALLOW_EXPERIMENTAL_API
+CFLAGS += $(WERROR_FLAGS)
+
+# all source are stored in SRCS-y
+
+SRCS-y := main.c
+
+include $(RTE_SDK)/mk/rte.app.mk
+
+endif
diff --git a/app/pdump/main.c b/app/pdump/main.c
new file mode 100644
index 0000000..c851d5b
--- /dev/null
+++ b/app/pdump/main.c
@@ -0,0 +1,889 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2016 Intel Corporation
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#define CMD_LINE_OPT_PDUMP "pdump"
+#define PDUMP_PORT_ARG "port"
+#define PDUMP_PCI_ARG "device_id"
+#define PDUMP_QUEUE_ARG "queue"
+#define PDUMP_DIR_ARG "dir"
+#define PDUMP_RX_DEV_ARG "rx-dev"
+#define PDUMP_TX_DEV_ARG "tx-dev"
+#define PDUMP_RING_SIZE_ARG "ring-size"
+#define PDUMP_MSIZE_ARG "mbuf-size"
+#define PDUMP_NUM_MBUFS_ARG "total-num-mbufs"
+#define CMD_LINE_OPT_SER_SOCK_PATH "server-socket-path"
+#define CMD_LINE_OPT_CLI_SOCK_PATH "client-socket-path"
+
+#define VDEV_PCAP "net_pcap_%s_%d,tx_pcap=%s"
+#define VDEV_IFACE "net_pcap_%s_%d,tx_iface=%s"
+#define TX_STREAM_SIZE 64
+
+#define MP_NAME "pdump_pool_%d"
+
+#define RX_RING "rx_ring_%d"
+#define TX_RING "tx_ring_%d"
+
+#define RX_STR "rx"
+#define TX_STR "tx"
+
+/* Maximum long option length for option parsing. */
+#define APP_ARG_TCPDUMP_MAX_TUPLES 54
+#define MBUF_POOL_CACHE_SIZE 250
+#define TX_DESC_PER_QUEUE 512
+#define RX_DESC_PER_QUEUE 128
+#define MBUFS_PER_POOL 65535
+#define MAX_LONG_OPT_SZ 64
+#define RING_SIZE 16384
+#define SIZE 256
+#define BURST_SIZE 32
+#define NUM_VDEVS 2
+
+/* true if x is a power of 2 */
+#define POWEROF2(x) ((((x)-1) & (x)) == 0)
+
+enum pdump_en_dis {
+ DISABLE = 1,
+ ENABLE = 2
+};
+
+enum pcap_stream {
+ IFACE = 1,
+ PCAP = 2
+};
+
+enum pdump_by {
+ PORT_ID = 1,
+ DEVICE_ID = 2
+};
+
+const char *valid_pdump_arguments[] = {
+ PDUMP_PORT_ARG,
+ PDUMP_PCI_ARG,
+ PDUMP_QUEUE_ARG,
+ PDUMP_DIR_ARG,
+ PDUMP_RX_DEV_ARG,
+ PDUMP_TX_DEV_ARG,
+ PDUMP_RING_SIZE_ARG,
+ PDUMP_MSIZE_ARG,
+ PDUMP_NUM_MBUFS_ARG,
+ NULL
+};
+
+struct pdump_stats {
+ uint64_t dequeue_pkts;
+ uint64_t tx_pkts;
+ uint64_t freed_pkts;
+};
+
+struct pdump_tuples {
+ /* cli params */
+ uint16_t port;
+ char *device_id;
+ uint16_t queue;
+ char rx_dev[TX_STREAM_SIZE];
+ char tx_dev[TX_STREAM_SIZE];
+ uint32_t ring_size;
+ uint16_t mbuf_data_size;
+ uint32_t total_num_mbufs;
+
+ /* params for library API call */
+ uint32_t dir;
+ struct rte_mempool *mp;
+ struct rte_ring *rx_ring;
+ struct rte_ring *tx_ring;
+
+ /* params for packet dumping */
+ enum pdump_by dump_by_type;
+ int rx_vdev_id;
+ int tx_vdev_id;
+ enum pcap_stream rx_vdev_stream_type;
+ enum pcap_stream tx_vdev_stream_type;
+ bool single_pdump_dev;
+
+ /* stats */
+ struct pdump_stats stats;
+} __rte_cache_aligned;
+static struct pdump_tuples pdump_t[APP_ARG_TCPDUMP_MAX_TUPLES];
+
+struct parse_val {
+ uint64_t min;
+ uint64_t max;
+ uint64_t val;
+};
+
+int num_tuples;
+static struct rte_eth_conf port_conf_default;
+volatile uint8_t quit_signal;
+static char server_socket_path[PATH_MAX];
+static char client_socket_path[PATH_MAX];
+
+/**< display usage */
+static void
+pdump_usage(const char *prgname)
+{
+ printf("usage: %s [EAL options] -- --pdump "
+ "'(port= | device_id=),"
+ "(queue=),"
+ "(rx-dev= |"
+ " tx-dev=,"
+ "[ring-size=default:16384],"
+ "[mbuf-size=default:2176],"
+ "[total-num-mbufs=default:65535]'\n"
+ "[--server-socket-path="
+ "default:/var/run/.dpdk/ (or) ~/.dpdk/]\n"
+ "[--client-socket-path="
+ "default:/var/run/.dpdk/ (or) ~/.dpdk/]\n",
+ prgname);
+}
+
+static int
+parse_device_id(const char *key __rte_unused, const char *value,
+ void *extra_args)
+{
+ struct pdump_tuples *pt = extra_args;
+
+ pt->device_id = strdup(value);
+ pt->dump_by_type = DEVICE_ID;
+
+ return 0;
+}
+
+static int
+parse_queue(const char *key __rte_unused, const char *value, void *extra_args)
+{
+ unsigned long n;
+ struct pdump_tuples *pt = extra_args;
+
+ if (!strcmp(value, "*"))
+ pt->queue = RTE_PDUMP_ALL_QUEUES;
+ else {
+ n = strtoul(value, NULL, 10);
+ pt->queue = (uint16_t) n;
+ }
+ return 0;
+}
+
+static int
+parse_rxtxdev(const char *key, const char *value, void *extra_args)
+{
+
+ struct pdump_tuples *pt = extra_args;
+
+ if (!strcmp(key, PDUMP_RX_DEV_ARG)) {
+ snprintf(pt->rx_dev, sizeof(pt->rx_dev), "%s", value);
+ /* identify the tx stream type for pcap vdev */
+ if (if_nametoindex(pt->rx_dev))
+ pt->rx_vdev_stream_type = IFACE;
+ } else if (!strcmp(key, PDUMP_TX_DEV_ARG)) {
+ snprintf(pt->tx_dev, sizeof(pt->tx_dev), "%s", value);
+ /* identify the tx stream type for pcap vdev */
+ if (if_nametoindex(pt->tx_dev))
+ pt->tx_vdev_stream_type = IFACE;
+ }
+
+ return 0;
+}
+
+static int
+parse_uint_value(const char *key, const char *value, void *extra_args)
+{
+ struct parse_val *v;
+ unsigned long t;
+ char *end;
+ int ret = 0;
+
+ errno = 0;
+ v = extra_args;
+ t = strtoul(value, &end, 10);
+
+ if (errno != 0 || end[0] != 0 || t < v->min || t > v->max) {
+ printf("invalid value:\"%s\" for key:\"%s\", "
+ "value must be >= %"PRIu64" and <= %"PRIu64"\n",
+ value, key, v->min, v->max);
+ ret = -EINVAL;
+ }
+ if (!strcmp(key, PDUMP_RING_SIZE_ARG) && !POWEROF2(t)) {
+ printf("invalid value:\"%s\" for key:\"%s\", "
+ "value must be power of 2\n", value, key);
+ ret = -EINVAL;
+ }
+
+ if (ret != 0)
+ return ret;
+
+ v->val = t;
+ return 0;
+}
+
+static int
+parse_pdump(const char *optarg)
+{
+ struct rte_kvargs *kvlist;
+ int ret = 0, cnt1, cnt2;
+ struct pdump_tuples *pt;
+ struct parse_val v = {0};
+
+ pt = &pdump_t[num_tuples];
+
+ /* initial check for invalid arguments */
+ kvlist = rte_kvargs_parse(optarg, valid_pdump_arguments);
+ if (kvlist == NULL) {
+ printf("--pdump=\"%s\": invalid argument passed\n", optarg);
+ return -1;
+ }
+
+ /* port/device_id parsing and validation */
+ cnt1 = rte_kvargs_count(kvlist, PDUMP_PORT_ARG);
+ cnt2 = rte_kvargs_count(kvlist, PDUMP_PCI_ARG);
+ if (!((cnt1 == 1 && cnt2 == 0) || (cnt1 == 0 && cnt2 == 1))) {
+ printf("--pdump=\"%s\": must have either port or "
+ "device_id argument\n", optarg);
+ ret = -1;
+ goto free_kvlist;
+ } else if (cnt1 == 1) {
+ v.min = 0;
+ v.max = RTE_MAX_ETHPORTS-1;
+ ret = rte_kvargs_process(kvlist, PDUMP_PORT_ARG,
+ &parse_uint_value, &v);
+ if (ret < 0)
+ goto free_kvlist;
+ pt->port = (uint8_t) v.val;
+ pt->dump_by_type = PORT_ID;
+ } else if (cnt2 == 1) {
+ ret = rte_kvargs_process(kvlist, PDUMP_PCI_ARG,
+ &parse_device_id, pt);
+ if (ret < 0)
+ goto free_kvlist;
+ }
+
+ /* queue parsing and validation */
+ cnt1 = rte_kvargs_count(kvlist, PDUMP_QUEUE_ARG);
+ if (cnt1 != 1) {
+ printf("--pdump=\"%s\": must have queue argument\n", optarg);
+ ret = -1;
+ goto free_kvlist;
+ }
+ ret = rte_kvargs_process(kvlist, PDUMP_QUEUE_ARG, &parse_queue, pt);
+ if (ret < 0)
+ goto free_kvlist;
+
+ /* rx-dev and tx-dev parsing and validation */
+ cnt1 = rte_kvargs_count(kvlist, PDUMP_RX_DEV_ARG);
+ cnt2 = rte_kvargs_count(kvlist, PDUMP_TX_DEV_ARG);
+ if (cnt1 == 0 && cnt2 == 0) {
+ printf("--pdump=\"%s\": must have either rx-dev or "
+ "tx-dev argument\n", optarg);
+ ret = -1;
+ goto free_kvlist;
+ } else if (cnt1 == 1 && cnt2 == 1) {
+ ret = rte_kvargs_process(kvlist, PDUMP_RX_DEV_ARG,
+ &parse_rxtxdev, pt);
+ if (ret < 0)
+ goto free_kvlist;
+ ret = rte_kvargs_process(kvlist, PDUMP_TX_DEV_ARG,
+ &parse_rxtxdev, pt);
+ if (ret < 0)
+ goto free_kvlist;
+ /* if captured packets has to send to the same vdev */
+ if (!strcmp(pt->rx_dev, pt->tx_dev))
+ pt->single_pdump_dev = true;
+ pt->dir = RTE_PDUMP_FLAG_RXTX;
+ } else if (cnt1 == 1) {
+ ret = rte_kvargs_process(kvlist, PDUMP_RX_DEV_ARG,
+ &parse_rxtxdev, pt);
+ if (ret < 0)
+ goto free_kvlist;
+ pt->dir = RTE_PDUMP_FLAG_RX;
+ } else if (cnt2 == 1) {
+ ret = rte_kvargs_process(kvlist, PDUMP_TX_DEV_ARG,
+ &parse_rxtxdev, pt);
+ if (ret < 0)
+ goto free_kvlist;
+ pt->dir = RTE_PDUMP_FLAG_TX;
+ }
+
+ /* optional */
+ /* ring_size parsing and validation */
+ cnt1 = rte_kvargs_count(kvlist, PDUMP_RING_SIZE_ARG);
+ if (cnt1 == 1) {
+ v.min = 2;
+ v.max = RTE_RING_SZ_MASK-1;
+ ret = rte_kvargs_process(kvlist, PDUMP_RING_SIZE_ARG,
+ &parse_uint_value, &v);
+ if (ret < 0)
+ goto free_kvlist;
+ pt->ring_size = (uint32_t) v.val;
+ } else
+ pt->ring_size = RING_SIZE;
+
+ /* mbuf_data_size parsing and validation */
+ cnt1 = rte_kvargs_count(kvlist, PDUMP_MSIZE_ARG);
+ if (cnt1 == 1) {
+ v.min = 1;
+ v.max = UINT16_MAX;
+ ret = rte_kvargs_process(kvlist, PDUMP_MSIZE_ARG,
+ &parse_uint_value, &v);
+ if (ret < 0)
+ goto free_kvlist;
+ pt->mbuf_data_size = (uint16_t) v.val;
+ } else
+ pt->mbuf_data_size = RTE_MBUF_DEFAULT_BUF_SIZE;
+
+ /* total_num_mbufs parsing and validation */
+ cnt1 = rte_kvargs_count(kvlist, PDUMP_NUM_MBUFS_ARG);
+ if (cnt1 == 1) {
+ v.min = 1025;
+ v.max = UINT16_MAX;
+ ret = rte_kvargs_process(kvlist, PDUMP_NUM_MBUFS_ARG,
+ &parse_uint_value, &v);
+ if (ret < 0)
+ goto free_kvlist;
+ pt->total_num_mbufs = (uint16_t) v.val;
+ } else
+ pt->total_num_mbufs = MBUFS_PER_POOL;
+
+ num_tuples++;
+
+free_kvlist:
+ rte_kvargs_free(kvlist);
+ return ret;
+}
+
+/* Parse the argument given in the command line of the application */
+static int
+launch_args_parse(int argc, char **argv, char *prgname)
+{
+ int opt, ret;
+ int option_index;
+ static struct option long_option[] = {
+ {"pdump", 1, 0, 0},
+ {"server-socket-path", 1, 0, 0},
+ {"client-socket-path", 1, 0, 0},
+ {NULL, 0, 0, 0}
+ };
+
+ if (argc == 1)
+ pdump_usage(prgname);
+
+ /* Parse command line */
+ while ((opt = getopt_long(argc, argv, " ",
+ long_option, &option_index)) != EOF) {
+ switch (opt) {
+ case 0:
+ if (!strncmp(long_option[option_index].name,
+ CMD_LINE_OPT_PDUMP,
+ sizeof(CMD_LINE_OPT_PDUMP))) {
+ ret = parse_pdump(optarg);
+ if (ret) {
+ pdump_usage(prgname);
+ return -1;
+ }
+ }
+
+ if (!strncmp(long_option[option_index].name,
+ CMD_LINE_OPT_SER_SOCK_PATH,
+ sizeof(CMD_LINE_OPT_SER_SOCK_PATH))) {
+ snprintf(server_socket_path,
+ sizeof(server_socket_path), "%s",
+ optarg);
+ }
+
+ if (!strncmp(long_option[option_index].name,
+ CMD_LINE_OPT_CLI_SOCK_PATH,
+ sizeof(CMD_LINE_OPT_CLI_SOCK_PATH))) {
+ snprintf(client_socket_path,
+ sizeof(client_socket_path), "%s",
+ optarg);
+ }
+
+ break;
+ default:
+ pdump_usage(prgname);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+static void
+print_pdump_stats(void)
+{
+ int i;
+ struct pdump_tuples *pt;
+
+ for (i = 0; i < num_tuples; i++) {
+ printf("##### PDUMP DEBUG STATS #####\n");
+ pt = &pdump_t[i];
+ printf(" -packets dequeued: %"PRIu64"\n",
+ pt->stats.dequeue_pkts);
+ printf(" -packets transmitted to vdev: %"PRIu64"\n",
+ pt->stats.tx_pkts);
+ printf(" -packets freed: %"PRIu64"\n",
+ pt->stats.freed_pkts);
+ }
+}
+
+static inline void
+disable_pdump(struct pdump_tuples *pt)
+{
+ if (pt->dump_by_type == DEVICE_ID)
+ rte_pdump_disable_by_deviceid(pt->device_id, pt->queue,
+ pt->dir);
+ else if (pt->dump_by_type == PORT_ID)
+ rte_pdump_disable(pt->port, pt->queue, pt->dir);
+}
+
+static inline void
+pdump_rxtx(struct rte_ring *ring, uint8_t vdev_id, struct pdump_stats *stats)
+{
+ /* write input packets of port to vdev for pdump */
+ struct rte_mbuf *rxtx_bufs[BURST_SIZE];
+
+ /* first dequeue packets from ring of primary process */
+ const uint16_t nb_in_deq = rte_ring_dequeue_burst(ring,
+ (void *)rxtx_bufs, BURST_SIZE, NULL);
+ stats->dequeue_pkts += nb_in_deq;
+
+ if (nb_in_deq) {
+ /* then sent on vdev */
+ uint16_t nb_in_txd = rte_eth_tx_burst(
+ vdev_id,
+ 0, rxtx_bufs, nb_in_deq);
+ stats->tx_pkts += nb_in_txd;
+
+ if (unlikely(nb_in_txd < nb_in_deq)) {
+ do {
+ rte_pktmbuf_free(rxtx_bufs[nb_in_txd]);
+ stats->freed_pkts++;
+ } while (++nb_in_txd < nb_in_deq);
+ }
+ }
+}
+
+static void
+free_ring_data(struct rte_ring *ring, uint8_t vdev_id,
+ struct pdump_stats *stats)
+{
+ while (rte_ring_count(ring))
+ pdump_rxtx(ring, vdev_id, stats);
+}
+
+static void
+cleanup_rings(void)
+{
+ int i;
+ struct pdump_tuples *pt;
+
+ for (i = 0; i < num_tuples; i++) {
+ pt = &pdump_t[i];
+
+ if (pt->device_id)
+ free(pt->device_id);
+
+ /* free the rings */
+ if (pt->rx_ring)
+ rte_ring_free(pt->rx_ring);
+ if (pt->tx_ring)
+ rte_ring_free(pt->tx_ring);
+ }
+}
+
+static void
+cleanup_pdump_resources(void)
+{
+ int i;
+ struct pdump_tuples *pt;
+
+ /* disable pdump and free the pdump_tuple resources */
+ for (i = 0; i < num_tuples; i++) {
+ pt = &pdump_t[i];
+
+ /* remove callbacks */
+ disable_pdump(pt);
+
+ /*
+ * transmit rest of the enqueued packets of the rings on to
+ * the vdev, in order to release mbufs to the mepool.
+ **/
+ if (pt->dir & RTE_PDUMP_FLAG_RX)
+ free_ring_data(pt->rx_ring, pt->rx_vdev_id, &pt->stats);
+ if (pt->dir & RTE_PDUMP_FLAG_TX)
+ free_ring_data(pt->tx_ring, pt->tx_vdev_id, &pt->stats);
+ }
+ cleanup_rings();
+}
+
+static void
+signal_handler(int sig_num)
+{
+ if (sig_num == SIGINT) {
+ printf("\n\nSignal %d received, preparing to exit...\n",
+ sig_num);
+ quit_signal = 1;
+ }
+}
+
+static inline int
+configure_vdev(uint16_t port_id)
+{
+ struct ether_addr addr;
+ const uint16_t rxRings = 0, txRings = 1;
+ int ret;
+ uint16_t q;
+
+ if (!rte_eth_dev_is_valid_port(port_id))
+ return -1;
+
+ ret = rte_eth_dev_configure(port_id, rxRings, txRings,
+ &port_conf_default);
+ if (ret != 0)
+ rte_exit(EXIT_FAILURE, "dev config failed\n");
+
+ for (q = 0; q < txRings; q++) {
+ ret = rte_eth_tx_queue_setup(port_id, q, TX_DESC_PER_QUEUE,
+ rte_eth_dev_socket_id(port_id), NULL);
+ if (ret < 0)
+ rte_exit(EXIT_FAILURE, "queue setup failed\n");
+ }
+
+ ret = rte_eth_dev_start(port_id);
+ if (ret < 0)
+ rte_exit(EXIT_FAILURE, "dev start failed\n");
+
+ rte_eth_macaddr_get(port_id, &addr);
+ printf("Port %u MAC: %02"PRIx8" %02"PRIx8" %02"PRIx8
+ " %02"PRIx8" %02"PRIx8" %02"PRIx8"\n",
+ port_id,
+ addr.addr_bytes[0], addr.addr_bytes[1],
+ addr.addr_bytes[2], addr.addr_bytes[3],
+ addr.addr_bytes[4], addr.addr_bytes[5]);
+
+ rte_eth_promiscuous_enable(port_id);
+
+ return 0;
+}
+
+static void
+create_mp_ring_vdev(void)
+{
+ int i;
+ uint16_t portid;
+ struct pdump_tuples *pt = NULL;
+ struct rte_mempool *mbuf_pool = NULL;
+ char vdev_args[SIZE];
+ char ring_name[SIZE];
+ char mempool_name[SIZE];
+
+ for (i = 0; i < num_tuples; i++) {
+ pt = &pdump_t[i];
+ snprintf(mempool_name, SIZE, MP_NAME, i);
+ mbuf_pool = rte_mempool_lookup(mempool_name);
+ if (mbuf_pool == NULL) {
+ /* create mempool */
+ mbuf_pool = rte_pktmbuf_pool_create(mempool_name,
+ pt->total_num_mbufs,
+ MBUF_POOL_CACHE_SIZE, 0,
+ pt->mbuf_data_size,
+ rte_socket_id());
+ if (mbuf_pool == NULL) {
+ cleanup_rings();
+ rte_exit(EXIT_FAILURE,
+ "Mempool creation failed: %s\n",
+ rte_strerror(rte_errno));
+ }
+ }
+ pt->mp = mbuf_pool;
+
+ if (pt->dir == RTE_PDUMP_FLAG_RXTX) {
+ /* if captured packets has to send to the same vdev */
+ /* create rx_ring */
+ snprintf(ring_name, SIZE, RX_RING, i);
+ pt->rx_ring = rte_ring_create(ring_name, pt->ring_size,
+ rte_socket_id(), 0);
+ if (pt->rx_ring == NULL) {
+ cleanup_rings();
+ rte_exit(EXIT_FAILURE, "%s:%s:%d\n",
+ rte_strerror(rte_errno),
+ __func__, __LINE__);
+ }
+
+ /* create tx_ring */
+ snprintf(ring_name, SIZE, TX_RING, i);
+ pt->tx_ring = rte_ring_create(ring_name, pt->ring_size,
+ rte_socket_id(), 0);
+ if (pt->tx_ring == NULL) {
+ cleanup_rings();
+ rte_exit(EXIT_FAILURE, "%s:%s:%d\n",
+ rte_strerror(rte_errno),
+ __func__, __LINE__);
+ }
+
+ /* create vdevs */
+ (pt->rx_vdev_stream_type == IFACE) ?
+ snprintf(vdev_args, SIZE, VDEV_IFACE, RX_STR, i,
+ pt->rx_dev) :
+ snprintf(vdev_args, SIZE, VDEV_PCAP, RX_STR, i,
+ pt->rx_dev);
+ if (rte_eth_dev_attach(vdev_args, &portid) < 0) {
+ cleanup_rings();
+ rte_exit(EXIT_FAILURE,
+ "vdev creation failed:%s:%d\n",
+ __func__, __LINE__);
+ }
+ pt->rx_vdev_id = portid;
+
+ /* configure vdev */
+ configure_vdev(pt->rx_vdev_id);
+
+ if (pt->single_pdump_dev)
+ pt->tx_vdev_id = portid;
+ else {
+ (pt->tx_vdev_stream_type == IFACE) ?
+ snprintf(vdev_args, SIZE, VDEV_IFACE, TX_STR, i,
+ pt->tx_dev) :
+ snprintf(vdev_args, SIZE, VDEV_PCAP, TX_STR, i,
+ pt->tx_dev);
+ if (rte_eth_dev_attach(vdev_args,
+ &portid) < 0) {
+ cleanup_rings();
+ rte_exit(EXIT_FAILURE,
+ "vdev creation failed:"
+ "%s:%d\n", __func__, __LINE__);
+ }
+ pt->tx_vdev_id = portid;
+
+ /* configure vdev */
+ configure_vdev(pt->tx_vdev_id);
+ }
+ } else if (pt->dir == RTE_PDUMP_FLAG_RX) {
+
+ /* create rx_ring */
+ snprintf(ring_name, SIZE, RX_RING, i);
+ pt->rx_ring = rte_ring_create(ring_name, pt->ring_size,
+ rte_socket_id(), 0);
+ if (pt->rx_ring == NULL) {
+ cleanup_rings();
+ rte_exit(EXIT_FAILURE, "%s\n",
+ rte_strerror(rte_errno));
+ }
+
+ (pt->rx_vdev_stream_type == IFACE) ?
+ snprintf(vdev_args, SIZE, VDEV_IFACE, RX_STR, i,
+ pt->rx_dev) :
+ snprintf(vdev_args, SIZE, VDEV_PCAP, RX_STR, i,
+ pt->rx_dev);
+ if (rte_eth_dev_attach(vdev_args, &portid) < 0) {
+ cleanup_rings();
+ rte_exit(EXIT_FAILURE,
+ "vdev creation failed:%s:%d\n",
+ __func__, __LINE__);
+ }
+ pt->rx_vdev_id = portid;
+ /* configure vdev */
+ configure_vdev(pt->rx_vdev_id);
+ } else if (pt->dir == RTE_PDUMP_FLAG_TX) {
+
+ /* create tx_ring */
+ snprintf(ring_name, SIZE, TX_RING, i);
+ pt->tx_ring = rte_ring_create(ring_name, pt->ring_size,
+ rte_socket_id(), 0);
+ if (pt->tx_ring == NULL) {
+ cleanup_rings();
+ rte_exit(EXIT_FAILURE, "%s\n",
+ rte_strerror(rte_errno));
+ }
+
+ (pt->tx_vdev_stream_type == IFACE) ?
+ snprintf(vdev_args, SIZE, VDEV_IFACE, TX_STR, i,
+ pt->tx_dev) :
+ snprintf(vdev_args, SIZE, VDEV_PCAP, TX_STR, i,
+ pt->tx_dev);
+ if (rte_eth_dev_attach(vdev_args, &portid) < 0) {
+ cleanup_rings();
+ rte_exit(EXIT_FAILURE,
+ "vdev creation failed\n");
+ }
+ pt->tx_vdev_id = portid;
+
+ /* configure vdev */
+ configure_vdev(pt->tx_vdev_id);
+ }
+ }
+}
+
+static void
+enable_pdump(void)
+{
+ int i;
+ struct pdump_tuples *pt;
+ int ret = 0, ret1 = 0;
+
+ if (server_socket_path[0] != 0)
+ ret = rte_pdump_set_socket_dir(server_socket_path,
+ RTE_PDUMP_SOCKET_SERVER);
+ if (ret == 0 && client_socket_path[0] != 0) {
+ ret = rte_pdump_set_socket_dir(client_socket_path,
+ RTE_PDUMP_SOCKET_CLIENT);
+ }
+ if (ret < 0) {
+ cleanup_pdump_resources();
+ rte_exit(EXIT_FAILURE,
+ "failed to set socket paths of server:%s, "
+ "client:%s\n",
+ server_socket_path,
+ client_socket_path);
+ }
+
+ for (i = 0; i < num_tuples; i++) {
+ pt = &pdump_t[i];
+ if (pt->dir == RTE_PDUMP_FLAG_RXTX) {
+ if (pt->dump_by_type == DEVICE_ID) {
+ ret = rte_pdump_enable_by_deviceid(
+ pt->device_id,
+ pt->queue,
+ RTE_PDUMP_FLAG_RX,
+ pt->rx_ring,
+ pt->mp, NULL);
+ ret1 = rte_pdump_enable_by_deviceid(
+ pt->device_id,
+ pt->queue,
+ RTE_PDUMP_FLAG_TX,
+ pt->tx_ring,
+ pt->mp, NULL);
+ } else if (pt->dump_by_type == PORT_ID) {
+ ret = rte_pdump_enable(pt->port, pt->queue,
+ RTE_PDUMP_FLAG_RX,
+ pt->rx_ring, pt->mp, NULL);
+ ret1 = rte_pdump_enable(pt->port, pt->queue,
+ RTE_PDUMP_FLAG_TX,
+ pt->tx_ring, pt->mp, NULL);
+ }
+ } else if (pt->dir == RTE_PDUMP_FLAG_RX) {
+ if (pt->dump_by_type == DEVICE_ID)
+ ret = rte_pdump_enable_by_deviceid(
+ pt->device_id,
+ pt->queue,
+ pt->dir, pt->rx_ring,
+ pt->mp, NULL);
+ else if (pt->dump_by_type == PORT_ID)
+ ret = rte_pdump_enable(pt->port, pt->queue,
+ pt->dir,
+ pt->rx_ring, pt->mp, NULL);
+ } else if (pt->dir == RTE_PDUMP_FLAG_TX) {
+ if (pt->dump_by_type == DEVICE_ID)
+ ret = rte_pdump_enable_by_deviceid(
+ pt->device_id,
+ pt->queue,
+ pt->dir,
+ pt->tx_ring, pt->mp, NULL);
+ else if (pt->dump_by_type == PORT_ID)
+ ret = rte_pdump_enable(pt->port, pt->queue,
+ pt->dir,
+ pt->tx_ring, pt->mp, NULL);
+ }
+ if (ret < 0 || ret1 < 0) {
+ cleanup_pdump_resources();
+ rte_exit(EXIT_FAILURE, "%s\n", rte_strerror(rte_errno));
+ }
+ }
+}
+
+static inline void
+dump_packets(void)
+{
+ int i;
+ struct pdump_tuples *pt;
+
+ while (!quit_signal) {
+ for (i = 0; i < num_tuples; i++) {
+ pt = &pdump_t[i];
+ if (pt->dir & RTE_PDUMP_FLAG_RX)
+ pdump_rxtx(pt->rx_ring, pt->rx_vdev_id,
+ &pt->stats);
+ if (pt->dir & RTE_PDUMP_FLAG_TX)
+ pdump_rxtx(pt->tx_ring, pt->tx_vdev_id,
+ &pt->stats);
+ }
+ }
+}
+
+int
+main(int argc, char **argv)
+{
+ int diag;
+ int ret;
+ int i;
+
+ char c_flag[] = "-c1";
+ char n_flag[] = "-n4";
+ char mp_flag[] = "--proc-type=secondary";
+ char *argp[argc + 3];
+
+ /* catch ctrl-c so we can print on exit */
+ signal(SIGINT, signal_handler);
+
+ argp[0] = argv[0];
+ argp[1] = c_flag;
+ argp[2] = n_flag;
+ argp[3] = mp_flag;
+
+ for (i = 1; i < argc; i++)
+ argp[i + 3] = argv[i];
+
+ argc += 3;
+
+ diag = rte_eal_init(argc, argp);
+ if (diag < 0)
+ rte_panic("Cannot init EAL\n");
+
+ argc -= diag;
+ argv += (diag - 3);
+
+ /* parse app arguments */
+ if (argc > 1) {
+ ret = launch_args_parse(argc, argv, argp[0]);
+ if (ret < 0)
+ rte_exit(EXIT_FAILURE, "Invalid argument\n");
+ }
+
+ /* create mempool, ring and vdevs info */
+ create_mp_ring_vdev();
+ enable_pdump();
+ dump_packets();
+
+ cleanup_pdump_resources();
+ /* dump debug stats */
+ print_pdump_stats();
+
+ ret = rte_eal_cleanup();
+ if (ret)
+ printf("Error from rte_eal_cleanup(), %d\n", ret);
+
+ return 0;
+}
diff --git a/app/proc_info/Makefile b/app/proc_info/Makefile
new file mode 100644
index 0000000..9e87f52
--- /dev/null
+++ b/app/proc_info/Makefile
@@ -0,0 +1,15 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2010-2015 Intel Corporation
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+APP = dpdk-procinfo
+
+CFLAGS += -DALLOW_EXPERIMENTAL_API
+CFLAGS += $(WERROR_FLAGS)
+
+# all source are stored in SRCS-y
+
+SRCS-y := main.c
+
+include $(RTE_SDK)/mk/rte.app.mk
diff --git a/app/proc_info/main.c b/app/proc_info/main.c
new file mode 100644
index 0000000..5ccf7ad
--- /dev/null
+++ b/app/proc_info/main.c
@@ -0,0 +1,672 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2017 Intel Corporation
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include