aboutsummaryrefslogtreecommitdiffstats
path: root/debian
diff options
context:
space:
mode:
Diffstat (limited to 'debian')
-rw-r--r--debian/changelog302
-rw-r--r--debian/compat1
-rw-r--r--debian/control686
-rw-r--r--debian/copyright47
-rw-r--r--debian/dpdk-dev.dirs1
-rw-r--r--debian/dpdk-doc.README.Debian52
-rw-r--r--debian/dpdk-doc.dirs1
-rw-r--r--debian/dpdk-igb-uio-dkms.dkms7
-rwxr-xr-xdebian/dpdk-init251
-rw-r--r--debian/dpdk-rte-kni-dkms.dkms7
-rwxr-xr-xdebian/dpdk-sdk-env.sh.in3
-rw-r--r--debian/dpdk.conf54
-rw-r--r--debian/dpdk.dirs5
-rw-r--r--debian/dpdk.init57
-rw-r--r--debian/dpdk.install2
-rw-r--r--debian/dpdk.interfaces19
-rw-r--r--debian/dpdk.service12
-rw-r--r--debian/libdpdk-dev.dirs1
-rw-r--r--debian/libdpdk-libethdev3.symbols112
-rw-r--r--debian/libdpdk-librte-acl2.symbols15
-rw-r--r--debian/libdpdk-librte-cfgfile2.symbols13
-rw-r--r--debian/libdpdk-librte-cmdline2.symbols68
-rw-r--r--debian/libdpdk-librte-cryptodev1.symbols30
-rw-r--r--debian/libdpdk-librte-distributor1.symbols11
-rw-r--r--debian/libdpdk-librte-eal2.symbols131
-rw-r--r--debian/libdpdk-librte-hash2.symbols26
-rw-r--r--debian/libdpdk-librte-ip-frag1.symbols9
-rw-r--r--debian/libdpdk-librte-jobstats1.symbols17
-rw-r--r--debian/libdpdk-librte-kni2.symbols13
-rw-r--r--debian/libdpdk-librte-kvargs1.symbols6
-rw-r--r--debian/libdpdk-librte-lpm2.symbols27
-rw-r--r--debian/libdpdk-librte-mbuf2.symbols11
-rw-r--r--debian/libdpdk-librte-mempool1.symbols15
-rw-r--r--debian/libdpdk-librte-meter1.symbols4
-rw-r--r--debian/libdpdk-librte-pipeline3.symbols28
-rw-r--r--debian/libdpdk-librte-pmd-af-packet1.symbols2
-rw-r--r--debian/libdpdk-librte-pmd-bond1.symbols20
-rw-r--r--debian/libdpdk-librte-pmd-cxgbe1.symbols2
-rw-r--r--debian/libdpdk-librte-pmd-e10001.symbols2
-rw-r--r--debian/libdpdk-librte-pmd-ena1.symbols2
-rw-r--r--debian/libdpdk-librte-pmd-enic1.symbols2
-rw-r--r--debian/libdpdk-librte-pmd-fm10k1.symbols2
-rw-r--r--debian/libdpdk-librte-pmd-i40e1.symbols2
-rw-r--r--debian/libdpdk-librte-pmd-ixgbe1.symbols2
-rw-r--r--debian/libdpdk-librte-pmd-null-crypto1.symbols2
-rw-r--r--debian/libdpdk-librte-pmd-null1.symbols4
-rw-r--r--debian/libdpdk-librte-pmd-pcap1.symbols2
-rw-r--r--debian/libdpdk-librte-pmd-ring2.symbols5
-rw-r--r--debian/libdpdk-librte-pmd-vhost1.symbols6
-rw-r--r--debian/libdpdk-librte-pmd-virtio1.symbols2
-rw-r--r--debian/libdpdk-librte-pmd-vmxnet3-uio1.symbols2
-rw-r--r--debian/libdpdk-librte-pmd-xenvirt1.symbols3
-rw-r--r--debian/libdpdk-librte-port2.symbols21
-rw-r--r--debian/libdpdk-librte-power1.symbols14
-rw-r--r--debian/libdpdk-librte-reorder1.symbols9
-rw-r--r--debian/libdpdk-librte-ring1.symbols11
-rw-r--r--debian/libdpdk-librte-sched1.symbols22
-rw-r--r--debian/libdpdk-librte-table2.symbols19
-rw-r--r--debian/libdpdk-librte-timer1.symbols11
-rw-r--r--debian/libdpdk-librte-vhost2.symbols13
-rw-r--r--debian/libdpdk0.dirs1
-rw-r--r--debian/patches/series12
-rw-r--r--debian/patches/ubuntu-backport-33-vhost-user-add-error-handling-for-fd-1023.patch141
-rw-r--r--debian/patches/ubuntu-backport-38-dpdk-dev-Memory-leak-when-adding-removing-vhost_user-ports.patch63
-rw-r--r--debian/patches/ubuntu-backport-39-lpm-fix-freeing-in-compatibility-mode.patch52
-rw-r--r--debian/patches/ubuntu-backport-40-linking-fixes-stage-1-4.patch101
-rw-r--r--debian/patches/ubuntu-backport-40-linking-fixes-stage-2-4.patch556
-rw-r--r--debian/patches/ubuntu-backport-40-linking-fixes-stage-3-4.patch217
-rw-r--r--debian/patches/ubuntu-backport-40-linking-fixes-stage-4-4.patch149
-rw-r--r--debian/patches/ubuntu-backport-41-fix-install-tar-1.29.patch25
-rw-r--r--debian/patches/ubuntu-backport-42-increase-default-logging-level.patch81
-rw-r--r--debian/patches/ubuntu-backport-43-fix-level-type-retrieving.patch61
-rw-r--r--debian/patches/ubuntu-fix-vhost-user-socket-permission.patch372
-rw-r--r--debian/patches/ubuntu-fix-xenvirt-support-dynamic-page-size.patch32
-rwxr-xr-xdebian/rules176
-rw-r--r--debian/source/format1
-rw-r--r--debian/tests/check-dpdk-supported-arch.sh12
-rw-r--r--debian/tests/control13
-rw-r--r--debian/tests/test-dkms18
-rw-r--r--debian/tests/test-initscripts143
-rw-r--r--debian/tests/test-linkage51
-rw-r--r--debian/watch2
82 files changed, 4505 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 00000000..36a76421
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,302 @@
+dpdk (16.04-1) UNRELEASED; urgency=medium
+
+ [ Christian Ehrhardt ]
+ * Merge with upstream DPDK 16.04 release
+ * droping patches/backports that are already upstream in DPDK 16.04
+ - d/p/ubuntu-fix-doc-installpath.patch
+ - d/p/ubuntu-fix-testpmd-without-xen.patch
+ - d/p/ubuntu-fix-lpm-use-after-free-and-leak.patch
+ - d/p/ubuntu-backport-[01-32,34-35] backports for stability
+ - d/p/ubuntu-backport-[36-37] but keep doc and example changes in d/*
+ * droping patches for soname / linking fixups.
+ - Upstream now goes with proper soname/abi/api handling per sublib plus a
+ linker script.
+ - dropped d/p/ubuntu-combined-shared-lib-abiversion.patch
+ - dropped d/p/ubuntu-fix-library-linkage.patch
+ * keeping patches:
+ - d/p/ubuntu-backport-38-* fix for memory leak
+ this now applies as is, so changed from a modified backport to match the
+ post 16.04 upstream commit now.
+ - d/p/ubuntu-backport-33-vhost-user-add-error-handling-for-fd-1023.patch
+ - doc and example changes that were related to d/p/ubuntu-backport-[36-37]
+ - d/p/ubuntu-fix-vhost-user-socket-permission.patch adapted for dpdk-16.04:
+ In the new build system with sublibs the exposed function needs to be
+ listed in lib/librte_eal/linuxapp/eal/rte_eal_version.map
+ * adding upstream backports - can be dropped when merging DPDK 16.07.
+ - d/p/ubuntu-backport-39-lpm-fix-freeing-in-compatibility-mode.patch
+ This was formerly part of a combined patch that we dropped because the
+ majority is upstream (d/p/ubuntu-fix-lpm-use-after-free-and-leak.patch).
+ - d/p/ubuntu-backport-40-linking-fixes-stage-[1-4]-4.patch
+ Fixing underlinking and overlinking issues in apps and libraries.
+ - d/p/ubuntu-backport-41-fix-install-tar-1.29.patch
+ Fix issues with tar >=1.29 (Yakkety)
+ - d/p/ubuntu-backport-43-increase-default-logging-level.patch
+ avoid default debug messages causing a perf degradation
+ - d/p/ubuntu-backport-43-fix-level-type-retrieving.patch
+ Fix type retrieving which was broken in standard threads
+ * adapt to new build system
+ - drop enabling the following build config symbols as they no more exist
+ CONFIG_RTE_BUILD_COMBINE_LIBS
+ - Sub-Libraries are now packaged in a versioned package per library. That
+ allows consumers of dpdk to just depend on what they need. As well as
+ installation of multiple .so versions concurrently.
+ - added the hidden dependency of librte_eal to librte_mempool
+ * Adding DKMS package for rte_kni (LP: #1592786)
+
+ [ Ricardo Salveti ]
+ * Adding support for ARM64:
+ - debian/control: adding arm64 to the supported architecture list
+ - debian/rules: supporting dpdk config and machine for arm64
+ - d/p/ubuntu-fix-xenvirt-support-dynamic-page-size.patch: fix build
+ failure on arm64
+ - debian/dpdk-sdk-env.sh: generating the right RTE_TARGET during build
+ time, so we can also make it compatible with ARM64
+ - debian/tests: also making tests compatible with ARM64
+ * Adding DKMS package for igb_uio
+ * Build static dpdk with -fPIC so it can be used by shared libraries
+ * debian/copyright: fixing Canonical's copyright entry
+ * Renaming symbol files so they can match the right package
+ * Drop the arch specific symbol files, as they are identical
+
+ [ Anders Roxell ]
+ * debian/dpdk.init: add remote_fs (lintian)
+ * debian/control: fixing week-library-dev-dependency (lintian)
+
+ -- Christian Ehrhardt <christian.ehrhardt@canonical.com> Tue, 17 May 2016 14:23:21 +0200
+
+dpdk (2.2.0-0ubuntu9) yakkety; urgency=medium
+
+ * d/p/ubuntu-backport-[36-37] fix virtio issues (LP: #1570195):
+ - don't let DPDK initialize virtio devices still in use by the kernel
+ - this avoids conflicts between kernel and dpdk usage of those devices
+ - an admin now has to unbind/bind devices as on physical hardware
+ - this is in the dpdk 16.04 release and delta can then be dropped
+ - d/dpdk-doc.README.Debian update for changes in virtio-pci handling
+ - d/dpdk.interfaces update for changes in virtio-pci handling
+ * d/p/ubuntu-backport-38... fix for memory leak (LP: #1570466):
+ - call vhost_destroy_device on removing vhost user ports to fix memory leak
+ - this likely is in the dpdk 16.07 release and delta can then be dropped
+ * d/p/ubuntu-fix-vhost-user-socket-permission.patch fox (LP: #1546565):
+ - when vhost_user sockets are created they are owner:group of the process
+ - the DPDK api to create those has no way to specify owner:group
+ - to fix that without breaking the API and potential workaround code in
+ consumers of the library like openvswitch 2.6 for example. This patch
+ adds an EAL commandline option to specify user:group created vhost_user
+ sockets should have.
+
+ -- Christian Ehrhardt <christian.ehrhardt@canonical.com> Wed, 27 Apr 2016 07:52:48 -0500
+
+dpdk (2.2.0-0ubuntu7) xenial; urgency=medium
+
+ * Increase max_map_count after setting huge pages (LP: #1507921):
+ - The default config of 65530 would cause issues as soon as about 64GB or
+ more are used as 2M huge pages for dpdk.
+ - Increase this value to base+2*#hugepages to avoid issues on huge systems.
+ * d/p/ubuntu-backport-[28-32,34-35] backports for stability (LP: #1568838):
+ - these will be in the 16.04 dpdk release, delta can then be dropped.
+ - 5 fixes that do not change api/behaviour but fix serious issues.
+ - 01 f82f705b lpm: fix allocation of an existing object
+ - 02 f9bd3342 hash: fix multi-process support
+ - 03 1aadacb5 hash: fix allocation of an existing object
+ - 04 5d7bfb73 hash: fix race condition at creation
+ - 05 fe671356 vfio: fix resource leak
+ - 06 356445f9 port: fix ring writer buffer overflow
+ - 07 52f7a5ae port: fix burst size mask type
+ * d/p/ubuntu-backport-33-vhost-user-add-error-handling-for-fd-1023.patch
+ - this will likely be in dpdk release 16.07 and delta can then be dropped.
+ - fixes a crash on using fd's >1023 (LP: #1566874)
+ * d/p/ubuntu-fix-lpm-use-after-free-and-leak.patch fix lpm_free (LP: #1569375)
+ - the old patches had an error freeing a pointer which had no meta data
+ - that lead to a crash on any lpm_free call
+ - folded into the fix that generally covers the lpm allocation and free
+ weaknesses already (also there this particular mistake was added)
+
+ -- Christian Ehrhardt <christian.ehrhardt@canonical.com> Tue, 12 Apr 2016 16:13:47 +0200
+
+dpdk (2.2.0-0ubuntu6) xenial; urgency=medium
+
+ * d/dpdk-init fix handling of multiple huge page sizes (LP: #1557532):
+ - dpdk-init now ensures non-default-hugepage-size mountpoints are
+ available as well.
+ - extra mountpoints are only created if requested in dpdk.conf and not yet
+ available (e.g. by the admin).
+ * d/dpdk-init fix issues with unassigned devices (LP: #1558485):
+ - dpdk-init no more checks /sys/.../driver of the device unconditionally
+ - removed the superfluous tr call in that path
+ * d/p/ubuntu-fix-lpm-use-after-free-and-leak.patch lpm/lpm6 (LP: #1554009):
+ - lpm/lpm6 fix use after free on lpm[6]_create
+ - lpm/lpm6 fix missing frees of rules_tbl substructure
+ - lpm/lpm6 fix missing free of lpm due to early exit
+ - make RTE_LOG messages of the failed allocation unique
+ * d/p/ubuntu-backport-[01-26] backport for stability (LP: #1559981):
+ - these will be in the following dpdk release and delta can then be dropped
+ - 26 fixes that do not change api/behaviour but fix serious issues
+ - 01 d3a274ce app/testpmd: handle SIGINT and SIGTERM
+ - 02 308df2bf Handle SIGINT and SIGTERM in l3fwd.
+ - 03 da82ee17 tools: fix unbinding failure handling
+ - 04 16c1814c tools: support Python 3 in bind script
+ - 05 bb9f4085 tools: support binding to built-in kernel modules
+ - 06 6e7caa1a eal/linux: support built-in kernel modules
+ - 07 86f36ff9 mempool: fix leak when creation fails
+ - 08 ca67ed28 vhost: fix leak of fds and mmaps
+ - 09 fa11a8a7 port: fix crash for ring writer nodrop
+ - 10 04f36690 port: fix crash for ethdev writer nodrop
+ - 11 c7a4ff80 i40e: fix overflow
+ - 12 097e920c i40e: fix inverted check for no refcount
+ - 13 330aa319 i40e: fix VLAN filtering
+ - 14 9f44dd3d i40e/base: fix missing check for stopped admin queue
+ - 15 8a880736 i40e/base: fix driver load failure
+ - 16 7656a546 fm10k: fix VLAN flag in scattered Rx
+ - 17 c6fb0e55 pcap: fix captured frame length
+ - 18 6e027237 bonding: fix detach of bonded device
+ - 19 df3e8ad7 bonding: fix detach of slave devices
+ - 20 786c990a bonding: copy entire config structure in mode 4
+ - 21 6698820b bonding: do not ignore multicast in mode 4
+ - 22 8997a10b bonding: fix active slaves with no primary
+ - 23 7a7122ed bonding: do not activate slave twice
+ - 24 2186fff3 bonding: fix crash when no slave device
+ - 25 c680a4a8 virtio: fix crash in statistics functions
+ - 26 3b1e3e4e virtio: fix descriptors pointing to the same buffer
+ * d/p/ubuntu-backport-27-virtio-fix-restart.patch for (LP: #1559981):
+ - fixing re-initializing the ethdev as openvswitch-dpdk does in the
+ virtio pmd driver by moving the detection of already being initialized
+ from virtio_dev_close to virtio_dev_start/stop
+ - this will be in the following dpdk release and delta can then be dropped
+ * d/rules build with debuginfo (LP: #1560839):
+ - exporting CFLAGS for all dpdk build processes
+ - dh_strip will automatically and create -dbgsym packages accordingly
+
+ -- Christian Ehrhardt <christian.ehrhardt@canonical.com> Wed, 23 Mar 2016 10:34:50 +0100
+
+dpdk (2.2.0-0ubuntu5) xenial; urgency=medium
+
+ * d/t/test-initscripts fix issues regarding 1G hugepages
+ - the dep8 was already taking care of 1G hugepages being not supported in
+ some environments. But it was failing when supported, but not enough
+ memory available.
+
+ -- Christian Ehrhardt <christian.ehrhardt@canonical.com> Wed, 09 Mar 2016 17:19:24 +0000
+
+dpdk (2.2.0-0ubuntu4) xenial; urgency=medium
+
+ * harden d/dpdk-init for configuration issues (LP: #1551601):
+ - detect and warn about bad bus specifications.
+ - detect and warn about incomplete device specifications.
+ - detect and warn about non existing pci IDs.
+ - avoid failing when working with unassigned devices.
+ - d/t/test-initscripts now testing various misconfigs.
+ - d/t/test-initscripts now also verifying service status.
+ * d/dpdk-init d/dpdk.conf now also support 1G hugepages (LP: #1551767):
+ - detect and warn if 1G pages are not available but configured.
+ - d/t/test-initscripts now also testing hugepage allocations.
+ - d/dpdk.conf has an option to drop caches to incease the likeliness of
+ successful 1G hugepage allocations (default off).
+ * d/rules replaced uname -m with DEB_HOST_GNU_CPU (LP: #1551796):
+ * fix testpmd to run without Xen environment (LP: #1551752):
+ - upstream discussion is slow, but we need a fix now. We can drop this
+ and change to the upstream solution when it is available.
+ * avoid errors due to missing modules (LP: #1554397):
+ - d/dpdk-init gracefully warns about missing modules.
+ - d/control now suggests linux-image-generic.
+ - d/dpdk.interfaces has a comment that makes the user aware.
+ * d/dpdk-init fix failure loading vfio-pci (LP: #1554214):
+ - d/dpdk-init no more converts "-" to "_" to make vfio-pci work
+ - d/dpdk.interfaces enhanced comments and updated examples
+ - d/dpdk-doc.README.debian got extra notes about using some modules
+ * unify whitespace/tabs in packaging and scripts
+ - tabs/spaces to just spaces in d/dpdk-init and d/dpdk.init.
+ - few remaining spaces to tabs in d/rules
+ * d/t/test-* now satisfy shellcheck
+ * d/* fix various comments and guides to be more readable
+ * d/dpdk-init and d/copyright updated copyright information
+
+ -- Christian Ehrhardt <christian.ehrhardt@canonical.com> Wed, 09 Mar 2016 08:48:58 +0000
+
+dpdk (2.2.0-0ubuntu3) xenial; urgency=medium
+
+ * Guard dep8 tests against non supported platforms (LP: #1551158):
+ - d/t/control now avoids failing due to "dependencies are unsatisfiable"
+ when fetching packages. The packages architecture restrictions got added
+ to avoid that.
+ - d/t/check-dpdk-supported-arch.sh is called by all DPDK tests to ensure
+ the platform is supported. If not it skips the test.
+
+ -- Christian Ehrhardt <christian.ehrhardt@canonical.com> Mon, 29 Feb 2016 11:03:39 +0000
+
+dpdk (2.2.0-0ubuntu2) xenial; urgency=medium
+
+ [ Christian Ehrhardt ]
+ * fix libdpdk.so library linking (LP: #1547517)
+ - libdpdk.so now has proper linkage information (was underlinked)
+ Note: this can be dropped when moving to DPDK 2.3 with linker script
+ instead of combined shared lib.
+ - remove reference to extra linkage needed when building against -ldpdk
+ in dpdk-doc README.
+ - add dep8 d/t/test-linkage to verify linking dpdk works as expected.
+ * d/control remove ${shlibs:Depends} on package with no linked binary
+ avoiding dpkg-gencontrol build warning about unknown ${shlibs:Depends}.
+ * d/dpdk-doc.README.debian fix path to DPDK build environment variable
+ helper script in README file.
+ * Update VCS Info in d/control to include our repositories.
+
+ [ James Page ]
+ * d/*: wrap-and-sort.
+ * d/control: Trim trailing whitespace.
+
+ -- Christian Ehrhardt <christian.ehrhardt@canonical.com> Thu, 25 Feb 2016 16:07:21 +0000
+
+dpdk (2.2.0-0ubuntu1) xenial; urgency=low
+
+ * Merge from Upstream to DPDK 2.2
+ Remaining changes:
+ - Set soabi for the combined shared library
+ * Drop changes:
+ - configuring RTE_LIBNAME to dpdk as it is the upstream default now
+ - enabled formerly non building components as they build properly in 2.2
+ - d/p/ubunut-avoid-texlive-fonts-extra, d/control:
+ Replace use of DejaVuSansMono is no more needed as upstream changed the
+ font. Thereby we can drop our delta.
+ - d/p/ubuntu-fix-gcc5-ftbs.patch no more needed with DPDK 2.2
+ * Added changes
+ - Disable CONFIG_RTE_NEXT_ABI as required for packaging (git 506f51cc)
+ - Enable LIBRTE_PMD_PCAP which is useful for some DPDK testcase examples
+ this adds a build dependency to libpcap-dev
+ - Fully support DH_VERBOSE for build debugging convenience
+ - adapt to new make infrastructure of dpdk 2.2
+ - d/README.debian: convert into d/dpdk-doc.README.debian
+ - d/dpdk-doc.README.debian: update recommendations about sdk env variables
+ - d/dpdk-sdk-env.sh: now deployed in /usr/share/dpdk to be opt in
+ - enable XEN support for dpdk (LP: #1521289).
+
+ -- Christian Ehrhardt <christian.ehrhardt@canonical.com> Wed, 17 Feb 2016 09:29:28 +0100
+
+dpdk (2.0.0-0ubuntu3) xenial; urgency=medium
+
+ * Only generate HTML documentation, easing backports to 14.04 and
+ reducing the time to build and size of the -doc package (LP: #1524700).
+
+ -- James Page <james.page@ubuntu.com> Thu, 10 Dec 2015 10:23:51 +0000
+
+dpdk (2.0.0-0ubuntu2) xenial; urgency=low
+
+ * d/p/ubunut-avoid-texlive-fonts-extra, d/control:
+ Replace use of DejaVuSansMono by courier and drop dependency on the
+ texlive-fonts-extra package (which is in universe).
+ * d/watch added to allow use of uscan to check for upstream releases.
+ * d/dpdk-init: fix error if bash variables could not be resolved that
+ appeared as "[: -gt: unexpected operator" (had no functional impact)
+ * d/dpdk-init:
+ Replace use of head and cut (in /usr/bin) commands with sed (in /bin)
+ while also adding /usr/bin to the PATH used on direct /etc/init.d/dpdk
+ invocation. The PATH is only updated to be on the safe side, there
+ should be no other commands from /usr/bin used (LP: #1516543).
+ * d/t/test-mountpoint: add dep8 test to cover the issue of LP #1517075.
+ * d/dpdk-dev.install: Copy the SDK makefiles into place (LP: #1517075).
+
+ -- Stefan Bader <stefan.bader@canonical.com> Tue, 17 Nov 2015 11:50:15 +0100
+
+dpdk (2.0.0-0ubuntu1) wily; urgency=low
+
+ * Initial release (LP: #1487538)
+
+ -- Stefan Bader <stefan.bader@canonical.com> Mon, 01 Jun 2015 18:46:38 +0200
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 00000000..ec635144
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+9
diff --git a/debian/control b/debian/control
new file mode 100644
index 00000000..9a934901
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,686 @@
+Source: dpdk
+Priority: optional
+Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
+Build-Depends: debhelper (>= 9),
+ dh-python,
+ dh-systemd (>= 1.5),
+ dkms,
+ doxygen,
+ graphviz,
+ inkscape,
+ libcap-dev,
+ libpcap-dev,
+ libxen-dev,
+ libxenstore3.0,
+ python,
+ python-sphinx,
+ texlive-fonts-recommended,
+ texlive-latex-extra
+Standards-Version: 3.9.6
+Section: libs
+Homepage: http://www.dpdk.org
+Vcs-Git: https://gerrit.fd.io/r/deb_dpdk
+Vcs-Browser: https://gerrit.fd.io/r/gitweb?p=deb_dpdk.git
+
+Package: dpdk
+Section: admin
+Architecture: amd64 arm64 i386
+Homepage: http://www.dpdk.org
+Depends: libdpdk-dev (= ${binary:Version}),
+ lsb-base (>= 3.2-14),
+ ${misc:Depends},
+ ${python:Depends},
+ ${shlibs:Depends}
+Suggests: linux-image-generic
+Description: Data Plane Development Kit (runtime)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime environment to run DPDK applications.
+
+Package: dpdk-dev
+Section: devel
+Architecture: amd64 arm64 i386
+Homepage: http://www.dpdk.org
+Depends: libdpdk-dev (= ${binary:Version}), ${misc:Depends}
+Description: Data Plane Development Kit (development files)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains examples and the upstream build environment. It is
+ not strictly required in order to build external applications.
+
+Package: dpdk-doc
+Section: doc
+Architecture: all
+Homepage: http://dpdk.org/doc/guides/index.html
+Depends: libjs-jquery, libjs-underscore, ${misc:Depends}
+Description: Data Plane Development Kit (documentation)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the complete set of documentation and guides.
+
+Package: dpdk-igb-uio-dkms
+Section: kernel
+Architecture: amd64 arm64 i386
+Depends: dkms,
+ dpdk-dev (= ${binary:Version}),
+ libdpdk-dev (= ${binary:Version}),
+ make,
+ ${misc:Depends}
+Description: Data Plane Development Kit (igb uio dkms)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the source code for the igb_uio kernel module.
+
+Package: dpdk-rte-kni-dkms
+Section: kernel
+Architecture: amd64 arm64 i386
+Depends: dkms,
+ dpdk-dev (= ${binary:Version}),
+ libdpdk-dev (= ${binary:Version}),
+ make,
+ ${misc:Depends}
+Description: Data Plane Development Kit (rte kni dkms)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the source code for the rte_kni kernel module.
+
+Package: libdpdk-dev
+Section: libdevel
+Architecture: amd64 arm64 i386
+Multi-Arch: same
+Homepage: http://www.dpdk.org
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends},
+ libdpdk-libethdev3 (= ${binary:Version}),
+ libdpdk-librte-acl2 (= ${binary:Version}),
+ libdpdk-librte-cfgfile2 (= ${binary:Version}),
+ libdpdk-librte-cmdline2 (= ${binary:Version}),
+ libdpdk-librte-cryptodev1 (= ${binary:Version}),
+ libdpdk-librte-distributor1 (= ${binary:Version}),
+ libdpdk-librte-eal2 (= ${binary:Version}),
+ libdpdk-librte-hash2 (= ${binary:Version}),
+ libdpdk-librte-ip-frag1 (= ${binary:Version}),
+ libdpdk-librte-jobstats1 (= ${binary:Version}),
+ libdpdk-librte-kni2 (= ${binary:Version}) [amd64 arm64],
+ libdpdk-librte-kvargs1 (= ${binary:Version}),
+ libdpdk-librte-lpm2 (= ${binary:Version}),
+ libdpdk-librte-mbuf2 (= ${binary:Version}),
+ libdpdk-librte-mempool1 (= ${binary:Version}),
+ libdpdk-librte-meter1 (= ${binary:Version}),
+ libdpdk-librte-pipeline3 (= ${binary:Version}),
+ libdpdk-librte-pmd-af-packet1 (= ${binary:Version}),
+ libdpdk-librte-pmd-bond1 (= ${binary:Version}),
+ libdpdk-librte-pmd-cxgbe1 (= ${binary:Version}),
+ libdpdk-librte-pmd-e10001 (= ${binary:Version}),
+ libdpdk-librte-pmd-ena1 (= ${binary:Version}),
+ libdpdk-librte-pmd-enic1 (= ${binary:Version}),
+ libdpdk-librte-pmd-fm10k1 (= ${binary:Version}) [amd64 i386],
+ libdpdk-librte-pmd-i40e1 (= ${binary:Version}) [amd64 i386],
+ libdpdk-librte-pmd-ixgbe1 (= ${binary:Version}),
+ libdpdk-librte-pmd-null-crypto1 (= ${binary:Version}),
+ libdpdk-librte-pmd-null1 (= ${binary:Version}),
+ libdpdk-librte-pmd-pcap1 (= ${binary:Version}),
+ libdpdk-librte-pmd-ring2 (= ${binary:Version}),
+ libdpdk-librte-pmd-vhost1 (= ${binary:Version}),
+ libdpdk-librte-pmd-virtio1 (= ${binary:Version}),
+ libdpdk-librte-pmd-vmxnet3-uio1 (= ${binary:Version}),
+ libdpdk-librte-pmd-xenvirt1 (= ${binary:Version}),
+ libdpdk-librte-port2 (= ${binary:Version}),
+ libdpdk-librte-power1 (= ${binary:Version}),
+ libdpdk-librte-reorder1 (= ${binary:Version}),
+ libdpdk-librte-ring1 (= ${binary:Version}),
+ libdpdk-librte-sched1 (= ${binary:Version}),
+ libdpdk-librte-table2 (= ${binary:Version}),
+ libdpdk-librte-timer1 (= ${binary:Version}),
+ libdpdk-librte-vhost2 (= ${binary:Version})
+Description: Data Plane Development Kit (basic development files)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the basic headers and library files required to
+ build external applications which will also require at least SSE3 support
+ when running.
+
+Package: libdpdk-libethdev3
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__ethdev_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (libethdev runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for libethdev
+
+Package: libdpdk-librte-acl2
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__ethdev_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-acl runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_acl
+
+Package: libdpdk-librte-cfgfile2
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__cfgfile_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-cfgfile runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_cfgfile
+
+Package: libdpdk-librte-cmdline2
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-cmdline runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_cmdline
+
+Package: libdpdk-librte-cryptodev1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__cryptodev_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-cryptodev runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_cryptodev
+
+Package: libdpdk-librte-distributor1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__distributor_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-distributor runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_distributor
+
+Package: libdpdk-librte-eal2
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__eal_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}, libdpdk-librte-mempool1
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-eal runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_eal
+
+Package: libdpdk-librte-hash2
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__hash_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-hash runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_hash
+
+Package: libdpdk-librte-ip-frag1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__ip__frag_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-ip-frag runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_ip_frag
+
+Package: libdpdk-librte-jobstats1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__jobstats_8h_source.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-jobstats runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_jobstats
+
+Package: libdpdk-librte-kni2
+Architecture: amd64 arm64
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__kni_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-kni runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_kni
+
+Package: libdpdk-librte-kvargs1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__kvargs_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-kvargs runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_kvargs
+
+Package: libdpdk-librte-lpm2
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__lpm_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-lpm runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_lpm
+
+Package: libdpdk-librte-mbuf2
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__mbuf_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-mbuf2 runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_mbuf
+
+Package: libdpdk-librte-mempool1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__mempool_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-mempool runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_mempool
+
+Package: libdpdk-librte-meter1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__meter_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-meter runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_meter
+
+Package: libdpdk-librte-pipeline3
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__pipeline_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-pipeline runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_pipeline
+
+Package: libdpdk-librte-pmd-af-packet1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/browse/dpdk/tree/drivers/net/af_packet
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-pmd-af-packet runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_pmd_af_packet
+
+Package: libdpdk-librte-pmd-bond1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-pmd-bond runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_pmd_bond
+
+Package: libdpdk-librte-pmd-cxgbe1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/guides/nics/cxgbe.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-pmd-cxgbe runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_pmd_cxgbe
+
+Package: libdpdk-librte-pmd-e10001
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/guides/nics/e1000em.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-pmd-e1000 runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_pmd_e1000
+
+Package: libdpdk-librte-pmd-ena1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/guides/nics/ena.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-pmd-ena runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_pmd_ena
+
+Package: libdpdk-librte-pmd-enic1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/guides/nics/enic.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-pmd-enic runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_pmd_enic
+
+Package: libdpdk-librte-pmd-fm10k1
+Architecture: amd64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/guides/nics/fm10k.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-pmd-fm10k runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_pmd_fm10k
+
+Package: libdpdk-librte-pmd-i40e1
+Architecture: amd64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/guides/nics/i40e.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-pmd-i40e runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_pmd_i40e
+
+Package: libdpdk-librte-pmd-ixgbe1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/guides/nics/ixgbe.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-pmd-ixgbe runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_pmd_ixgbe
+
+Package: libdpdk-librte-pmd-null-crypto1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/guides/cryptodevs/null.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-pmd-null-crypto runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_pmd_null_crypto
+
+Package: libdpdk-librte-pmd-null1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/browse/dpdk/tree/drivers/net/null
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-pmd-null runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_pmd_null
+
+Package: libdpdk-librte-pmd-pcap1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/guides/nics/pcap_ring.html#libpcap-based-pmd
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-pmd-pcap runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_pmd_pcap
+
+Package: libdpdk-librte-pmd-ring2
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/guides/nics/pcap_ring.html#rings-based-pmd
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-pmd-ring runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_pmd_ring
+
+Package: libdpdk-librte-pmd-vhost1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/guides/nics/vhost.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-pmd-vhost runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_pmd_vhost
+
+Package: libdpdk-librte-pmd-virtio1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/guides/nics/virtio.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-pmd-virtio runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_pmd_virtio
+
+Package: libdpdk-librte-pmd-vmxnet3-uio1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/guides/nics/vmxnet3.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-pmd-vmxnet3-uio runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_pmd_vmxnet3_uio
+
+Package: libdpdk-librte-pmd-xenvirt1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/guides/xen/pkt_switch.html#xen-pmd-frontend-prerequisites
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-pmd-xenvirt runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_pmd_xenvirt
+
+Package: libdpdk-librte-port2
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__port_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-port runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_port
+
+Package: libdpdk-librte-power1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__power_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-power runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_power
+
+Package: libdpdk-librte-reorder1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__reorder_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte-reorder runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_reorder
+
+Package: libdpdk-librte-ring1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__ring_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte_ring runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_ring
+
+Package: libdpdk-librte-sched1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__sched_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte_sched runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_sched
+
+Package: libdpdk-librte-table2
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__table_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte_table runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_table
+
+Package: libdpdk-librte-timer1
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__timer_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte_timer runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_timer
+
+Package: libdpdk-librte-vhost2
+Architecture: amd64 arm64 i386
+Section: libs
+Multi-Arch: same
+Homepage: http://dpdk.org/doc/api/rte__virtio__net_8h.html
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Conflicts: libdpdk0
+Description: Data Plane Development Kit (librte_vhost runtime library)
+ DPDK is a set of libraries for fast packet processing. Applications run
+ in user-space and communicate directly with dedicated network interfaces.
+ This package contains the runtime libraries for librte_vhost
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 00000000..1c6ee2cf
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,47 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: dpdk
+Source: http://dpdk.org
+
+Files: *
+Copyright: 2008-2014 Cisco Systems, Inc.
+ 2012-2014 6WIND S.A.
+ 1999-2015 Intel Corporation.
+ 2010-2013 Tilera Corporation.
+ 2012 Mellanox.
+ 2007 VMware, Inc.
+ 2007 Nuova Systems, Inc.
+ 2014 IBM Corporation.
+License: BSD+GPLv2+LGPLv2
+ On Debian systems, the complete text of the BSD License can be
+ found in "/usr/share/common-licenses/BSD".
+ .
+ This package is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ .
+ This package is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>
+ .
+ On Debian systems, the complete text of the GNU General
+ Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
+
+Files: debian/*
+Copyright: 2015, 2016 Canonical Ltd.
+License: GPL-3
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License version 3, as published
+ by the Free Software Foundation.
+ .
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranties of
+ MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
+ PURPOSE. See the GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License along
+ with this program. If not, see <http://www.gnu.org/licenses/>.
diff --git a/debian/dpdk-dev.dirs b/debian/dpdk-dev.dirs
new file mode 100644
index 00000000..bdac81a8
--- /dev/null
+++ b/debian/dpdk-dev.dirs
@@ -0,0 +1 @@
+usr/share/dpdk
diff --git a/debian/dpdk-doc.README.Debian b/debian/dpdk-doc.README.Debian
new file mode 100644
index 00000000..669bf396
--- /dev/null
+++ b/debian/dpdk-doc.README.Debian
@@ -0,0 +1,52 @@
+dpdk for Debian
+---------------
+
+This package is currently compiled for the lowest possible CPU requirements.
+Which still requires at least SSE3 to be supported by the CPU.
+
+dpdk (runtime) / libdpdk0:
+
+For runtime /etc/dpdk/interfaces holds a list of PCI devices to be assigned
+to DPDK compatible drivers and /etc/dpdk/dpdk.conf allows one to define the
+number of hugepages to be reserved at boot.
+The runtime environment is not required to build applications that use
+DPDK but if those applications get packaged they should depend on the
+runtime.
+
+Since DPDK technically would be able to use all of your compatible card/driver
+combination it is required that you take care of blacklisting / whitelisting
+network cards to tell dpdk which it has to to initialize (especially true for
+virtio-pci as the normal kernel driver is considered compatible).
+
+If you are working with virtio-pci network cards it isn't a hard requirement to
+assign them to a dpdk compatible userspace driver like uio_pci_generic. But you
+have to at least unbind them from the default kernel driver (virtio-pci) to
+avoid bugs by dpdk and the kernel working on them simultaneously. It is
+recommended to reassign them to dpdk compatible drivers using
+/etc/dpdk/interfaces (just as you would with any physical card).
+
+libdpdk0 contains the shared object needed to run a program in terms of symbol
+resolution, but none of the other runtime environment pieces.
+
+dpdk-dev / libdpdk-dev:
+
+The minimum requirement for developing external applications is libdpdk-dev,
+which brings the headers and library files.
+
+In dpdk-dev is the upstream makefile environment. Sample applications, which
+are shipped in dpdk-doc, are providing makefiles.
+Those makefiles need to find the dpdk build system. To do so they need some
+environment variables defined:
+ export RTE_TARGET="$(uname -m)-default-linuxapp-gcc"
+ export RTE_SDK="/usr/share/dpdk/"
+ export RTE_INCLUDE="/usr/include/dpdk"
+Those can be set by the user to overwrite with a custom path/config. If no
+custom environment is used it is recommended to source the file
+/usr/share/dpdk/dpdk-sdk-env.sh which comes with dpdk-dev.
+If the paths ever change or there will be more/less variables needed to build
+against dpdk-dev that file will be adjusted for you.
+
+Alternatively /usr/include/dpdk/rte_config.h has to be pre-included:
+CFLAGS += -I/usr/include/dpdk -irte_config.h
+
+ -- Christian Ehrhardt <christian.ehrhardt@canonical.com> Thu, 04 Feb 2016 09:16:11 +0100
diff --git a/debian/dpdk-doc.dirs b/debian/dpdk-doc.dirs
new file mode 100644
index 00000000..fcd9dfe3
--- /dev/null
+++ b/debian/dpdk-doc.dirs
@@ -0,0 +1 @@
+usr/share/doc/dpdk
diff --git a/debian/dpdk-igb-uio-dkms.dkms b/debian/dpdk-igb-uio-dkms.dkms
new file mode 100644
index 00000000..10dfecc7
--- /dev/null
+++ b/debian/dpdk-igb-uio-dkms.dkms
@@ -0,0 +1,7 @@
+PACKAGE_NAME="dpdk-igb-uio"
+PACKAGE_VERSION="#MODULE_VERSION#"
+BUILT_MODULE_NAME[0]="igb_uio"
+MAKE="source /usr/share/dpdk/dpdk-sdk-env.sh; make MODULE_CFLAGS='-I/usr/include/dpdk -include /usr/include/dpdk/rte_config.h'"
+CLEAN="source /usr/share/dpdk/dpdk-sdk-env.sh; make clean"
+DEST_MODULE_LOCATION[0]="/updates/dkms"
+AUTOINSTALL="YES"
diff --git a/debian/dpdk-init b/debian/dpdk-init
new file mode 100755
index 00000000..86eda2cb
--- /dev/null
+++ b/debian/dpdk-init
@@ -0,0 +1,251 @@
+#!/bin/sh
+#
+# dpdk-init: startup script to initialize a dpdk runtime environment
+#
+# Copyright 2015-2016 Canonical Ltd.
+# Autor: Stefan Bader <stefan.bader@canonical.com>
+# Autor: Christian Ehrhardt <christian.ehrhardt@canonical.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 3,
+# as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+set -e
+
+DPDK_BIND="/sbin/dpdk_nic_bind"
+DPDK_INTERF="/etc/dpdk/interfaces"
+
+
+# pagesize supports [G|g]/[M|m]/[K|k]
+get_kbytes() {
+ local unit
+ local num
+ unit=$(echo "${1}" | sed 's/[0-9]*//g')
+ num=$(echo "${1}" | sed 's/[^0-9]*//g')
+ case ${unit} in
+ *g | *G)
+ echo $((num*1024*1024))
+ ;;
+ *m | *M)
+ echo $((num*1024))
+ ;;
+ *k | *K)
+ echo $((num))
+ ;;
+ *)
+ echo $((num/1024))
+ ;;
+ esac
+}
+
+get_default_hpgsz() {
+ default_hpgsz=$(grep "Hugepagesize:" /proc/meminfo \
+ | sed 's/^Hugepagesize:\s*//g' | sed 's/\s*kB$//g')
+ echo "${default_hpgsz}"
+}
+
+get_hugetlbfs_mountpoint() {
+ local requested_hpgsz
+ local mp_hpgsz
+ requested_hpgsz=$(get_kbytes "${1}")
+
+ grep hugetlbfs /proc/mounts | while read \
+ mntfrom mntpoint mntfstype mntopt mntdump mntfsck; do
+
+ # check if the current muntpoint is of the requested huge page size
+ case ${mntopt} in
+ *pagesize=*)
+ mp_hpgsz=$(echo "${mntopt}" | sed 's/.*pagesize=//g' | sed 's/,.*//g')
+ mp_hpgsz=$(get_kbytes "${mp_hpgsz}")
+ ;;
+ *)
+ mp_hpgsz=$(get_default_hpgsz)
+ ;;
+ esac
+ if [ "${requested_hpgsz}" -eq "${mp_hpgsz}" ]; then
+ echo "${mntpoint}"
+ return
+ fi
+ done
+}
+
+_mount_hugetlbfs() {
+ local MNT="/dev/hugepages"
+ local MNTOPTS=""
+ local requested_hpgsz
+ local default_hpgsz
+ requested_hpgsz=$(get_kbytes "${1}")
+ default_hpgsz=$(get_default_hpgsz)
+
+ # kernel might not support the requested size
+ if [ ! -d "/sys/kernel/mm/hugepages/hugepages-${requested_hpgsz}kB" ]; then
+ echo "WARNING: requested page size of ${requested_hpgsz}kB " \
+ "not supported by the kernel"
+ return 0
+ fi
+
+ # special case if this is not the default huge page size
+ if [ "${requested_hpgsz}" -ne "${default_hpgsz}" ]; then
+ MNT="${MNT}-${requested_hpgsz}"
+ MNTOPTS="pagesize=${requested_hpgsz}K"
+ fi
+
+ if [ ! -e "${MNT}" ]; then
+ mkdir "${MNT}"
+ if [ $? -ne 0 ]; then
+ echo "Could not create directory ${MNT}!" >&2
+ return 1
+ fi
+ fi
+ mount -thugetlbfs hugetlbfs "${MNT}" -o "${MNTOPTS}"
+ return $?
+}
+
+#
+# The DPDK library will use the first mounted instance it finds for a given
+# page size. so if there is already one for a given size there is no need to
+# create another for the same huge page size.
+#
+mount_hugetlbfs() {
+ if [ ! -r /etc/dpdk/dpdk.conf ]; then
+ return 1
+ fi
+ . /etc/dpdk/dpdk.conf
+
+ # if a page size is requested, there has to be a mountpoint for that size
+ if [ -n "${NR_2M_PAGES}" -a -z "$(get_hugetlbfs_mountpoint '2M')" ]; then
+ _mount_hugetlbfs 2M
+ fi
+ if [ -n "${NR_1G_PAGES}" -a -z "$(get_hugetlbfs_mountpoint '1G')" ]; then
+ _mount_hugetlbfs 1G
+ fi
+}
+
+_setup_hugepages() {
+ MMDIR="/sys/kernel/mm/hugepages/${1}"
+ PAGES=${2}
+
+ if [ "$PAGES" != "" ]; then
+ if [ "$PAGES" -gt 0 ]; then
+ if [ -d "$MMDIR" -a -w "$MMDIR/nr_hugepages" ]; then
+ # increases the chance to allocate enough huge pages
+ # configurable, since it comes at a perf penality
+ if [ "$DROPCACHE_BEFORE_HP_ALLOC" = "1" ]; then
+ echo 3 > /proc/sys/vm/drop_caches
+ fi
+
+ echo "$PAGES" > "$MMDIR/nr_hugepages"
+
+ GOTPAGES=$(cat "$MMDIR/nr_hugepages")
+ if [ "$GOTPAGES" -lt "$PAGES" ]; then
+ echo "WARNING: could not allocate $PAGES at " \
+ "$MMDIR/nr_hugepages (only got $GOTPAGES)."
+ fi
+ else
+ echo "WARNING: $MMDIR/nr_hugepages not found/writable"
+ fi
+ fi
+ fi
+}
+
+#
+# Reserve a certain amount of hugepages (defined in /etc/dpdk.conf)
+#
+setup_hugepages() {
+ if [ ! -r /etc/dpdk/dpdk.conf ]; then
+ return 1
+ fi
+ . /etc/dpdk/dpdk.conf
+
+ _setup_hugepages "hugepages-2048kB" "$NR_2M_PAGES"
+ _setup_hugepages "hugepages-1048576kB" "$NR_1G_PAGES"
+
+ # dpdk uses 2*#hugepages mappings, increase for huge systems LP #1507921
+ if [ -d /sys/kernel/mm/hugepages ]; then
+ max_map_count=$(awk -v pad=65530 '{tot+=$1}END{print tot*2+pad}' \
+ /sys/kernel/mm/hugepages/hugepages-*/nr_hugepages)
+ sysctl -q vm.max_map_count="${max_map_count:-65530}"
+ fi
+
+ return 0
+}
+
+#
+# Allow NICs to be automatically bound to DPDK compatible drivers on boot.
+#
+bind_interfaces() {
+ if [ ! -r "$DPDK_INTERF" ]; then
+ return 0
+ fi
+ grep -v '^[ \t]*#' "$DPDK_INTERF" | while read BUS ID MOD; do
+ if [ "$BUS" = "" -o "$ID" = "" -o "$MOD" = "" ]; then
+ echo "WARNING: incomplete spec in $DPDK_INTERF" \
+ " - BUS '$BUS' ID '$ID' MOD '$MOD'"
+ continue
+ fi
+ if [ "$BUS" != "pci" ]; then
+ echo "WARNING: incompatible bus '$BUS' in $DPDK_INTERF"
+ continue
+ fi
+
+ SYSFSPATH="/sys/bus/$BUS/devices/$ID"
+ if [ ! -e "$SYSFSPATH" ]; then
+ echo "WARNING: invalid pci ID '$ID' in $DPDK_INTERF" \
+ " - '$SYSFSPATH' does not exist"
+ continue
+ fi
+ if [ -L "$SYSFSPATH/driver" ]; then
+ CUR=$(readlink "$SYSFSPATH/driver")
+ CUR=$(basename "$CUR")
+ else
+ # device existing, but currently unregistered
+ CUR=""
+ fi
+ if [ "$MOD" != "$CUR" ]; then
+ modprobe -q "$MOD" || true
+ # cloud img have no linux-image-extra initially (uip_pci_generic)
+ # so check if the module is available (loadable/built in)
+ if [ -e "/sys/bus/pci/drivers/${MOD}" ]; then
+ echo "Reassigning pci:$ID to $MOD"
+ $DPDK_BIND -b "$MOD" "$ID"
+ else
+ echo "Warning: failed assigning pci:$ID," \
+ " module $MOD not available"
+ fi
+ else
+ echo "pci:$ID already assigned to $MOD"
+ fi
+ done
+}
+
+
+
+case "$1" in
+start)
+ mount_hugetlbfs
+ setup_hugepages
+ bind_interfaces
+ ;;
+stop)
+ ;;
+reload|force-reload)
+ setup_hugepages
+ bind_interfaces
+ ;;
+status)
+ $DPDK_BIND --status
+ ;;
+*)
+ echo "Usage: $0 {start|stop|reload|force-reload|status}"
+ exit 1
+ ;;
+esac
+
diff --git a/debian/dpdk-rte-kni-dkms.dkms b/debian/dpdk-rte-kni-dkms.dkms
new file mode 100644
index 00000000..efccf1fb
--- /dev/null
+++ b/debian/dpdk-rte-kni-dkms.dkms
@@ -0,0 +1,7 @@
+PACKAGE_NAME="dpdk-rte-kni"
+PACKAGE_VERSION="#MODULE_VERSION#"
+BUILT_MODULE_NAME[0]="rte_kni"
+MAKE="source /usr/share/dpdk/dpdk-sdk-env.sh; make MODULE_CFLAGS='-I/usr/include/dpdk -include /usr/include/dpdk/rte_config.h -I$source_tree/dpdk-rte-kni-#MODULE_VERSION#/ethtool/ixgbe -I$source_tree/dpdk-rte-kni-#MODULE_VERSION#/ethtool/igb'"
+CLEAN="source /usr/share/dpdk/dpdk-sdk-env.sh; make clean"
+DEST_MODULE_LOCATION[0]="/updates/dkms"
+AUTOINSTALL="YES"
diff --git a/debian/dpdk-sdk-env.sh.in b/debian/dpdk-sdk-env.sh.in
new file mode 100755
index 00000000..8cc3944f
--- /dev/null
+++ b/debian/dpdk-sdk-env.sh.in
@@ -0,0 +1,3 @@
+export RTE_TARGET=SDK_TARGET
+export RTE_SDK="/usr/share/dpdk/"
+export RTE_INCLUDE="/usr/include/dpdk"
diff --git a/debian/dpdk.conf b/debian/dpdk.conf
new file mode 100644
index 00000000..fb4572d0
--- /dev/null
+++ b/debian/dpdk.conf
@@ -0,0 +1,54 @@
+#
+# The number of 2M hugepages to reserve on system boot
+#
+# Default is 0
+# To e.g. let it reserve 64x 2M Hugepages set:
+# NR_2M_PAGES=64
+
+#
+# The number of 1G hugepages to reserve on system boot
+#
+# Default is 0
+# To e.g. let it reserve 2x 1G Hugepages set:
+# NR_1G_PAGES=2
+
+#
+# Dropping slab and pagecache can help to successfully allocate hugepages,
+# especially later in the lifecycle of a system.
+# This comes at the cost of loosing all slab and pagecache on (re)start
+# of the dpdk service - therefore the default is off.
+#
+# Default is 0
+# Set to 1 to enable it
+#DROPCACHE_BEFORE_HP_ALLOC=0
+
+# The DPDK library will use the first mounted hugetlbfs.
+# The init scripts try to ensure there is at least one default hugetlbfs
+# mountpoint on start.
+# If you have multiple hugetlbfs mountpoints for a complex (e.g. specific numa
+# policies) setup it should be controlled by the admin instead of this init
+# script. In that case specific mountpoints can be provided as parameters to
+# the DPDK library.
+
+# Hardware may support other granularities of hugepages (like 4M). But the
+# larger the hugepages the earlier those should be allocated.
+# Note: the dpdk init scripts will report warnings, but not fail if they could
+# not allocate the requested amount of hugepages.
+# The more or the larger the hugepages to be allocated are, the more it is
+# recommended to do the reservation as kernel commandline arguments.
+# To do so edit /etc/default/grub: GRUB_CMDLINE_LINUX_DEFAULT
+# and add [hugepagesz=xx] hugepages=yy ...
+#
+# Kernel commandline config:
+# hugepagesz sets the size for the next hugepages reservation (default 2M)
+# hugepages reserves the given number of hugepages of the size set before
+#
+# After modifying /etc/default/grub, the command "update-grub" has to be
+# run in order to re-generate the grub config files. The new values will
+# be used after next reboot.
+#
+# example:
+# GRUB_CMDLINE_LINUX_DEFAULT="... hugepages=16 hugepagesz=1G hugepages=2"
+#
+# If the system supports it, this will reserve 16x 2M pages and 2x 1G pages.
+#
diff --git a/debian/dpdk.dirs b/debian/dpdk.dirs
new file mode 100644
index 00000000..29ca563f
--- /dev/null
+++ b/debian/dpdk.dirs
@@ -0,0 +1,5 @@
+etc/dpdk
+lib/dpdk
+sbin
+usr/bin
+usr/lib/dpdk
diff --git a/debian/dpdk.init b/debian/dpdk.init
new file mode 100644
index 00000000..01b47845
--- /dev/null
+++ b/debian/dpdk.init
@@ -0,0 +1,57 @@
+#!/bin/sh
+
+### BEGIN INIT INFO
+# Provides: dpdk
+# Required-Start: $remote_fs $local_fs
+# Required-Stop: $remote_fs $local_fs
+# Default-Start: S
+# Default-Stop: 0 1 6
+# Short-Description: start dpdk runtime environment
+### END INIT INFO
+
+set -e
+
+PATH="/sbin:/bin:/usr/bin"
+
+[ -d /lib/dpdk ] || exit 0
+
+# Define LSB log_* functions.
+# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
+# and status_of_proc is working.
+. /lib/lsb/init-functions
+
+error=0
+case "$1" in
+start)
+ log_action_begin_msg "Starting DPDK environment" "dpdk"
+ output=$(/lib/dpdk/dpdk-init start 2>&1) || error="$?"
+ if [ ! -z "$output" ]; then
+ echo "$output" | while read line; do
+ log_action_cont_msg "$line"
+ done
+ fi
+ log_action_end_msg $error
+ exit $error
+ ;;
+stop)
+ ;;
+restart|force-reload)
+ ;;
+status)
+ output=$(/lib/dpdk/dpdk-init --status 2>&1) || error="$?"
+ if [ ! -z "$output" ]; then
+ echo "$output" | while read line; do
+ log_action_cont_msg "$line"
+ done
+ fi
+ log_action_end_msg $error
+ exit $error
+ ;;
+*)
+ echo "Usage: $0 {start|stop|restart|force-reload|status}"
+ exit 1
+ ;;
+esac
+
+exit 0
+
diff --git a/debian/dpdk.install b/debian/dpdk.install
new file mode 100644
index 00000000..24c8d452
--- /dev/null
+++ b/debian/dpdk.install
@@ -0,0 +1,2 @@
+debian/dpdk-init lib/dpdk/
+debian/dpdk.conf etc/dpdk/
diff --git a/debian/dpdk.interfaces b/debian/dpdk.interfaces
new file mode 100644
index 00000000..3442343b
--- /dev/null
+++ b/debian/dpdk.interfaces
@@ -0,0 +1,19 @@
+#
+# <bus> Currently only "pci" is supported
+# <id> Device ID on the specified bus
+# <driver> Driver to bind against (vfio-pci, uio_pci_generic, igb_uio or
+# rte_kni)
+#
+# Be aware that the two dpdk compatible drivers uio_pci_generic and vfio-pci are
+# part of linux-image-extra-<VERSION> package.
+# This package is not always installed by default - for example in cloud-images.
+# So please install it in case you run into missing module issues.
+#
+# For the module igb_uio, please install the dpdk-igb-uio-dkms package.
+# For the module rte_kni, please install the dpdk-rte-kni-dkms package.
+#
+# <bus> <id> <driver>
+# pci 0000:04:00.0 vfio-pci
+# pci 0000:04:00.1 uio_pci_generic
+# pci 0000:05:00.0 igb_uio
+# pci 0000:06:00.0 rte_kni
diff --git a/debian/dpdk.service b/debian/dpdk.service
new file mode 100644
index 00000000..09ef8bec
--- /dev/null
+++ b/debian/dpdk.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=DPDK runtime environment
+DefaultDependencies=false
+After=network-pre.target local-fs.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/lib/dpdk/dpdk-init start
+
+[Install]
+WantedBy=multi-user.target
diff --git a/debian/libdpdk-dev.dirs b/debian/libdpdk-dev.dirs
new file mode 100644
index 00000000..e43b95cb
--- /dev/null
+++ b/debian/libdpdk-dev.dirs
@@ -0,0 +1 @@
+usr/include
diff --git a/debian/libdpdk-libethdev3.symbols b/debian/libdpdk-libethdev3.symbols
new file mode 100644
index 00000000..46313720
--- /dev/null
+++ b/debian/libdpdk-libethdev3.symbols
@@ -0,0 +1,112 @@
+libethdev.so.3 libdpdk-libethdev3 #MINVER#
+ DPDK_16.04@DPDK_16.04 16.04
+ DPDK_2.2@DPDK_2.2 16.04
+ _rte_eth_dev_callback_process@DPDK_2.2 16.04
+ rte_eth_add_rx_callback@DPDK_2.2 16.04
+ rte_eth_add_tx_callback@DPDK_2.2 16.04
+ rte_eth_allmulticast_disable@DPDK_2.2 16.04
+ rte_eth_allmulticast_enable@DPDK_2.2 16.04
+ rte_eth_allmulticast_get@DPDK_2.2 16.04
+ rte_eth_copy_pci_info@DPDK_2.2 16.04
+ rte_eth_dev_allocate@DPDK_2.2 16.04
+ rte_eth_dev_allocated@DPDK_2.2 16.04
+ rte_eth_dev_attach@DPDK_2.2 16.04
+ rte_eth_dev_callback_register@DPDK_2.2 16.04
+ rte_eth_dev_callback_unregister@DPDK_2.2 16.04
+ rte_eth_dev_close@DPDK_2.2 16.04
+ rte_eth_dev_configure@DPDK_2.2 16.04
+ rte_eth_dev_count@DPDK_2.2 16.04
+ rte_eth_dev_default_mac_addr_set@DPDK_2.2 16.04
+ rte_eth_dev_detach@DPDK_2.2 16.04
+ rte_eth_dev_filter_ctrl@DPDK_2.2 16.04
+ rte_eth_dev_filter_supported@DPDK_2.2 16.04
+ rte_eth_dev_flow_ctrl_get@DPDK_2.2 16.04
+ rte_eth_dev_flow_ctrl_set@DPDK_2.2 16.04
+ rte_eth_dev_get_dcb_info@DPDK_2.2 16.04
+ rte_eth_dev_get_eeprom@DPDK_2.2 16.04
+ rte_eth_dev_get_eeprom_length@DPDK_2.2 16.04
+ rte_eth_dev_get_mtu@DPDK_2.2 16.04
+ rte_eth_dev_get_reg_info@DPDK_2.2 16.04
+ rte_eth_dev_get_reg_length@DPDK_2.2 16.04
+ rte_eth_dev_get_supported_ptypes@DPDK_16.04 16.04
+ rte_eth_dev_get_vlan_offload@DPDK_2.2 16.04
+ rte_eth_dev_info_get@DPDK_2.2 16.04
+ rte_eth_dev_is_valid_port@DPDK_2.2 16.04
+ rte_eth_dev_l2_tunnel_eth_type_conf@DPDK_16.04 16.04
+ rte_eth_dev_l2_tunnel_offload_set@DPDK_16.04 16.04
+ rte_eth_dev_mac_addr_add@DPDK_2.2 16.04
+ rte_eth_dev_mac_addr_remove@DPDK_2.2 16.04
+ rte_eth_dev_priority_flow_ctrl_set@DPDK_2.2 16.04
+ rte_eth_dev_release_port@DPDK_2.2 16.04
+ rte_eth_dev_rss_hash_conf_get@DPDK_2.2 16.04
+ rte_eth_dev_rss_hash_update@DPDK_2.2 16.04
+ rte_eth_dev_rss_reta_query@DPDK_2.2 16.04
+ rte_eth_dev_rss_reta_update@DPDK_2.2 16.04
+ rte_eth_dev_rx_intr_ctl@DPDK_2.2 16.04
+ rte_eth_dev_rx_intr_ctl_q@DPDK_2.2 16.04
+ rte_eth_dev_rx_intr_disable@DPDK_2.2 16.04
+ rte_eth_dev_rx_intr_enable@DPDK_2.2 16.04
+ rte_eth_dev_rx_queue_start@DPDK_2.2 16.04
+ rte_eth_dev_rx_queue_stop@DPDK_2.2 16.04
+ rte_eth_dev_set_eeprom@DPDK_2.2 16.04
+ rte_eth_dev_set_link_down@DPDK_2.2 16.04
+ rte_eth_dev_set_link_up@DPDK_2.2 16.04
+ rte_eth_dev_set_mc_addr_list@DPDK_2.2 16.04
+ rte_eth_dev_set_mtu@DPDK_2.2 16.04
+ rte_eth_dev_set_rx_queue_stats_mapping@DPDK_2.2 16.04
+ rte_eth_dev_set_tx_queue_stats_mapping@DPDK_2.2 16.04
+ rte_eth_dev_set_vf_rx@DPDK_2.2 16.04
+ rte_eth_dev_set_vf_rxmode@DPDK_2.2 16.04
+ rte_eth_dev_set_vf_tx@DPDK_2.2 16.04
+ rte_eth_dev_set_vf_vlan_filter@DPDK_2.2 16.04
+ rte_eth_dev_set_vlan_ether_type@DPDK_2.2 16.04
+ rte_eth_dev_set_vlan_offload@DPDK_2.2 16.04
+ rte_eth_dev_set_vlan_pvid@DPDK_2.2 16.04
+ rte_eth_dev_set_vlan_strip_on_queue@DPDK_2.2 16.04
+ rte_eth_dev_socket_id@DPDK_2.2 16.04
+ rte_eth_dev_start@DPDK_2.2 16.04
+ rte_eth_dev_stop@DPDK_2.2 16.04
+ rte_eth_dev_tx_queue_start@DPDK_2.2 16.04
+ rte_eth_dev_tx_queue_stop@DPDK_2.2 16.04
+ rte_eth_dev_uc_all_hash_table_set@DPDK_2.2 16.04
+ rte_eth_dev_uc_hash_table_set@DPDK_2.2 16.04
+ rte_eth_dev_udp_tunnel_port_add@DPDK_16.04 16.04
+ rte_eth_dev_udp_tunnel_port_delete@DPDK_16.04 16.04
+ rte_eth_dev_vlan_filter@DPDK_2.2 16.04
+ rte_eth_devices@DPDK_2.2 16.04
+ rte_eth_dma_zone_reserve@DPDK_2.2 16.04
+ rte_eth_driver_register@DPDK_2.2 16.04
+ rte_eth_led_off@DPDK_2.2 16.04
+ rte_eth_led_on@DPDK_2.2 16.04
+ rte_eth_link_get@DPDK_2.2 16.04
+ rte_eth_link_get_nowait@DPDK_2.2 16.04
+ rte_eth_macaddr_get@DPDK_2.2 16.04
+ rte_eth_mirror_rule_reset@DPDK_2.2 16.04
+ rte_eth_mirror_rule_set@DPDK_2.2 16.04
+ rte_eth_promiscuous_disable@DPDK_2.2 16.04
+ rte_eth_promiscuous_enable@DPDK_2.2 16.04
+ rte_eth_promiscuous_get@DPDK_2.2 16.04
+ rte_eth_remove_rx_callback@DPDK_2.2 16.04
+ rte_eth_remove_tx_callback@DPDK_2.2 16.04
+ rte_eth_rx_queue_info_get@DPDK_2.2 16.04
+ rte_eth_rx_queue_setup@DPDK_2.2 16.04
+ rte_eth_set_queue_rate_limit@DPDK_2.2 16.04
+ rte_eth_set_vf_rate_limit@DPDK_2.2 16.04
+ rte_eth_speed_bitflag@DPDK_16.04 16.04
+ rte_eth_stats_get@DPDK_2.2 16.04
+ rte_eth_stats_reset@DPDK_2.2 16.04
+ rte_eth_timesync_adjust_time@DPDK_2.2 16.04
+ rte_eth_timesync_disable@DPDK_2.2 16.04
+ rte_eth_timesync_enable@DPDK_2.2 16.04
+ rte_eth_timesync_read_rx_timestamp@DPDK_2.2 16.04
+ rte_eth_timesync_read_time@DPDK_2.2 16.04
+ rte_eth_timesync_read_tx_timestamp@DPDK_2.2 16.04
+ rte_eth_timesync_write_time@DPDK_2.2 16.04
+ rte_eth_tx_buffer_count_callback@DPDK_16.04 16.04
+ rte_eth_tx_buffer_drop_callback@DPDK_16.04 16.04
+ rte_eth_tx_buffer_init@DPDK_16.04 16.04
+ rte_eth_tx_buffer_set_err_callback@DPDK_16.04 16.04
+ rte_eth_tx_queue_info_get@DPDK_2.2 16.04
+ rte_eth_tx_queue_setup@DPDK_2.2 16.04
+ rte_eth_xstats_get@DPDK_2.2 16.04
+ rte_eth_xstats_reset@DPDK_2.2 16.04
diff --git a/debian/libdpdk-librte-acl2.symbols b/debian/libdpdk-librte-acl2.symbols
new file mode 100644
index 00000000..b889abe1
--- /dev/null
+++ b/debian/libdpdk-librte-acl2.symbols
@@ -0,0 +1,15 @@
+librte_acl.so.2 libdpdk-librte-acl2 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ rte_acl_add_rules@DPDK_2.0 16.04
+ rte_acl_build@DPDK_2.0 16.04
+ rte_acl_classify@DPDK_2.0 16.04
+ rte_acl_classify_alg@DPDK_2.0 16.04
+ rte_acl_classify_scalar@DPDK_2.0 16.04
+ rte_acl_create@DPDK_2.0 16.04
+ rte_acl_dump@DPDK_2.0 16.04
+ rte_acl_find_existing@DPDK_2.0 16.04
+ rte_acl_free@DPDK_2.0 16.04
+ rte_acl_list_dump@DPDK_2.0 16.04
+ rte_acl_reset@DPDK_2.0 16.04
+ rte_acl_reset_rules@DPDK_2.0 16.04
+ rte_acl_set_ctx_classify@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-cfgfile2.symbols b/debian/libdpdk-librte-cfgfile2.symbols
new file mode 100644
index 00000000..c25969dd
--- /dev/null
+++ b/debian/libdpdk-librte-cfgfile2.symbols
@@ -0,0 +1,13 @@
+librte_cfgfile.so.2 libdpdk-librte-cfgfile2 #MINVER#
+ DPDK_16.04@DPDK_16.04 16.04
+ DPDK_2.0@DPDK_2.0 16.04
+ rte_cfgfile_close@DPDK_2.0 16.04
+ rte_cfgfile_get_entry@DPDK_2.0 16.04
+ rte_cfgfile_has_entry@DPDK_2.0 16.04
+ rte_cfgfile_has_section@DPDK_2.0 16.04
+ rte_cfgfile_load@DPDK_2.0 16.04
+ rte_cfgfile_num_sections@DPDK_2.0 16.04
+ rte_cfgfile_section_entries@DPDK_2.0 16.04
+ rte_cfgfile_section_entries_by_index@DPDK_16.04 16.04
+ rte_cfgfile_section_num_entries@DPDK_2.0 16.04
+ rte_cfgfile_sections@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-cmdline2.symbols b/debian/libdpdk-librte-cmdline2.symbols
new file mode 100644
index 00000000..feeb1e62
--- /dev/null
+++ b/debian/libdpdk-librte-cmdline2.symbols
@@ -0,0 +1,68 @@
+librte_cmdline.so.2 libdpdk-librte-cmdline2 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ DPDK_2.1@DPDK_2.1 16.04
+ cirbuf_add_buf_head@DPDK_2.0 16.04
+ cirbuf_add_buf_tail@DPDK_2.0 16.04
+ cirbuf_add_head@DPDK_2.0 16.04
+ cirbuf_add_head_safe@DPDK_2.0 16.04
+ cirbuf_add_tail@DPDK_2.0 16.04
+ cirbuf_add_tail_safe@DPDK_2.0 16.04
+ cirbuf_align_left@DPDK_2.0 16.04
+ cirbuf_align_right@DPDK_2.0 16.04
+ cirbuf_del_buf_head@DPDK_2.0 16.04
+ cirbuf_del_buf_tail@DPDK_2.0 16.04
+ cirbuf_del_head@DPDK_2.0 16.04
+ cirbuf_del_head_safe@DPDK_2.0 16.04
+ cirbuf_del_tail@DPDK_2.0 16.04
+ cirbuf_del_tail_safe@DPDK_2.0 16.04
+ cirbuf_get_buf_head@DPDK_2.0 16.04
+ cirbuf_get_buf_tail@DPDK_2.0 16.04
+ cirbuf_get_head@DPDK_2.0 16.04
+ cirbuf_get_tail@DPDK_2.0 16.04
+ cirbuf_init@DPDK_2.0 16.04
+ cmdline_complete@DPDK_2.0 16.04
+ cmdline_complete_get_elt_string@DPDK_2.0 16.04
+ cmdline_complete_get_nb_string@DPDK_2.0 16.04
+ cmdline_file_new@DPDK_2.0 16.04
+ cmdline_free@DPDK_2.0 16.04
+ cmdline_get_help_etheraddr@DPDK_2.0 16.04
+ cmdline_get_help_ipaddr@DPDK_2.0 16.04
+ cmdline_get_help_num@DPDK_2.0 16.04
+ cmdline_get_help_portlist@DPDK_2.0 16.04
+ cmdline_get_help_string@DPDK_2.0 16.04
+ cmdline_in@DPDK_2.0 16.04
+ cmdline_interact@DPDK_2.0 16.04
+ cmdline_isendoftoken@DPDK_2.0 16.04
+ cmdline_new@DPDK_2.0 16.04
+ cmdline_parse@DPDK_2.0 16.04
+ cmdline_parse_etheraddr@DPDK_2.0 16.04
+ cmdline_parse_ipaddr@DPDK_2.0 16.04
+ cmdline_parse_num@DPDK_2.0 16.04
+ cmdline_parse_portlist@DPDK_2.0 16.04
+ cmdline_parse_string@DPDK_2.0 16.04
+ cmdline_poll@DPDK_2.1 16.04
+ cmdline_printf@DPDK_2.0 16.04
+ cmdline_quit@DPDK_2.0 16.04
+ cmdline_set_prompt@DPDK_2.0 16.04
+ cmdline_stdin_exit@DPDK_2.0 16.04
+ cmdline_stdin_new@DPDK_2.0 16.04
+ cmdline_token_etheraddr_ops@DPDK_2.0 16.04
+ cmdline_token_ipaddr_ops@DPDK_2.0 16.04
+ cmdline_token_num_ops@DPDK_2.0 16.04
+ cmdline_token_portlist_ops@DPDK_2.0 16.04
+ cmdline_token_string_ops@DPDK_2.0 16.04
+ cmdline_write_char@DPDK_2.0 16.04
+ rdline_add_history@DPDK_2.0 16.04
+ rdline_char_in@DPDK_2.0 16.04
+ rdline_clear_history@DPDK_2.0 16.04
+ rdline_get_buffer@DPDK_2.0 16.04
+ rdline_get_history_item@DPDK_2.0 16.04
+ rdline_init@DPDK_2.0 16.04
+ rdline_newline@DPDK_2.0 16.04
+ rdline_quit@DPDK_2.0 16.04
+ rdline_redisplay@DPDK_2.0 16.04
+ rdline_reset@DPDK_2.0 16.04
+ rdline_restart@DPDK_2.0 16.04
+ rdline_stop@DPDK_2.0 16.04
+ vt100_init@DPDK_2.0 16.04
+ vt100_parser@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-cryptodev1.symbols b/debian/libdpdk-librte-cryptodev1.symbols
new file mode 100644
index 00000000..9c74dd93
--- /dev/null
+++ b/debian/libdpdk-librte-cryptodev1.symbols
@@ -0,0 +1,30 @@
+librte_cryptodev.so.1 libdpdk-librte-cryptodev1 #MINVER#
+ DPDK_16.04@DPDK_16.04 16.04
+ rte_crypto_op_pool_create@DPDK_16.04 16.04
+ rte_cryptodev_callback_register@DPDK_16.04 16.04
+ rte_cryptodev_callback_unregister@DPDK_16.04 16.04
+ rte_cryptodev_close@DPDK_16.04 16.04
+ rte_cryptodev_configure@DPDK_16.04 16.04
+ rte_cryptodev_count@DPDK_16.04 16.04
+ rte_cryptodev_count_devtype@DPDK_16.04 16.04
+ rte_cryptodev_create_vdev@DPDK_16.04 16.04
+ rte_cryptodev_get_dev_id@DPDK_16.04 16.04
+ rte_cryptodev_get_feature_name@DPDK_16.04 16.04
+ rte_cryptodev_info_get@DPDK_16.04 16.04
+ rte_cryptodev_pmd_allocate@DPDK_16.04 16.04
+ rte_cryptodev_pmd_callback_process@DPDK_16.04 16.04
+ rte_cryptodev_pmd_driver_register@DPDK_16.04 16.04
+ rte_cryptodev_pmd_release_device@DPDK_16.04 16.04
+ rte_cryptodev_pmd_virtual_dev_init@DPDK_16.04 16.04
+ rte_cryptodev_queue_pair_count@DPDK_16.04 16.04
+ rte_cryptodev_queue_pair_setup@DPDK_16.04 16.04
+ rte_cryptodev_queue_pair_start@DPDK_16.04 16.04
+ rte_cryptodev_queue_pair_stop@DPDK_16.04 16.04
+ rte_cryptodev_socket_id@DPDK_16.04 16.04
+ rte_cryptodev_start@DPDK_16.04 16.04
+ rte_cryptodev_stats_get@DPDK_16.04 16.04
+ rte_cryptodev_stats_reset@DPDK_16.04 16.04
+ rte_cryptodev_stop@DPDK_16.04 16.04
+ rte_cryptodev_sym_session_create@DPDK_16.04 16.04
+ rte_cryptodev_sym_session_free@DPDK_16.04 16.04
+ rte_cryptodevs@DPDK_16.04 16.04
diff --git a/debian/libdpdk-librte-distributor1.symbols b/debian/libdpdk-librte-distributor1.symbols
new file mode 100644
index 00000000..61f8d9d6
--- /dev/null
+++ b/debian/libdpdk-librte-distributor1.symbols
@@ -0,0 +1,11 @@
+librte_distributor.so.1 libdpdk-librte-distributor1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ rte_distributor_clear_returns@DPDK_2.0 16.04
+ rte_distributor_create@DPDK_2.0 16.04
+ rte_distributor_flush@DPDK_2.0 16.04
+ rte_distributor_get_pkt@DPDK_2.0 16.04
+ rte_distributor_poll_pkt@DPDK_2.0 16.04
+ rte_distributor_process@DPDK_2.0 16.04
+ rte_distributor_request_pkt@DPDK_2.0 16.04
+ rte_distributor_return_pkt@DPDK_2.0 16.04
+ rte_distributor_returned_pkts@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-eal2.symbols b/debian/libdpdk-librte-eal2.symbols
new file mode 100644
index 00000000..730ee11a
--- /dev/null
+++ b/debian/libdpdk-librte-eal2.symbols
@@ -0,0 +1,131 @@
+librte_eal.so.2 libdpdk-librte-eal2 #MINVER#
+ DPDK_16.04@DPDK_16.04 16.04
+ DPDK_2.0@DPDK_2.0 16.04
+ DPDK_2.1@DPDK_2.1 16.04
+ DPDK_2.2@DPDK_2.2 16.04
+ __rte_panic@DPDK_2.0 16.04
+ devargs_list@DPDK_2.0 16.04
+ eal_parse_sysfs_value@DPDK_2.0 16.04
+ eal_timer_source@DPDK_2.0 16.04
+ lcore_config@DPDK_2.0 16.04
+ pci_device_list@DPDK_2.0 16.04
+ pci_driver_list@DPDK_2.0 16.04
+ per_lcore__lcore_id@DPDK_2.0 16.04
+ per_lcore__rte_errno@DPDK_2.0 16.04
+ rte_calloc@DPDK_2.0 16.04
+ rte_calloc_socket@DPDK_2.0 16.04
+ rte_cpu_check_supported@DPDK_2.0 16.04
+ rte_cpu_get_flag_enabled@DPDK_2.0 16.04
+ rte_cpu_get_flag_name@DPDK_16.04 16.04
+ rte_cycles_vmware_tsc_map@DPDK_2.0 16.04
+ rte_delay_us@DPDK_2.0 16.04
+ rte_dump_physmem_layout@DPDK_2.0 16.04
+ rte_dump_registers@DPDK_2.0 16.04
+ rte_dump_stack@DPDK_2.0 16.04
+ rte_dump_tailq@DPDK_2.0 16.04
+ rte_eal_alarm_cancel@DPDK_2.0 16.04
+ rte_eal_alarm_set@DPDK_2.0 16.04
+ rte_eal_dev_init@DPDK_2.0 16.04
+ rte_eal_devargs_add@DPDK_2.0 16.04
+ rte_eal_devargs_dump@DPDK_2.0 16.04
+ rte_eal_devargs_type_count@DPDK_2.0 16.04
+ rte_eal_driver_register@DPDK_2.0 16.04
+ rte_eal_driver_unregister@DPDK_2.0 16.04
+ rte_eal_get_configuration@DPDK_2.0 16.04
+ rte_eal_get_lcore_state@DPDK_2.0 16.04
+ rte_eal_get_physmem_layout@DPDK_2.0 16.04
+ rte_eal_get_physmem_size@DPDK_2.0 16.04
+ rte_eal_has_hugepages@DPDK_2.0 16.04
+ rte_eal_init@DPDK_2.0 16.04
+ rte_eal_iopl_init@DPDK_2.0 16.04
+ rte_eal_lcore_role@DPDK_2.0 16.04
+ rte_eal_mp_remote_launch@DPDK_2.0 16.04
+ rte_eal_mp_wait_lcore@DPDK_2.0 16.04
+ rte_eal_parse_devargs_str@DPDK_2.0 16.04
+ rte_eal_pci_detach@DPDK_2.1 16.04
+ rte_eal_pci_dump@DPDK_2.0 16.04
+ rte_eal_pci_ioport_map@DPDK_16.04 16.04
+ rte_eal_pci_ioport_read@DPDK_16.04 16.04
+ rte_eal_pci_ioport_unmap@DPDK_16.04 16.04
+ rte_eal_pci_ioport_write@DPDK_16.04 16.04
+ rte_eal_pci_map_device@DPDK_16.04 16.04
+ rte_eal_pci_probe@DPDK_2.0 16.04
+ rte_eal_pci_probe_one@DPDK_2.0 16.04
+ rte_eal_pci_read_config@DPDK_2.1 16.04
+ rte_eal_pci_register@DPDK_2.0 16.04
+ rte_eal_pci_scan@DPDK_2.0 16.04
+ rte_eal_pci_unmap_device@DPDK_16.04 16.04
+ rte_eal_pci_unregister@DPDK_2.0 16.04
+ rte_eal_pci_write_config@DPDK_2.1 16.04
+ rte_eal_primary_proc_alive@DPDK_16.04 16.04
+ rte_eal_process_type@DPDK_2.0 16.04
+ rte_eal_remote_launch@DPDK_2.0 16.04
+ rte_eal_set_socket_permissions@DPDK_2.2 16.04
+ rte_eal_tailq_lookup@DPDK_2.0 16.04
+ rte_eal_tailq_register@DPDK_2.0 16.04
+ rte_eal_vdev_init@DPDK_2.0 16.04
+ rte_eal_vdev_uninit@DPDK_2.0 16.04
+ rte_eal_wait_lcore@DPDK_2.0 16.04
+ rte_epoll_ctl@DPDK_2.1 16.04
+ rte_epoll_wait@DPDK_2.1 16.04
+ rte_exit@DPDK_2.0 16.04
+ rte_free@DPDK_2.0 16.04
+ rte_get_log_level@DPDK_2.0 16.04
+ rte_get_log_type@DPDK_2.0 16.04
+ rte_get_tsc_hz@DPDK_2.0 16.04
+ rte_hexdump@DPDK_2.0 16.04
+ rte_intr_allow_others@DPDK_2.1 16.04
+ rte_intr_callback_register@DPDK_2.0 16.04
+ rte_intr_callback_unregister@DPDK_2.0 16.04
+ rte_intr_cap_multiple@DPDK_2.2 16.04
+ rte_intr_disable@DPDK_2.0 16.04
+ rte_intr_dp_is_en@DPDK_2.1 16.04
+ rte_intr_efd_disable@DPDK_2.1 16.04
+ rte_intr_efd_enable@DPDK_2.1 16.04
+ rte_intr_enable@DPDK_2.0 16.04
+ rte_intr_rx_ctl@DPDK_2.1 16.04
+ rte_intr_tls_epfd@DPDK_2.1 16.04
+ rte_keepalive_create@DPDK_2.2 16.04
+ rte_keepalive_dispatch_pings@DPDK_2.2 16.04
+ rte_keepalive_mark_alive@DPDK_2.2 16.04
+ rte_keepalive_register_core@DPDK_2.2 16.04
+ rte_log@DPDK_2.0 16.04
+ rte_log_add_in_history@DPDK_2.0 16.04
+ rte_log_cur_msg_loglevel@DPDK_2.0 16.04
+ rte_log_cur_msg_logtype@DPDK_2.0 16.04
+ rte_log_dump_history@DPDK_2.0 16.04
+ rte_log_set_history@DPDK_2.0 16.04
+ rte_logs@DPDK_2.0 16.04
+ rte_malloc@DPDK_2.0 16.04
+ rte_malloc_dump_stats@DPDK_2.0 16.04
+ rte_malloc_get_socket_stats@DPDK_2.0 16.04
+ rte_malloc_set_limit@DPDK_2.0 16.04
+ rte_malloc_socket@DPDK_2.0 16.04
+ rte_malloc_validate@DPDK_2.0 16.04
+ rte_malloc_virt2phy@DPDK_2.0 16.04
+ rte_mem_lock_page@DPDK_2.0 16.04
+ rte_mem_virt2phy@DPDK_2.0 16.04
+ rte_memdump@DPDK_2.0 16.04
+ rte_memory_get_nchannel@DPDK_2.0 16.04
+ rte_memory_get_nrank@DPDK_2.0 16.04
+ rte_memzone_dump@DPDK_2.0 16.04
+ rte_memzone_free@DPDK_2.1 16.04
+ rte_memzone_lookup@DPDK_2.0 16.04
+ rte_memzone_reserve@DPDK_2.0 16.04
+ rte_memzone_reserve_aligned@DPDK_2.0 16.04
+ rte_memzone_reserve_bounded@DPDK_2.0 16.04
+ rte_memzone_walk@DPDK_2.0 16.04
+ rte_openlog_stream@DPDK_2.0 16.04
+ rte_realloc@DPDK_2.0 16.04
+ rte_set_application_usage_hook@DPDK_2.0 16.04
+ rte_set_log_level@DPDK_2.0 16.04
+ rte_set_log_type@DPDK_2.0 16.04
+ rte_socket_id@DPDK_2.0 16.04
+ rte_strerror@DPDK_2.0 16.04
+ rte_strsplit@DPDK_2.0 16.04
+ rte_sys_gettid@DPDK_2.0 16.04
+ rte_thread_get_affinity@DPDK_2.0 16.04
+ rte_thread_set_affinity@DPDK_2.0 16.04
+ rte_vlog@DPDK_2.0 16.04
+ rte_zmalloc@DPDK_2.0 16.04
+ rte_zmalloc_socket@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-hash2.symbols b/debian/libdpdk-librte-hash2.symbols
new file mode 100644
index 00000000..0173e0da
--- /dev/null
+++ b/debian/libdpdk-librte-hash2.symbols
@@ -0,0 +1,26 @@
+librte_hash.so.2 libdpdk-librte-hash2 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ DPDK_2.1@DPDK_2.1 16.04
+ DPDK_2.2@DPDK_2.2 16.04
+ rte_fbk_hash_create@DPDK_2.0 16.04
+ rte_fbk_hash_find_existing@DPDK_2.0 16.04
+ rte_fbk_hash_free@DPDK_2.0 16.04
+ rte_hash_add_key@DPDK_2.0 16.04
+ rte_hash_add_key_data@DPDK_2.1 16.04
+ rte_hash_add_key_with_hash@DPDK_2.0 16.04
+ rte_hash_add_key_with_hash_data@DPDK_2.1 16.04
+ rte_hash_create@DPDK_2.0 16.04
+ rte_hash_del_key@DPDK_2.0 16.04
+ rte_hash_del_key_with_hash@DPDK_2.0 16.04
+ rte_hash_find_existing@DPDK_2.0 16.04
+ rte_hash_free@DPDK_2.0 16.04
+ rte_hash_hash@DPDK_2.0 16.04
+ rte_hash_iterate@DPDK_2.1 16.04
+ rte_hash_lookup@DPDK_2.0 16.04
+ rte_hash_lookup_bulk@DPDK_2.0 16.04
+ rte_hash_lookup_bulk_data@DPDK_2.1 16.04
+ rte_hash_lookup_data@DPDK_2.1 16.04
+ rte_hash_lookup_with_hash@DPDK_2.0 16.04
+ rte_hash_lookup_with_hash_data@DPDK_2.1 16.04
+ rte_hash_reset@DPDK_2.1 16.04
+ rte_hash_set_cmp_func@DPDK_2.2 16.04
diff --git a/debian/libdpdk-librte-ip-frag1.symbols b/debian/libdpdk-librte-ip-frag1.symbols
new file mode 100644
index 00000000..503ebdfd
--- /dev/null
+++ b/debian/libdpdk-librte-ip-frag1.symbols
@@ -0,0 +1,9 @@
+librte_ip_frag.so.1 libdpdk-librte-ip-frag1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ rte_ip_frag_free_death_row@DPDK_2.0 16.04
+ rte_ip_frag_table_create@DPDK_2.0 16.04
+ rte_ip_frag_table_statistics_dump@DPDK_2.0 16.04
+ rte_ipv4_frag_reassemble_packet@DPDK_2.0 16.04
+ rte_ipv4_fragment_packet@DPDK_2.0 16.04
+ rte_ipv6_frag_reassemble_packet@DPDK_2.0 16.04
+ rte_ipv6_fragment_packet@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-jobstats1.symbols b/debian/libdpdk-librte-jobstats1.symbols
new file mode 100644
index 00000000..af119016
--- /dev/null
+++ b/debian/libdpdk-librte-jobstats1.symbols
@@ -0,0 +1,17 @@
+librte_jobstats.so.1 libdpdk-librte-jobstats1 #MINVER#
+ DPDK_16.04@DPDK_16.04 16.04
+ DPDK_2.0@DPDK_2.0 16.04
+ rte_jobstats_abort@DPDK_16.04 16.04
+ rte_jobstats_context_finish@DPDK_2.0 16.04
+ rte_jobstats_context_init@DPDK_2.0 16.04
+ rte_jobstats_context_reset@DPDK_2.0 16.04
+ rte_jobstats_context_start@DPDK_2.0 16.04
+ rte_jobstats_finish@DPDK_2.0 16.04
+ rte_jobstats_init@DPDK_2.0 16.04
+ rte_jobstats_reset@DPDK_2.0 16.04
+ rte_jobstats_set_max@DPDK_2.0 16.04
+ rte_jobstats_set_min@DPDK_2.0 16.04
+ rte_jobstats_set_period@DPDK_2.0 16.04
+ rte_jobstats_set_target@DPDK_2.0 16.04
+ rte_jobstats_set_update_period_function@DPDK_2.0 16.04
+ rte_jobstats_start@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-kni2.symbols b/debian/libdpdk-librte-kni2.symbols
new file mode 100644
index 00000000..661595e3
--- /dev/null
+++ b/debian/libdpdk-librte-kni2.symbols
@@ -0,0 +1,13 @@
+librte_kni.so.2 libdpdk-librte-kni2 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ rte_kni_alloc@DPDK_2.0 16.04
+ rte_kni_close@DPDK_2.0 16.04
+ rte_kni_get@DPDK_2.0 16.04
+ rte_kni_get_name@DPDK_2.0 16.04
+ rte_kni_handle_request@DPDK_2.0 16.04
+ rte_kni_init@DPDK_2.0 16.04
+ rte_kni_register_handlers@DPDK_2.0 16.04
+ rte_kni_release@DPDK_2.0 16.04
+ rte_kni_rx_burst@DPDK_2.0 16.04
+ rte_kni_tx_burst@DPDK_2.0 16.04
+ rte_kni_unregister_handlers@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-kvargs1.symbols b/debian/libdpdk-librte-kvargs1.symbols
new file mode 100644
index 00000000..d61a3168
--- /dev/null
+++ b/debian/libdpdk-librte-kvargs1.symbols
@@ -0,0 +1,6 @@
+librte_kvargs.so.1 libdpdk-librte-kvargs1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ rte_kvargs_count@DPDK_2.0 16.04
+ rte_kvargs_free@DPDK_2.0 16.04
+ rte_kvargs_parse@DPDK_2.0 16.04
+ rte_kvargs_process@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-lpm2.symbols b/debian/libdpdk-librte-lpm2.symbols
new file mode 100644
index 00000000..e87ef64d
--- /dev/null
+++ b/debian/libdpdk-librte-lpm2.symbols
@@ -0,0 +1,27 @@
+librte_lpm.so.2 libdpdk-librte-lpm2 #MINVER#
+ DPDK_16.04@DPDK_16.04 16.04
+ DPDK_2.0@DPDK_2.0 16.04
+ rte_lpm6_add@DPDK_2.0 16.04
+ rte_lpm6_create@DPDK_2.0 16.04
+ rte_lpm6_delete@DPDK_2.0 16.04
+ rte_lpm6_delete_all@DPDK_2.0 16.04
+ rte_lpm6_delete_bulk_func@DPDK_2.0 16.04
+ rte_lpm6_find_existing@DPDK_2.0 16.04
+ rte_lpm6_free@DPDK_2.0 16.04
+ rte_lpm6_is_rule_present@DPDK_2.0 16.04
+ rte_lpm6_lookup@DPDK_2.0 16.04
+ rte_lpm6_lookup_bulk_func@DPDK_2.0 16.04
+ rte_lpm_add@DPDK_16.04 16.04
+ rte_lpm_add@DPDK_2.0 16.04
+ rte_lpm_create@DPDK_16.04 16.04
+ rte_lpm_create@DPDK_2.0 16.04
+ rte_lpm_delete@DPDK_16.04 16.04
+ rte_lpm_delete@DPDK_2.0 16.04
+ rte_lpm_delete_all@DPDK_16.04 16.04
+ rte_lpm_delete_all@DPDK_2.0 16.04
+ rte_lpm_find_existing@DPDK_16.04 16.04
+ rte_lpm_find_existing@DPDK_2.0 16.04
+ rte_lpm_free@DPDK_16.04 16.04
+ rte_lpm_free@DPDK_2.0 16.04
+ rte_lpm_is_rule_present@DPDK_16.04 16.04
+ rte_lpm_is_rule_present@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-mbuf2.symbols b/debian/libdpdk-librte-mbuf2.symbols
new file mode 100644
index 00000000..d0e8c450
--- /dev/null
+++ b/debian/libdpdk-librte-mbuf2.symbols
@@ -0,0 +1,11 @@
+librte_mbuf.so.2 libdpdk-librte-mbuf2 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ DPDK_2.1@DPDK_2.1 16.04
+ rte_ctrlmbuf_init@DPDK_2.0 16.04
+ rte_get_rx_ol_flag_name@DPDK_2.0 16.04
+ rte_get_tx_ol_flag_name@DPDK_2.0 16.04
+ rte_mbuf_sanity_check@DPDK_2.0 16.04
+ rte_pktmbuf_dump@DPDK_2.0 16.04
+ rte_pktmbuf_init@DPDK_2.0 16.04
+ rte_pktmbuf_pool_create@DPDK_2.1 16.04
+ rte_pktmbuf_pool_init@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-mempool1.symbols b/debian/libdpdk-librte-mempool1.symbols
new file mode 100644
index 00000000..024efc42
--- /dev/null
+++ b/debian/libdpdk-librte-mempool1.symbols
@@ -0,0 +1,15 @@
+librte_mempool.so.1 libdpdk-librte-mempool1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ rte_dom0_mempool_create@DPDK_2.0 16.04
+ rte_mempool_audit@DPDK_2.0 16.04
+ rte_mempool_calc_obj_size@DPDK_2.0 16.04
+ rte_mempool_count@DPDK_2.0 16.04
+ rte_mempool_create@DPDK_2.0 16.04
+ rte_mempool_dump@DPDK_2.0 16.04
+ rte_mempool_list_dump@DPDK_2.0 16.04
+ rte_mempool_lookup@DPDK_2.0 16.04
+ rte_mempool_obj_iter@DPDK_2.0 16.04
+ rte_mempool_walk@DPDK_2.0 16.04
+ rte_mempool_xmem_create@DPDK_2.0 16.04
+ rte_mempool_xmem_size@DPDK_2.0 16.04
+ rte_mempool_xmem_usage@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-meter1.symbols b/debian/libdpdk-librte-meter1.symbols
new file mode 100644
index 00000000..adf2cec1
--- /dev/null
+++ b/debian/libdpdk-librte-meter1.symbols
@@ -0,0 +1,4 @@
+librte_meter.so.1 libdpdk-librte-meter1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ rte_meter_srtcm_config@DPDK_2.0 16.04
+ rte_meter_trtcm_config@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-pipeline3.symbols b/debian/libdpdk-librte-pipeline3.symbols
new file mode 100644
index 00000000..7204deb6
--- /dev/null
+++ b/debian/libdpdk-librte-pipeline3.symbols
@@ -0,0 +1,28 @@
+librte_pipeline.so.3 libdpdk-librte-pipeline3 #MINVER#
+ DPDK_16.04@DPDK_16.04 16.04
+ DPDK_2.0@DPDK_2.0 16.04
+ DPDK_2.1@DPDK_2.1 16.04
+ DPDK_2.2@DPDK_2.2 16.04
+ rte_pipeline_ah_packet_drop@DPDK_16.04 16.04
+ rte_pipeline_ah_packet_hijack@DPDK_16.04 16.04
+ rte_pipeline_check@DPDK_2.0 16.04
+ rte_pipeline_create@DPDK_2.0 16.04
+ rte_pipeline_flush@DPDK_2.0 16.04
+ rte_pipeline_free@DPDK_2.0 16.04
+ rte_pipeline_port_in_connect_to_table@DPDK_2.0 16.04
+ rte_pipeline_port_in_create@DPDK_2.0 16.04
+ rte_pipeline_port_in_disable@DPDK_2.0 16.04
+ rte_pipeline_port_in_enable@DPDK_2.0 16.04
+ rte_pipeline_port_in_stats_read@DPDK_2.1 16.04
+ rte_pipeline_port_out_create@DPDK_2.0 16.04
+ rte_pipeline_port_out_packet_insert@DPDK_2.0 16.04
+ rte_pipeline_port_out_stats_read@DPDK_2.1 16.04
+ rte_pipeline_run@DPDK_2.0 16.04
+ rte_pipeline_table_create@DPDK_2.0 16.04
+ rte_pipeline_table_default_entry_add@DPDK_2.0 16.04
+ rte_pipeline_table_default_entry_delete@DPDK_2.0 16.04
+ rte_pipeline_table_entry_add@DPDK_2.0 16.04
+ rte_pipeline_table_entry_add_bulk@DPDK_2.2 16.04
+ rte_pipeline_table_entry_delete@DPDK_2.0 16.04
+ rte_pipeline_table_entry_delete_bulk@DPDK_2.2 16.04
+ rte_pipeline_table_stats_read@DPDK_2.1 16.04
diff --git a/debian/libdpdk-librte-pmd-af-packet1.symbols b/debian/libdpdk-librte-pmd-af-packet1.symbols
new file mode 100644
index 00000000..d36eb82f
--- /dev/null
+++ b/debian/libdpdk-librte-pmd-af-packet1.symbols
@@ -0,0 +1,2 @@
+librte_pmd_af_packet.so.1 libdpdk-librte-pmd-af-packet1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-pmd-bond1.symbols b/debian/libdpdk-librte-pmd-bond1.symbols
new file mode 100644
index 00000000..57d525ee
--- /dev/null
+++ b/debian/libdpdk-librte-pmd-bond1.symbols
@@ -0,0 +1,20 @@
+librte_pmd_bond.so.1 libdpdk-librte-pmd-bond1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ DPDK_2.1@DPDK_2.1 16.04
+ rte_eth_bond_8023ad_conf_get@DPDK_2.0 16.04
+ rte_eth_bond_8023ad_setup@DPDK_2.0 16.04
+ rte_eth_bond_active_slaves_get@DPDK_2.0 16.04
+ rte_eth_bond_create@DPDK_2.0 16.04
+ rte_eth_bond_free@DPDK_2.1 16.04
+ rte_eth_bond_link_monitoring_set@DPDK_2.0 16.04
+ rte_eth_bond_mac_address_reset@DPDK_2.0 16.04
+ rte_eth_bond_mac_address_set@DPDK_2.0 16.04
+ rte_eth_bond_mode_get@DPDK_2.0 16.04
+ rte_eth_bond_mode_set@DPDK_2.0 16.04
+ rte_eth_bond_primary_get@DPDK_2.0 16.04
+ rte_eth_bond_primary_set@DPDK_2.0 16.04
+ rte_eth_bond_slave_add@DPDK_2.0 16.04
+ rte_eth_bond_slave_remove@DPDK_2.0 16.04
+ rte_eth_bond_slaves_get@DPDK_2.0 16.04
+ rte_eth_bond_xmit_policy_get@DPDK_2.0 16.04
+ rte_eth_bond_xmit_policy_set@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-pmd-cxgbe1.symbols b/debian/libdpdk-librte-pmd-cxgbe1.symbols
new file mode 100644
index 00000000..0b6059e0
--- /dev/null
+++ b/debian/libdpdk-librte-pmd-cxgbe1.symbols
@@ -0,0 +1,2 @@
+librte_pmd_cxgbe.so.1 libdpdk-librte-pmd-cxgbe1 #MINVER#
+ DPDK_2.1@DPDK_2.1 16.04
diff --git a/debian/libdpdk-librte-pmd-e10001.symbols b/debian/libdpdk-librte-pmd-e10001.symbols
new file mode 100644
index 00000000..052ee050
--- /dev/null
+++ b/debian/libdpdk-librte-pmd-e10001.symbols
@@ -0,0 +1,2 @@
+librte_pmd_e1000.so.1 libdpdk-librte-pmd-e10001 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-pmd-ena1.symbols b/debian/libdpdk-librte-pmd-ena1.symbols
new file mode 100644
index 00000000..3684a586
--- /dev/null
+++ b/debian/libdpdk-librte-pmd-ena1.symbols
@@ -0,0 +1,2 @@
+librte_pmd_ena.so.1 libdpdk-librte-pmd-ena1 #MINVER#
+ DPDK_16.04@DPDK_16.04 16.04
diff --git a/debian/libdpdk-librte-pmd-enic1.symbols b/debian/libdpdk-librte-pmd-enic1.symbols
new file mode 100644
index 00000000..2c7c2b64
--- /dev/null
+++ b/debian/libdpdk-librte-pmd-enic1.symbols
@@ -0,0 +1,2 @@
+librte_pmd_enic.so.1 libdpdk-librte-pmd-enic1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-pmd-fm10k1.symbols b/debian/libdpdk-librte-pmd-fm10k1.symbols
new file mode 100644
index 00000000..5cf6b71f
--- /dev/null
+++ b/debian/libdpdk-librte-pmd-fm10k1.symbols
@@ -0,0 +1,2 @@
+librte_pmd_fm10k.so.1 libdpdk-librte-pmd-fm10k1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-pmd-i40e1.symbols b/debian/libdpdk-librte-pmd-i40e1.symbols
new file mode 100644
index 00000000..61a933bc
--- /dev/null
+++ b/debian/libdpdk-librte-pmd-i40e1.symbols
@@ -0,0 +1,2 @@
+librte_pmd_i40e.so.1 libdpdk-librte-pmd-i40e1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-pmd-ixgbe1.symbols b/debian/libdpdk-librte-pmd-ixgbe1.symbols
new file mode 100644
index 00000000..5ee113c9
--- /dev/null
+++ b/debian/libdpdk-librte-pmd-ixgbe1.symbols
@@ -0,0 +1,2 @@
+librte_pmd_ixgbe.so.1 libdpdk-librte-pmd-ixgbe1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-pmd-null-crypto1.symbols b/debian/libdpdk-librte-pmd-null-crypto1.symbols
new file mode 100644
index 00000000..487b0f8a
--- /dev/null
+++ b/debian/libdpdk-librte-pmd-null-crypto1.symbols
@@ -0,0 +1,2 @@
+librte_pmd_null_crypto.so.1 libdpdk-librte-pmd-null-crypto1 #MINVER#
+ DPDK_16.04@DPDK_16.04 16.04
diff --git a/debian/libdpdk-librte-pmd-null1.symbols b/debian/libdpdk-librte-pmd-null1.symbols
new file mode 100644
index 00000000..19ffeb64
--- /dev/null
+++ b/debian/libdpdk-librte-pmd-null1.symbols
@@ -0,0 +1,4 @@
+librte_pmd_null.so.1 libdpdk-librte-pmd-null1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ DPDK_2.2@DPDK_2.2 16.04
+ eth_dev_null_create@DPDK_2.2 16.04
diff --git a/debian/libdpdk-librte-pmd-pcap1.symbols b/debian/libdpdk-librte-pmd-pcap1.symbols
new file mode 100644
index 00000000..4aaa6cd5
--- /dev/null
+++ b/debian/libdpdk-librte-pmd-pcap1.symbols
@@ -0,0 +1,2 @@
+librte_pmd_pcap.so.1 libdpdk-librte-pmd-pcap1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-pmd-ring2.symbols b/debian/libdpdk-librte-pmd-ring2.symbols
new file mode 100644
index 00000000..bca62702
--- /dev/null
+++ b/debian/libdpdk-librte-pmd-ring2.symbols
@@ -0,0 +1,5 @@
+librte_pmd_ring.so.2 libdpdk-librte-pmd-ring2 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ DPDK_2.2@DPDK_2.2 16.04
+ rte_eth_from_ring@DPDK_2.2 16.04
+ rte_eth_from_rings@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-pmd-vhost1.symbols b/debian/libdpdk-librte-pmd-vhost1.symbols
new file mode 100644
index 00000000..3253224d
--- /dev/null
+++ b/debian/libdpdk-librte-pmd-vhost1.symbols
@@ -0,0 +1,6 @@
+librte_pmd_vhost.so.1 libdpdk-librte-pmd-vhost1 #MINVER#
+ DPDK_16.04@DPDK_16.04 16.04
+ rte_eth_vhost_feature_disable@DPDK_16.04 16.04
+ rte_eth_vhost_feature_enable@DPDK_16.04 16.04
+ rte_eth_vhost_feature_get@DPDK_16.04 16.04
+ rte_eth_vhost_get_queue_event@DPDK_16.04 16.04
diff --git a/debian/libdpdk-librte-pmd-virtio1.symbols b/debian/libdpdk-librte-pmd-virtio1.symbols
new file mode 100644
index 00000000..41f3e77f
--- /dev/null
+++ b/debian/libdpdk-librte-pmd-virtio1.symbols
@@ -0,0 +1,2 @@
+librte_pmd_virtio.so.1 libdpdk-librte-pmd-virtio1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-pmd-vmxnet3-uio1.symbols b/debian/libdpdk-librte-pmd-vmxnet3-uio1.symbols
new file mode 100644
index 00000000..4a3fb965
--- /dev/null
+++ b/debian/libdpdk-librte-pmd-vmxnet3-uio1.symbols
@@ -0,0 +1,2 @@
+librte_pmd_vmxnet3_uio.so.1 libdpdk-librte-pmd-vmxnet3-uio1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-pmd-xenvirt1.symbols b/debian/libdpdk-librte-pmd-xenvirt1.symbols
new file mode 100644
index 00000000..76f116e1
--- /dev/null
+++ b/debian/libdpdk-librte-pmd-xenvirt1.symbols
@@ -0,0 +1,3 @@
+librte_pmd_xenvirt.so.1 libdpdk-librte-pmd-xenvirt1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ rte_mempool_gntalloc_create@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-port2.symbols b/debian/libdpdk-librte-port2.symbols
new file mode 100644
index 00000000..c94782a2
--- /dev/null
+++ b/debian/libdpdk-librte-port2.symbols
@@ -0,0 +1,21 @@
+librte_port.so.2 libdpdk-librte-port2 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ DPDK_2.1@DPDK_2.1 16.04
+ DPDK_2.2@DPDK_2.2 16.04
+ rte_port_ethdev_reader_ops@DPDK_2.0 16.04
+ rte_port_ethdev_writer_nodrop_ops@DPDK_2.1 16.04
+ rte_port_ethdev_writer_ops@DPDK_2.0 16.04
+ rte_port_ring_multi_reader_ops@DPDK_2.2 16.04
+ rte_port_ring_multi_writer_nodrop_ops@DPDK_2.2 16.04
+ rte_port_ring_multi_writer_ops@DPDK_2.2 16.04
+ rte_port_ring_reader_ipv4_frag_ops@DPDK_2.0 16.04
+ rte_port_ring_reader_ipv6_frag_ops@DPDK_2.1 16.04
+ rte_port_ring_reader_ops@DPDK_2.0 16.04
+ rte_port_ring_writer_ipv4_ras_ops@DPDK_2.0 16.04
+ rte_port_ring_writer_ipv6_ras_ops@DPDK_2.1 16.04
+ rte_port_ring_writer_nodrop_ops@DPDK_2.1 16.04
+ rte_port_ring_writer_ops@DPDK_2.0 16.04
+ rte_port_sched_reader_ops@DPDK_2.0 16.04
+ rte_port_sched_writer_ops@DPDK_2.0 16.04
+ rte_port_sink_ops@DPDK_2.0 16.04
+ rte_port_source_ops@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-power1.symbols b/debian/libdpdk-librte-power1.symbols
new file mode 100644
index 00000000..22117859
--- /dev/null
+++ b/debian/libdpdk-librte-power1.symbols
@@ -0,0 +1,14 @@
+librte_power.so.1 libdpdk-librte-power1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ rte_power_exit@DPDK_2.0 16.04
+ rte_power_freq_down@DPDK_2.0 16.04
+ rte_power_freq_max@DPDK_2.0 16.04
+ rte_power_freq_min@DPDK_2.0 16.04
+ rte_power_freq_up@DPDK_2.0 16.04
+ rte_power_freqs@DPDK_2.0 16.04
+ rte_power_get_env@DPDK_2.0 16.04
+ rte_power_get_freq@DPDK_2.0 16.04
+ rte_power_init@DPDK_2.0 16.04
+ rte_power_set_env@DPDK_2.0 16.04
+ rte_power_set_freq@DPDK_2.0 16.04
+ rte_power_unset_env@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-reorder1.symbols b/debian/libdpdk-librte-reorder1.symbols
new file mode 100644
index 00000000..24d5cd2a
--- /dev/null
+++ b/debian/libdpdk-librte-reorder1.symbols
@@ -0,0 +1,9 @@
+librte_reorder.so.1 libdpdk-librte-reorder1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ rte_reorder_create@DPDK_2.0 16.04
+ rte_reorder_drain@DPDK_2.0 16.04
+ rte_reorder_find_existing@DPDK_2.0 16.04
+ rte_reorder_free@DPDK_2.0 16.04
+ rte_reorder_init@DPDK_2.0 16.04
+ rte_reorder_insert@DPDK_2.0 16.04
+ rte_reorder_reset@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-ring1.symbols b/debian/libdpdk-librte-ring1.symbols
new file mode 100644
index 00000000..29c8b9e9
--- /dev/null
+++ b/debian/libdpdk-librte-ring1.symbols
@@ -0,0 +1,11 @@
+librte_ring.so.1 libdpdk-librte-ring1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ DPDK_2.2@DPDK_2.2 16.04
+ rte_ring_create@DPDK_2.0 16.04
+ rte_ring_dump@DPDK_2.0 16.04
+ rte_ring_free@DPDK_2.2 16.04
+ rte_ring_get_memsize@DPDK_2.0 16.04
+ rte_ring_init@DPDK_2.0 16.04
+ rte_ring_list_dump@DPDK_2.0 16.04
+ rte_ring_lookup@DPDK_2.0 16.04
+ rte_ring_set_water_mark@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-sched1.symbols b/debian/libdpdk-librte-sched1.symbols
new file mode 100644
index 00000000..100829a6
--- /dev/null
+++ b/debian/libdpdk-librte-sched1.symbols
@@ -0,0 +1,22 @@
+librte_sched.so.1 libdpdk-librte-sched1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ DPDK_2.1@DPDK_2.1 16.04
+ rte_approx@DPDK_2.0 16.04
+ rte_red_config_init@DPDK_2.0 16.04
+ rte_red_log2_1_minus_Wq@DPDK_2.0 16.04
+ rte_red_pow2_frac_inv@DPDK_2.0 16.04
+ rte_red_rand_seed@DPDK_2.0 16.04
+ rte_red_rand_val@DPDK_2.0 16.04
+ rte_red_rt_data_init@DPDK_2.0 16.04
+ rte_sched_pipe_config@DPDK_2.0 16.04
+ rte_sched_port_config@DPDK_2.0 16.04
+ rte_sched_port_dequeue@DPDK_2.0 16.04
+ rte_sched_port_enqueue@DPDK_2.0 16.04
+ rte_sched_port_free@DPDK_2.0 16.04
+ rte_sched_port_get_memory_footprint@DPDK_2.0 16.04
+ rte_sched_port_pkt_read_color@DPDK_2.1 16.04
+ rte_sched_port_pkt_read_tree_path@DPDK_2.1 16.04
+ rte_sched_port_pkt_write@DPDK_2.1 16.04
+ rte_sched_queue_read_stats@DPDK_2.0 16.04
+ rte_sched_subport_config@DPDK_2.0 16.04
+ rte_sched_subport_read_stats@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-table2.symbols b/debian/libdpdk-librte-table2.symbols
new file mode 100644
index 00000000..89dc550d
--- /dev/null
+++ b/debian/libdpdk-librte-table2.symbols
@@ -0,0 +1,19 @@
+librte_table.so.2 libdpdk-librte-table2 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ DPDK_2.2@DPDK_2.2 16.04
+ rte_table_acl_ops@DPDK_2.0 16.04
+ rte_table_array_ops@DPDK_2.0 16.04
+ rte_table_hash_ext_ops@DPDK_2.0 16.04
+ rte_table_hash_key16_ext_dosig_ops@DPDK_2.2 16.04
+ rte_table_hash_key16_ext_ops@DPDK_2.0 16.04
+ rte_table_hash_key16_lru_ops@DPDK_2.0 16.04
+ rte_table_hash_key32_ext_ops@DPDK_2.0 16.04
+ rte_table_hash_key32_lru_ops@DPDK_2.0 16.04
+ rte_table_hash_key8_ext_dosig_ops@DPDK_2.0 16.04
+ rte_table_hash_key8_ext_ops@DPDK_2.0 16.04
+ rte_table_hash_key8_lru_dosig_ops@DPDK_2.0 16.04
+ rte_table_hash_key8_lru_ops@DPDK_2.0 16.04
+ rte_table_hash_lru_ops@DPDK_2.0 16.04
+ rte_table_lpm_ipv6_ops@DPDK_2.0 16.04
+ rte_table_lpm_ops@DPDK_2.0 16.04
+ rte_table_stub_ops@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-timer1.symbols b/debian/libdpdk-librte-timer1.symbols
new file mode 100644
index 00000000..9e82b0e7
--- /dev/null
+++ b/debian/libdpdk-librte-timer1.symbols
@@ -0,0 +1,11 @@
+librte_timer.so.1 libdpdk-librte-timer1 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ rte_timer_dump_stats@DPDK_2.0 16.04
+ rte_timer_init@DPDK_2.0 16.04
+ rte_timer_manage@DPDK_2.0 16.04
+ rte_timer_pending@DPDK_2.0 16.04
+ rte_timer_reset@DPDK_2.0 16.04
+ rte_timer_reset_sync@DPDK_2.0 16.04
+ rte_timer_stop@DPDK_2.0 16.04
+ rte_timer_stop_sync@DPDK_2.0 16.04
+ rte_timer_subsystem_init@DPDK_2.0 16.04
diff --git a/debian/libdpdk-librte-vhost2.symbols b/debian/libdpdk-librte-vhost2.symbols
new file mode 100644
index 00000000..e9382717
--- /dev/null
+++ b/debian/libdpdk-librte-vhost2.symbols
@@ -0,0 +1,13 @@
+librte_vhost.so.2 libdpdk-librte-vhost2 #MINVER#
+ DPDK_2.0@DPDK_2.0 16.04
+ DPDK_2.1@DPDK_2.1 16.04
+ rte_vhost_dequeue_burst@DPDK_2.0 16.04
+ rte_vhost_driver_callback_register@DPDK_2.0 16.04
+ rte_vhost_driver_register@DPDK_2.0 16.04
+ rte_vhost_driver_session_start@DPDK_2.0 16.04
+ rte_vhost_driver_unregister@DPDK_2.1 16.04
+ rte_vhost_enable_guest_notification@DPDK_2.0 16.04
+ rte_vhost_enqueue_burst@DPDK_2.0 16.04
+ rte_vhost_feature_disable@DPDK_2.0 16.04
+ rte_vhost_feature_enable@DPDK_2.0 16.04
+ rte_vhost_feature_get@DPDK_2.0 16.04
diff --git a/debian/libdpdk0.dirs b/debian/libdpdk0.dirs
new file mode 100644
index 00000000..68457717
--- /dev/null
+++ b/debian/libdpdk0.dirs
@@ -0,0 +1 @@
+usr/lib
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 00000000..baab84f9
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1,12 @@
+ubuntu-backport-33-vhost-user-add-error-handling-for-fd-1023.patch
+ubuntu-backport-38-dpdk-dev-Memory-leak-when-adding-removing-vhost_user-ports.patch
+ubuntu-fix-vhost-user-socket-permission.patch
+ubuntu-backport-39-lpm-fix-freeing-in-compatibility-mode.patch
+ubuntu-fix-xenvirt-support-dynamic-page-size.patch
+ubuntu-backport-40-linking-fixes-stage-1-4.patch
+ubuntu-backport-40-linking-fixes-stage-2-4.patch
+ubuntu-backport-40-linking-fixes-stage-3-4.patch
+ubuntu-backport-40-linking-fixes-stage-4-4.patch
+ubuntu-backport-41-fix-install-tar-1.29.patch
+ubuntu-backport-42-increase-default-logging-level.patch
+ubuntu-backport-43-fix-level-type-retrieving.patch
diff --git a/debian/patches/ubuntu-backport-33-vhost-user-add-error-handling-for-fd-1023.patch b/debian/patches/ubuntu-backport-33-vhost-user-add-error-handling-for-fd-1023.patch
new file mode 100644
index 00000000..ea1ff75b
--- /dev/null
+++ b/debian/patches/ubuntu-backport-33-vhost-user-add-error-handling-for-fd-1023.patch
@@ -0,0 +1,141 @@
+Description: backport of dpdk fix for LP: #1566874
+
+Forwarded: n/a (already discussed upstream)
+Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
+Last-Update: 2016-04-11
+
+Extended by Christian Ehrhardt <christian.ehrhardt@canonical.com>
+Close fd on vserver->listenfd (Part of the upstream discussion)
+
+Original:
+From: Patrik Andersson <patrik.r.andersson@ericsson.com>
+
+Protect against DPDK crash when allocation of listen fd >= 1023.
+For events on fd:s >1023, the current implementation will trigger
+an abort due to access outside of allocated bit mask.
+
+Corrections would include:
+
+ * Match fdset_add() signature in fd_man.c to fd_man.h
+ * Handling of return codes from fdset_add()
+ * Addition of check of fd number in fdset_add_fd()
+
+The rationale behind the suggested code change is that,
+fdset_event_dispatch() could attempt access outside of the FD_SET
+bitmask if there is an event on a file descriptor that in turn
+looks up a virtio file descriptor with a value > 1023.
+Such an attempt will lead to an abort() and a restart of any
+vswitch using DPDK.
+
+A discussion topic exist in the ovs-discuss mailing list that can
+provide a little more background:
+
+http://openvswitch.org/pipermail/discuss/2016-February/020243.html
+
+Signed-off-by: Patrik Andersson <patrik.r.andersson@ericsson.com>
+---
+ fd_man.c | 11 ++++++-----
+ vhost-net-user.c | 23 +++++++++++++++++++++--
+ 2 files changed, 27 insertions(+), 7 deletions(-)
+
+Index: dpdk/lib/librte_vhost/vhost_user/fd_man.c
+===================================================================
+--- dpdk.orig/lib/librte_vhost/vhost_user/fd_man.c
++++ dpdk/lib/librte_vhost/vhost_user/fd_man.c
+@@ -71,20 +71,22 @@ fdset_find_free_slot(struct fdset *pfdse
+ return fdset_find_fd(pfdset, -1);
+ }
+
+-static void
++static int
+ fdset_add_fd(struct fdset *pfdset, int idx, int fd,
+ fd_cb rcb, fd_cb wcb, void *dat)
+ {
+ struct fdentry *pfdentry;
+
+- if (pfdset == NULL || idx >= MAX_FDS)
+- return;
++ if (pfdset == NULL || idx >= MAX_FDS || fd >= FD_SETSIZE)
++ return -1;
+
+ pfdentry = &pfdset->fd[idx];
+ pfdentry->fd = fd;
+ pfdentry->rcb = rcb;
+ pfdentry->wcb = wcb;
+ pfdentry->dat = dat;
++
++ return 0;
+ }
+
+ /**
+@@ -150,12 +152,11 @@ fdset_add(struct fdset *pfdset, int fd,
+
+ /* Find a free slot in the list. */
+ i = fdset_find_free_slot(pfdset);
+- if (i == -1) {
++ if (i == -1 || fdset_add_fd(pfdset, i, fd, rcb, wcb, dat) < 0) {
+ pthread_mutex_unlock(&pfdset->fd_mutex);
+ return -2;
+ }
+
+- fdset_add_fd(pfdset, i, fd, rcb, wcb, dat);
+ pfdset->num++;
+
+ pthread_mutex_unlock(&pfdset->fd_mutex);
+Index: dpdk/lib/librte_vhost/vhost_user/vhost-net-user.c
+===================================================================
+--- dpdk.orig/lib/librte_vhost/vhost_user/vhost-net-user.c
++++ dpdk/lib/librte_vhost/vhost_user/vhost-net-user.c
+@@ -288,6 +288,7 @@ vserver_new_vq_conn(int fd, void *dat, _
+ int fh;
+ struct vhost_device_ctx vdev_ctx = { (pid_t)0, 0 };
+ unsigned int size;
++ int ret;
+
+ conn_fd = accept(fd, NULL, NULL);
+ RTE_LOG(INFO, VHOST_CONFIG,
+@@ -317,8 +318,15 @@ vserver_new_vq_conn(int fd, void *dat, _
+
+ ctx->vserver = vserver;
+ ctx->fh = fh;
+- fdset_add(&g_vhost_server.fdset,
++ ret = fdset_add(&g_vhost_server.fdset,
+ conn_fd, vserver_message_handler, NULL, ctx);
++ if (ret < 0) {
++ free(ctx);
++ close(conn_fd);
++ RTE_LOG(ERR, VHOST_CONFIG,
++ "failed to add fd %d into vhost server fdset\n",
++ conn_fd);
++ }
+ }
+
+ /* callback when there is message on the connfd */
+@@ -453,6 +461,7 @@ int
+ rte_vhost_driver_register(const char *path)
+ {
+ struct vhost_server *vserver;
++ int ret;
+
+ pthread_mutex_lock(&g_vhost_server.server_mutex);
+
+@@ -478,8 +487,18 @@ rte_vhost_driver_register(const char *pa
+
+ vserver->path = strdup(path);
+
+- fdset_add(&g_vhost_server.fdset, vserver->listenfd,
++ ret = fdset_add(&g_vhost_server.fdset, vserver->listenfd,
+ vserver_new_vq_conn, NULL, vserver);
++ if (ret < 0) {
++ pthread_mutex_unlock(&g_vhost_server.server_mutex);
++ RTE_LOG(ERR, VHOST_CONFIG,
++ "failed to add listen fd %d to vhost server fdset\n",
++ vserver->listenfd);
++ close(vserver->listenfd);
++ free(vserver->path);
++ free(vserver);
++ return -1;
++ }
+
+ g_vhost_server.server[g_vhost_server.vserver_cnt++] = vserver;
+ pthread_mutex_unlock(&g_vhost_server.server_mutex);
diff --git a/debian/patches/ubuntu-backport-38-dpdk-dev-Memory-leak-when-adding-removing-vhost_user-ports.patch b/debian/patches/ubuntu-backport-38-dpdk-dev-Memory-leak-when-adding-removing-vhost_user-ports.patch
new file mode 100644
index 00000000..b756d8ff
--- /dev/null
+++ b/debian/patches/ubuntu-backport-38-dpdk-dev-Memory-leak-when-adding-removing-vhost_user-ports.patch
@@ -0,0 +1,63 @@
+Description: backport of dpdk 16.07 fix for LP: #1570466
+
+Backported from this discussion
+http://dpdk.org/dev/patchwork/patch/12103/
+Not accepted yet, but likely to be accepted in some form once tested and
+confirmed.
+
+Update 2016-05-17:
+Moving to 16.04 this now applies as-is without modifications, dropping the
+former backport changes.
+
+Also along the discussion vserver-fh is now initialized with -1 to avoid
+accidentially deleting the first connected port if we delete another not yet
+connected port.
+
+Forwarded: yes (based on an upstream discussion)
+Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
+Last-Update: 2016-05-17
+
+Index: dpdk/lib/librte_vhost/vhost_user/vhost-net-user.c
+===================================================================
+--- dpdk.orig/lib/librte_vhost/vhost_user/vhost-net-user.c
++++ dpdk/lib/librte_vhost/vhost_user/vhost-net-user.c
+@@ -310,6 +310,7 @@ vserver_new_vq_conn(int fd, void *dat, _
+ }
+
+ vdev_ctx.fh = fh;
++ vserver->fh = fh;
+ size = strnlen(vserver->path, PATH_MAX);
+ vhost_set_ifname(vdev_ctx, vserver->path,
+ size);
+@@ -486,6 +487,7 @@ rte_vhost_driver_register(const char *pa
+ }
+
+ vserver->path = strdup(path);
++ vserver->fh = -1;
+
+ ret = fdset_add(&g_vhost_server.fdset, vserver->listenfd,
+ vserver_new_vq_conn, NULL, vserver);
+@@ -520,6 +522,11 @@ rte_vhost_driver_unregister(const char *
+
+ for (i = 0; i < g_vhost_server.vserver_cnt; i++) {
+ if (!strcmp(g_vhost_server.server[i]->path, path)) {
++ struct vhost_device_ctx ctx;
++
++ ctx.fh = g_vhost_server.server[i]->fh;
++ vhost_destroy_device(ctx);
++
+ fdset_del(&g_vhost_server.fdset,
+ g_vhost_server.server[i]->listenfd);
+
+Index: dpdk/lib/librte_vhost/vhost_user/vhost-net-user.h
+===================================================================
+--- dpdk.orig/lib/librte_vhost/vhost_user/vhost-net-user.h
++++ dpdk/lib/librte_vhost/vhost_user/vhost-net-user.h
+@@ -43,6 +43,7 @@
+ struct vhost_server {
+ char *path; /**< The path the uds is bind to. */
+ int listenfd; /**< The listener sockfd. */
++ uint32_t fh;
+ };
+
+ /* refer to hw/virtio/vhost-user.c */
diff --git a/debian/patches/ubuntu-backport-39-lpm-fix-freeing-in-compatibility-mode.patch b/debian/patches/ubuntu-backport-39-lpm-fix-freeing-in-compatibility-mode.patch
new file mode 100644
index 00000000..4224cad8
--- /dev/null
+++ b/debian/patches/ubuntu-backport-39-lpm-fix-freeing-in-compatibility-mode.patch
@@ -0,0 +1,52 @@
+Description: backport of dpdk 16.07 fix 7cc3f2c2
+
+Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
+Date: Tue Apr 12 15:49:27 2016 +0200
+
+ lpm: fix freeing in compatibility mode
+
+ Back then when we fixed the missing free lpm I was to quickly to say yes
+ if it applies not only to the lpm6 but also to all of the lpm code.
+
+ It turned out to not apply to all of them. In rte_lpm_create_v20 there
+ is an unexpected fused allocation:
+ mem_size = sizeof(*lpm) + (sizeof(lpm->rules_tbl[0]) * max_rules);
+ [...]
+ lpm = (struct rte_lpm_v20 *)rte_zmalloc_socket(mem_name,mem_size,
+ RTE_CACHE_LINE_SIZE, socket_id);
+
+ That causes lpm->rules_tbl not to have an own struct malloc_elem that
+ can be derived via RTE_PTR_SUB(data, MALLOC_ELEM_HEADER_LEN) in
+ malloc_elem_from_data.
+ Due to that the rte_lpm_free_v20 accidentially misderives the elem and
+ assumes it is ELEM_FREE triggering in malloc_elem_free
+ if (!malloc_elem_cookies_ok(elem) || elem->state !=
+ return -1;
+
+ While it seems counter-intuitive the way to properly remove rules_tbl in
+ the old fused allocation style of rte_lpm_free_v20 is to not remove it.
+
+ The newer rte_lpm_free_v1604 is safe because in rte_lpm_create_v1604
+ rules_tbl is a separate allocation.
+
+ Fixes: d4c18f0a1d5d ("lpm: fix missing free")
+
+ Signed-off-by: Christian Ehrhardt <christian.ehrhardt@canonical.com>
+ Acked-by: Olivier Matz <olivier.matz@6wind.com>
+
+Forwarded: yes (in DPDK 16.07)
+Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
+Last-Update: 2016-05-17
+
+Index: dpdk/lib/librte_lpm/rte_lpm.c
+===================================================================
+--- dpdk.orig/lib/librte_lpm/rte_lpm.c
++++ dpdk/lib/librte_lpm/rte_lpm.c
+@@ -373,7 +373,6 @@ rte_lpm_free_v20(struct rte_lpm_v20 *lpm
+
+ rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK);
+
+- rte_free(lpm->rules_tbl);
+ rte_free(lpm);
+ rte_free(te);
+ }
diff --git a/debian/patches/ubuntu-backport-40-linking-fixes-stage-1-4.patch b/debian/patches/ubuntu-backport-40-linking-fixes-stage-1-4.patch
new file mode 100644
index 00000000..5336cd49
--- /dev/null
+++ b/debian/patches/ubuntu-backport-40-linking-fixes-stage-1-4.patch
@@ -0,0 +1,101 @@
+Description: backport of dpdk 16.07 fix for library underlinking - stage 1/4
+
+This is a merge of related upstream fixes:
+- c6417ce6: mk: add build-time library directory to linker path
+- aace9d0b: mk: cleanup leftover references to malloc library
+- bf5a46fa: mk: generate internal library dependencies
+
+Forwarded: yes (in DPDK 16.07)
+Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
+Last-Update: 2016-06-14
+
+Index: dpdk/drivers/net/cxgbe/Makefile
+===================================================================
+--- dpdk.orig/drivers/net/cxgbe/Makefile
++++ dpdk/drivers/net/cxgbe/Makefile
+@@ -82,6 +82,6 @@ SRCS-$(CONFIG_RTE_LIBRTE_CXGBE_PMD) += t
+ # this lib depends upon:
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_CXGBE_PMD) += lib/librte_eal lib/librte_ether
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_CXGBE_PMD) += lib/librte_mempool lib/librte_mbuf
+-DEPDIRS-$(CONFIG_RTE_LIBRTE_CXGBE_PMD) += lib/librte_net lib/librte_malloc
++DEPDIRS-$(CONFIG_RTE_LIBRTE_CXGBE_PMD) += lib/librte_net
+
+ include $(RTE_SDK)/mk/rte.lib.mk
+Index: dpdk/drivers/net/ena/Makefile
+===================================================================
+--- dpdk.orig/drivers/net/ena/Makefile
++++ dpdk/drivers/net/ena/Makefile
+@@ -54,7 +54,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_ENA_PMD) += ena
+ # this lib depends upon:
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_ENA_PMD) += lib/librte_eal lib/librte_ether
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_ENA_PMD) += lib/librte_mempool lib/librte_mbuf
+-DEPDIRS-$(CONFIG_RTE_LIBRTE_ENA_PMD) += lib/librte_net lib/librte_malloc
++DEPDIRS-$(CONFIG_RTE_LIBRTE_ENA_PMD) += lib/librte_net
+
+ CFLAGS += $(INCLUDES)
+
+Index: dpdk/drivers/net/mpipe/Makefile
+===================================================================
+--- dpdk.orig/drivers/net/mpipe/Makefile
++++ dpdk/drivers/net/mpipe/Makefile
+@@ -42,6 +42,6 @@ SRCS-$(CONFIG_RTE_LIBRTE_MPIPE_PMD) += m
+
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_MPIPE_PMD) += lib/librte_eal lib/librte_ether
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_MPIPE_PMD) += lib/librte_mempool lib/librte_mbuf
+-DEPDIRS-$(CONFIG_RTE_LIBRTE_MPIPE_PMD) += lib/librte_net lib/librte_malloc
++DEPDIRS-$(CONFIG_RTE_LIBRTE_MPIPE_PMD) += lib/librte_net
+
+ include $(RTE_SDK)/mk/rte.lib.mk
+Index: dpdk/drivers/net/nfp/Makefile
+===================================================================
+--- dpdk.orig/drivers/net/nfp/Makefile
++++ dpdk/drivers/net/nfp/Makefile
+@@ -53,6 +53,6 @@ SRCS-$(CONFIG_RTE_LIBRTE_NFP_PMD) += nfp
+ # this lib depends upon:
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_NFP_PMD) += lib/librte_eal lib/librte_ether
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_NFP_PMD) += lib/librte_mempool lib/librte_mbuf
+-DEPDIRS-$(CONFIG_RTE_LIBRTE_NFP_PMD) += lib/librte_net lib/librte_malloc
++DEPDIRS-$(CONFIG_RTE_LIBRTE_NFP_PMD) += lib/librte_net
+
+ include $(RTE_SDK)/mk/rte.lib.mk
+Index: dpdk/drivers/net/szedata2/Makefile
+===================================================================
+--- dpdk.orig/drivers/net/szedata2/Makefile
++++ dpdk/drivers/net/szedata2/Makefile
+@@ -57,7 +57,6 @@ SYMLINK-y-include +=
+ # this lib depends upon:
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_SZEDATA2) += lib/librte_mbuf
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_SZEDATA2) += lib/librte_ether
+-DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_SZEDATA2) += lib/librte_malloc
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_SZEDATA2) += lib/librte_kvargs
+
+ include $(RTE_SDK)/mk/rte.lib.mk
+Index: dpdk/mk/rte.lib.mk
+===================================================================
+--- dpdk.orig/mk/rte.lib.mk
++++ dpdk/mk/rte.lib.mk
+@@ -77,6 +77,13 @@ else
+ _CPU_LDFLAGS := $(CPU_LDFLAGS)
+ endif
+
++# Translate DEPDIRS-y into LDLIBS
++# Ignore (sub)directory dependencies which do not provide an actual library
++_IGNORE_DIRS = lib/librte_eal/% lib/librte_net lib/librte_compat
++_DEPDIRS = $(filter-out $(_IGNORE_DIRS),$(DEPDIRS-y))
++_LDDIRS = $(subst librte_ether,libethdev,$(_DEPDIRS))
++LDLIBS += $(subst lib/lib,-l,$(_LDDIRS))
++
+ O_TO_A = $(AR) crDs $(LIB) $(OBJS-y)
+ O_TO_A_STR = $(subst ','\'',$(O_TO_A)) #'# fix syntax highlight
+ O_TO_A_DISP = $(if $(V),"$(O_TO_A_STR)"," AR $(@)")
+@@ -86,8 +93,8 @@ O_TO_A_DO = @set -e; \
+ $(O_TO_A) && \
+ echo $(O_TO_A_CMD) > $(call exe2cmd,$(@))
+
+-O_TO_S = $(LD) $(_CPU_LDFLAGS) $(EXTRA_LDFLAGS) -shared $(OBJS-y) $(LDLIBS) \
+- -Wl,-soname,$(LIB) -o $(LIB)
++O_TO_S = $(LD) -L$(RTE_OUTPUT)/lib $(_CPU_LDFLAGS) $(EXTRA_LDFLAGS) \
++ -shared $(OBJS-y) $(LDLIBS) -Wl,-soname,$(LIB) -o $(LIB)
+ O_TO_S_STR = $(subst ','\'',$(O_TO_S)) #'# fix syntax highlight
+ O_TO_S_DISP = $(if $(V),"$(O_TO_S_STR)"," LD $(@)")
+ O_TO_S_DO = @set -e; \
diff --git a/debian/patches/ubuntu-backport-40-linking-fixes-stage-2-4.patch b/debian/patches/ubuntu-backport-40-linking-fixes-stage-2-4.patch
new file mode 100644
index 00000000..30ca0d50
--- /dev/null
+++ b/debian/patches/ubuntu-backport-40-linking-fixes-stage-2-4.patch
@@ -0,0 +1,556 @@
+Description: backport of dpdk 16.07 fix for library underlinking - stage 2/4
+
+This is a merge of related upstream fixes:
+- a3f34a98 log: deprecate history dump
+- 3037e5e2 eal: remove useless includes of mempool and ring
+
+Forwarded: yes (in DPDK 16.07)
+Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
+Last-Update: 2016-06-14
+
+Index: dpdk/app/test-pmd/cmdline.c
+===================================================================
+--- dpdk.orig/app/test-pmd/cmdline.c
++++ dpdk/app/test-pmd/cmdline.c
+@@ -7191,8 +7191,6 @@ static void cmd_dump_parsed(void *parsed
+ rte_dump_physmem_layout(stdout);
+ else if (!strcmp(res->dump, "dump_memzone"))
+ rte_memzone_dump(stdout);
+- else if (!strcmp(res->dump, "dump_log_history"))
+- rte_log_dump_history(stdout);
+ else if (!strcmp(res->dump, "dump_struct_sizes"))
+ dump_struct_sizes();
+ else if (!strcmp(res->dump, "dump_ring"))
+@@ -7207,7 +7205,6 @@ cmdline_parse_token_string_t cmd_dump_du
+ TOKEN_STRING_INITIALIZER(struct cmd_dump_result, dump,
+ "dump_physmem#"
+ "dump_memzone#"
+- "dump_log_history#"
+ "dump_struct_sizes#"
+ "dump_ring#"
+ "dump_mempool#"
+Index: dpdk/app/test/autotest_data.py
+===================================================================
+--- dpdk.orig/app/test/autotest_data.py
++++ dpdk/app/test/autotest_data.py
+@@ -88,12 +88,6 @@ parallel_test_group_list = [
+ "Report" : None,
+ },
+ {
+- "Name" : "Dump log history",
+- "Command" : "dump_log_history",
+- "Func" : dump_autotest,
+- "Report" : None,
+- },
+- {
+ "Name" : "Dump rings",
+ "Command" : "dump_ring",
+ "Func" : dump_autotest,
+Index: dpdk/app/test/autotest_test_funcs.py
+===================================================================
+--- dpdk.orig/app/test/autotest_test_funcs.py
++++ dpdk/app/test/autotest_test_funcs.py
+@@ -151,12 +151,6 @@ def logs_autotest(child, test_name):
+ "TESTAPP2: this is a info level message",
+ "TESTAPP2: this is a warning level message",
+ "TESTAPP1: this is a debug level message",
+- "TESTAPP1: this is a debug level message",
+- "TESTAPP1: this is a info level message",
+- "TESTAPP1: this is a warning level message",
+- "TESTAPP2: this is a info level message",
+- "TESTAPP2: this is a warning level message",
+- "TESTAPP1: this is a debug level message",
+ ]
+
+ for log_msg in log_list:
+Index: dpdk/app/test/commands.c
+===================================================================
+--- dpdk.orig/app/test/commands.c
++++ dpdk/app/test/commands.c
+@@ -150,8 +150,6 @@ static void cmd_dump_parsed(void *parsed
+ rte_dump_physmem_layout(stdout);
+ else if (!strcmp(res->dump, "dump_memzone"))
+ rte_memzone_dump(stdout);
+- else if (!strcmp(res->dump, "dump_log_history"))
+- rte_log_dump_history(stdout);
+ else if (!strcmp(res->dump, "dump_struct_sizes"))
+ dump_struct_sizes();
+ else if (!strcmp(res->dump, "dump_ring"))
+@@ -164,7 +162,7 @@ static void cmd_dump_parsed(void *parsed
+
+ cmdline_parse_token_string_t cmd_dump_dump =
+ TOKEN_STRING_INITIALIZER(struct cmd_dump_result, dump,
+- "dump_physmem#dump_memzone#dump_log_history#"
++ "dump_physmem#dump_memzone#"
+ "dump_struct_sizes#dump_ring#dump_mempool#"
+ "dump_devargs");
+
+Index: dpdk/app/test/test_logs.c
+===================================================================
+--- dpdk.orig/app/test/test_logs.c
++++ dpdk/app/test/test_logs.c
+@@ -85,8 +85,6 @@ test_logs(void)
+ RTE_LOG(DEBUG, TESTAPP1, "this is a debug level message\n");
+ RTE_LOG(DEBUG, TESTAPP2, "debug level message (not displayed)\n");
+
+- rte_log_dump_history(stdout);
+-
+ return 0;
+ }
+
+Index: dpdk/doc/guides/prog_guide/mempool_lib.rst
+===================================================================
+--- dpdk.orig/doc/guides/prog_guide/mempool_lib.rst
++++ dpdk/doc/guides/prog_guide/mempool_lib.rst
+@@ -38,9 +38,7 @@ In the DPDK, it is identified by name an
+ It provides some other optional services such as a per-core object cache and
+ an alignment helper to ensure that objects are padded to spread them equally on all DRAM or DDR3 channels.
+
+-This library is used by the
+-:ref:`Mbuf Library <Mbuf_Library>` and the
+-:ref:`Environment Abstraction Layer <Environment_Abstraction_Layer>` (for logging history).
++This library is used by the :ref:`Mbuf Library <Mbuf_Library>`.
+
+ Cookies
+ -------
+Index: dpdk/doc/guides/rel_notes/deprecation.rst
+===================================================================
+--- dpdk.orig/doc/guides/rel_notes/deprecation.rst
++++ dpdk/doc/guides/rel_notes/deprecation.rst
+@@ -8,6 +8,9 @@ API and ABI deprecation notices are to b
+ Deprecation Notices
+ -------------------
+
++* The log history is deprecated.
++ It is voided in 16.07 and will be removed in release 16.11.
++
+ * The ethdev hotplug API is going to be moved to EAL with a notification
+ mechanism added to crypto and ethdev libraries so that hotplug is now
+ available to both of them. This API will be stripped of the device arguments
+Index: dpdk/lib/librte_eal/bsdapp/eal/Makefile
+===================================================================
+--- dpdk.orig/lib/librte_eal/bsdapp/eal/Makefile
++++ dpdk/lib/librte_eal/bsdapp/eal/Makefile
+@@ -40,8 +40,6 @@ VPATH += $(RTE_SDK)/lib/librte_eal/commo
+ CFLAGS += -I$(SRCDIR)/include
+ CFLAGS += -I$(RTE_SDK)/lib/librte_eal/common
+ CFLAGS += -I$(RTE_SDK)/lib/librte_eal/common/include
+-CFLAGS += -I$(RTE_SDK)/lib/librte_ring
+-CFLAGS += -I$(RTE_SDK)/lib/librte_mempool
+ CFLAGS += $(WERROR_FLAGS) -O3
+
+ LDLIBS += -lexecinfo
+Index: dpdk/lib/librte_eal/bsdapp/eal/eal_debug.c
+===================================================================
+--- dpdk.orig/lib/librte_eal/bsdapp/eal/eal_debug.c
++++ dpdk/lib/librte_eal/bsdapp/eal/eal_debug.c
+@@ -77,9 +77,6 @@ void __rte_panic(const char *funcname, c
+ {
+ va_list ap;
+
+- /* disable history */
+- rte_log_set_history(0);
+-
+ rte_log(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, "PANIC in %s():\n", funcname);
+ va_start(ap, format);
+ rte_vlog(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, format, ap);
+@@ -98,9 +95,6 @@ rte_exit(int exit_code, const char *form
+ {
+ va_list ap;
+
+- /* disable history */
+- rte_log_set_history(0);
+-
+ if (exit_code != 0)
+ RTE_LOG(CRIT, EAL, "Error - exiting with code: %d\n"
+ " Cause: ", exit_code);
+Index: dpdk/lib/librte_eal/common/eal_common_log.c
+===================================================================
+--- dpdk.orig/lib/librte_eal/common/eal_common_log.c
++++ dpdk/lib/librte_eal/common/eal_common_log.c
+@@ -31,54 +31,16 @@
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+-#include <string.h>
+ #include <stdio.h>
+ #include <stdint.h>
+ #include <stdarg.h>
+-#include <sys/types.h>
+ #include <stdlib.h>
+-#include <unistd.h>
+-#include <inttypes.h>
+-#include <errno.h>
+-#include <sys/queue.h>
+
+ #include <rte_log.h>
+-#include <rte_memory.h>
+-#include <rte_memzone.h>
+-#include <rte_launch.h>
+-#include <rte_common.h>
+-#include <rte_cycles.h>
+-#include <rte_eal.h>
+ #include <rte_per_lcore.h>
+-#include <rte_lcore.h>
+-#include <rte_atomic.h>
+-#include <rte_debug.h>
+-#include <rte_spinlock.h>
+-#include <rte_branch_prediction.h>
+-#include <rte_ring.h>
+-#include <rte_mempool.h>
+
+ #include "eal_private.h"
+
+-#define LOG_ELT_SIZE 2048
+-
+-#define LOG_HISTORY_MP_NAME "log_history"
+-
+-STAILQ_HEAD(log_history_list, log_history);
+-
+-/**
+- * The structure of a message log in the log history.
+- */
+-struct log_history {
+- STAILQ_ENTRY(log_history) next;
+- unsigned size;
+- char buf[0];
+-};
+-
+-static struct rte_mempool *log_history_mp = NULL;
+-static unsigned log_history_size = 0;
+-static struct log_history_list log_history;
+-
+ /* global log structure */
+ struct rte_logs rte_logs = {
+ .type = ~0,
+@@ -86,10 +48,7 @@ struct rte_logs rte_logs = {
+ .file = NULL,
+ };
+
+-static rte_spinlock_t log_dump_lock = RTE_SPINLOCK_INITIALIZER;
+-static rte_spinlock_t log_list_lock = RTE_SPINLOCK_INITIALIZER;
+ static FILE *default_log_stream;
+-static int history_enabled = 1;
+
+ /**
+ * This global structure stores some informations about the message
+@@ -105,59 +64,16 @@ static struct log_cur_msg log_cur_msg[RT
+ /* default logs */
+
+ int
+-rte_log_add_in_history(const char *buf, size_t size)
++rte_log_add_in_history(const char *buf __rte_unused, size_t size __rte_unused)
+ {
+- struct log_history *hist_buf = NULL;
+- static const unsigned hist_buf_size = LOG_ELT_SIZE - sizeof(*hist_buf);
+- void *obj;
+-
+- if (history_enabled == 0)
+- return 0;
+-
+- rte_spinlock_lock(&log_list_lock);
+-
+- /* get a buffer for adding in history */
+- if (log_history_size > RTE_LOG_HISTORY) {
+- hist_buf = STAILQ_FIRST(&log_history);
+- if (hist_buf) {
+- STAILQ_REMOVE_HEAD(&log_history, next);
+- log_history_size--;
+- }
+- }
+- else {
+- if (rte_mempool_mc_get(log_history_mp, &obj) < 0)
+- obj = NULL;
+- hist_buf = obj;
+- }
+-
+- /* no buffer */
+- if (hist_buf == NULL) {
+- rte_spinlock_unlock(&log_list_lock);
+- return -ENOBUFS;
+- }
+-
+- /* not enough room for msg, buffer go back in mempool */
+- if (size >= hist_buf_size) {
+- rte_mempool_mp_put(log_history_mp, hist_buf);
+- rte_spinlock_unlock(&log_list_lock);
+- return -ENOBUFS;
+- }
+-
+- /* add in history */
+- memcpy(hist_buf->buf, buf, size);
+- hist_buf->buf[size] = hist_buf->buf[hist_buf_size-1] = '\0';
+- hist_buf->size = size;
+- STAILQ_INSERT_TAIL(&log_history, hist_buf, next);
+- log_history_size++;
+- rte_spinlock_unlock(&log_list_lock);
+-
+ return 0;
+ }
+
+ void
+ rte_log_set_history(int enable)
+ {
+- history_enabled = enable;
++ if (enable)
++ RTE_LOG(WARNING, EAL, "The log history is deprecated.\n");
+ }
+
+ /* Change the stream that will be used by logging system */
+@@ -224,44 +140,8 @@ int rte_log_cur_msg_logtype(void)
+
+ /* Dump log history to file */
+ void
+-rte_log_dump_history(FILE *out)
++rte_log_dump_history(FILE *out __rte_unused)
+ {
+- struct log_history_list tmp_log_history;
+- struct log_history *hist_buf;
+- unsigned i;
+-
+- /* only one dump at a time */
+- rte_spinlock_lock(&log_dump_lock);
+-
+- /* save list, and re-init to allow logging during dump */
+- rte_spinlock_lock(&log_list_lock);
+- tmp_log_history = log_history;
+- STAILQ_INIT(&log_history);
+- log_history_size = 0;
+- rte_spinlock_unlock(&log_list_lock);
+-
+- for (i=0; i<RTE_LOG_HISTORY; i++) {
+-
+- /* remove one message from history list */
+- hist_buf = STAILQ_FIRST(&tmp_log_history);
+-
+- if (hist_buf == NULL)
+- break;
+-
+- STAILQ_REMOVE_HEAD(&tmp_log_history, next);
+-
+- /* write on stdout */
+- if (fwrite(hist_buf->buf, hist_buf->size, 1, out) == 0) {
+- rte_mempool_mp_put(log_history_mp, hist_buf);
+- break;
+- }
+-
+- /* put back message structure in pool */
+- rte_mempool_mp_put(log_history_mp, hist_buf);
+- }
+- fflush(out);
+-
+- rte_spinlock_unlock(&log_dump_lock);
+ }
+
+ /*
+@@ -308,29 +188,11 @@ rte_log(uint32_t level, uint32_t logtype
+ }
+
+ /*
+- * called by environment-specific log init function to initialize log
+- * history
++ * called by environment-specific log init function
+ */
+ int
+ rte_eal_common_log_init(FILE *default_log)
+ {
+- STAILQ_INIT(&log_history);
+-
+- /* reserve RTE_LOG_HISTORY*2 elements, so we can dump and
+- * keep logging during this time */
+- log_history_mp = rte_mempool_create(LOG_HISTORY_MP_NAME, RTE_LOG_HISTORY*2,
+- LOG_ELT_SIZE, 0, 0,
+- NULL, NULL,
+- NULL, NULL,
+- SOCKET_ID_ANY, 0);
+-
+- if ((log_history_mp == NULL) &&
+- ((log_history_mp = rte_mempool_lookup(LOG_HISTORY_MP_NAME)) == NULL)){
+- RTE_LOG(ERR, EAL, "%s(): cannot create log_history mempool\n",
+- __func__);
+- return -1;
+- }
+-
+ default_log_stream = default_log;
+ rte_openlog_stream(default_log);
+ return 0;
+Index: dpdk/lib/librte_eal/common/eal_private.h
+===================================================================
+--- dpdk.orig/lib/librte_eal/common/eal_private.h
++++ dpdk/lib/librte_eal/common/eal_private.h
+@@ -49,9 +49,6 @@ int rte_eal_memzone_init(void);
+ /**
+ * Common log initialization function (private to eal).
+ *
+- * Called by environment-specific log initialization function to initialize
+- * log history.
+- *
+ * @param default_log
+ * The default log stream to be used.
+ * @return
+Index: dpdk/lib/librte_eal/common/include/rte_log.h
+===================================================================
+--- dpdk.orig/lib/librte_eal/common/include/rte_log.h
++++ dpdk/lib/librte_eal/common/include/rte_log.h
+@@ -42,6 +42,8 @@
+ * This file provides a log API to RTE applications.
+ */
+
++#include "rte_common.h" /* for __rte_deprecated macro */
++
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+@@ -179,22 +181,27 @@ int rte_log_cur_msg_loglevel(void);
+ int rte_log_cur_msg_logtype(void);
+
+ /**
++ * @deprecated
+ * Enable or disable the history (enabled by default)
+ *
+ * @param enable
+ * true to enable, or 0 to disable history.
+ */
++__rte_deprecated
+ void rte_log_set_history(int enable);
+
+ /**
++ * @deprecated
+ * Dump the log history to a file
+ *
+ * @param f
+ * A pointer to a file for output
+ */
++__rte_deprecated
+ void rte_log_dump_history(FILE *f);
+
+ /**
++ * @deprecated
+ * Add a log message to the history.
+ *
+ * This function can be called from a user-defined log stream. It adds
+@@ -209,6 +216,7 @@ void rte_log_dump_history(FILE *f);
+ * - 0: Success.
+ * - (-ENOBUFS) if there is no room to store the message.
+ */
++__rte_deprecated
+ int rte_log_add_in_history(const char *buf, size_t size);
+
+ /**
+Index: dpdk/lib/librte_eal/linuxapp/eal/eal_debug.c
+===================================================================
+--- dpdk.orig/lib/librte_eal/linuxapp/eal/eal_debug.c
++++ dpdk/lib/librte_eal/linuxapp/eal/eal_debug.c
+@@ -77,9 +77,6 @@ void __rte_panic(const char *funcname, c
+ {
+ va_list ap;
+
+- /* disable history */
+- rte_log_set_history(0);
+-
+ rte_log(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, "PANIC in %s():\n", funcname);
+ va_start(ap, format);
+ rte_vlog(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, format, ap);
+@@ -98,9 +95,6 @@ rte_exit(int exit_code, const char *form
+ {
+ va_list ap;
+
+- /* disable history */
+- rte_log_set_history(0);
+-
+ if (exit_code != 0)
+ RTE_LOG(CRIT, EAL, "Error - exiting with code: %d\n"
+ " Cause: ", exit_code);
+Index: dpdk/lib/librte_eal/linuxapp/eal/eal_log.c
+===================================================================
+--- dpdk.orig/lib/librte_eal/linuxapp/eal/eal_log.c
++++ dpdk/lib/librte_eal/linuxapp/eal/eal_log.c
+@@ -50,8 +50,7 @@
+ #include "eal_private.h"
+
+ /*
+- * default log function, used once mempool (hence log history) is
+- * available
++ * default log function
+ */
+ static ssize_t
+ console_log_write(__attribute__((unused)) void *c, const char *buf, size_t size)
+@@ -60,9 +59,6 @@ console_log_write(__attribute__((unused)
+ ssize_t ret;
+ uint32_t loglevel;
+
+- /* add this log in history */
+- rte_log_add_in_history(buf, size);
+-
+ /* write on stdout */
+ ret = fwrite(buf, 1, size, stdout);
+ fflush(stdout);
+@@ -110,8 +106,7 @@ rte_eal_log_init(const char *id, int fac
+ /* early logs */
+
+ /*
+- * early log function, used during boot when mempool (hence log
+- * history) is not available
++ * early log function, used before rte_eal_log_init
+ */
+ static ssize_t
+ early_log_write(__attribute__((unused)) void *c, const char *buf, size_t size)
+Index: dpdk/lib/librte_eal/linuxapp/eal/Makefile
+===================================================================
+--- dpdk.orig/lib/librte_eal/linuxapp/eal/Makefile
++++ dpdk/lib/librte_eal/linuxapp/eal/Makefile
+@@ -44,9 +44,12 @@ VPATH += $(RTE_SDK)/lib/librte_eal/commo
+ CFLAGS += -I$(SRCDIR)/include
+ CFLAGS += -I$(RTE_SDK)/lib/librte_eal/common
+ CFLAGS += -I$(RTE_SDK)/lib/librte_eal/common/include
++ifeq ($(CONFIG_RTE_LIBRTE_IVSHMEM),y)
++# workaround for circular dependency eal -> ivshmem -> ring/mempool -> eal
+ CFLAGS += -I$(RTE_SDK)/lib/librte_ring
+ CFLAGS += -I$(RTE_SDK)/lib/librte_mempool
+ CFLAGS += -I$(RTE_SDK)/lib/librte_ivshmem
++endif
+ CFLAGS += $(WERROR_FLAGS) -O3
+
+ LDLIBS += -ldl
+Index: dpdk/lib/librte_eal/linuxapp/eal/eal_interrupts.c
+===================================================================
+--- dpdk.orig/lib/librte_eal/linuxapp/eal/eal_interrupts.c
++++ dpdk/lib/librte_eal/linuxapp/eal/eal_interrupts.c
+@@ -57,10 +57,8 @@
+ #include <rte_lcore.h>
+ #include <rte_atomic.h>
+ #include <rte_branch_prediction.h>
+-#include <rte_ring.h>
+ #include <rte_debug.h>
+ #include <rte_log.h>
+-#include <rte_mempool.h>
+ #include <rte_pci.h>
+ #include <rte_malloc.h>
+ #include <rte_errno.h>
+Index: dpdk/lib/librte_eal/linuxapp/eal/eal_ivshmem.c
+===================================================================
+--- dpdk.orig/lib/librte_eal/linuxapp/eal/eal_ivshmem.c
++++ dpdk/lib/librte_eal/linuxapp/eal/eal_ivshmem.c
+@@ -49,7 +49,6 @@
+ #include <rte_string_fns.h>
+ #include <rte_errno.h>
+ #include <rte_ring.h>
+-#include <rte_mempool.h>
+ #include <rte_malloc.h>
+ #include <rte_common.h>
+ #include <rte_ivshmem.h>
+Index: dpdk/lib/librte_ivshmem/Makefile
+===================================================================
+--- dpdk.orig/lib/librte_ivshmem/Makefile
++++ dpdk/lib/librte_ivshmem/Makefile
+@@ -46,7 +46,9 @@ SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte
+ # install includes
+ SYMLINK-$(CONFIG_RTE_LIBRTE_IVSHMEM)-include := rte_ivshmem.h
+
+-# this lib needs eal
++# this lib needs EAL, ring and mempool
++DEPDIRS-$(CONFIG_RTE_LIBRTE_IVSHMEM) += lib/librte_eal
++DEPDIRS-$(CONFIG_RTE_LIBRTE_IVSHMEM) += lib/librte_ring
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_IVSHMEM) += lib/librte_mempool
+
+ include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/debian/patches/ubuntu-backport-40-linking-fixes-stage-3-4.patch b/debian/patches/ubuntu-backport-40-linking-fixes-stage-3-4.patch
new file mode 100644
index 00000000..161832e6
--- /dev/null
+++ b/debian/patches/ubuntu-backport-40-linking-fixes-stage-3-4.patch
@@ -0,0 +1,217 @@
+Description: backport of dpdk 16.07 fix for library underlinking - stage 3/4
+
+This is a merge of related upstream fixes:
+- cb8e39da mk: sort drivers in static application link list
+- ea469893 mk: fix driver dependencies order for static application
+- 4e04fd45 mk: remove library grouping during application linking
+- 6248e442 mk: prevent overlinking in applications
+- ce18c527 mk: sort libraries in level order when linking
+- 95dc3c3c mk: reduce scope of whole-archive static linking
+
+Forwarded: yes (in DPDK 16.07)
+Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
+Last-Update: 2016-06-14
+
+Index: dpdk/mk/rte.app.mk
+===================================================================
+--- dpdk.orig/mk/rte.app.mk
++++ dpdk/mk/rte.app.mk
+@@ -50,6 +50,9 @@ ifeq ($(NO_LDSCRIPT),)
+ LDSCRIPT = $(RTE_LDSCRIPT)
+ endif
+
++# Link only the libraries used in the application
++LDFLAGS += --as-needed
++
+ # default path for libs
+ _LDLIBS-y += -L$(RTE_SDK_BIN)/lib
+
+@@ -57,11 +60,6 @@ _LDLIBS-y += -L$(RTE_SDK_BIN)/lib
+ # Order is important: from higher level to lower level
+ #
+
+-_LDLIBS-y += --whole-archive
+-
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += -lrte_distributor
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_REORDER) += -lrte_reorder
+-
+ ifeq ($(CONFIG_RTE_EXEC_ENV_LINUXAPP),y)
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_KNI) += -lrte_kni
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_IVSHMEM) += -lrte_ivshmem
+@@ -70,51 +68,25 @@ endif
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_PIPELINE) += -lrte_pipeline
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_TABLE) += -lrte_table
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_PORT) += -lrte_port
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_TIMER) += -lrte_timer
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_HASH) += -lrte_hash
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_JOBSTATS) += -lrte_jobstats
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_LPM) += -lrte_lpm
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_POWER) += -lrte_power
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += -lrte_acl
++
++_LDLIBS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += -lrte_distributor
++_LDLIBS-$(CONFIG_RTE_LIBRTE_REORDER) += -lrte_reorder
++_LDLIBS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += -lrte_ip_frag
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_METER) += -lrte_meter
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED) += -lrte_sched
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_VHOST) += -lrte_vhost
++_LDLIBS-$(CONFIG_RTE_LIBRTE_LPM) += -lrte_lpm
++_LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += -lrte_acl
++_LDLIBS-$(CONFIG_RTE_LIBRTE_JOBSTATS) += -lrte_jobstats
++_LDLIBS-$(CONFIG_RTE_LIBRTE_POWER) += -lrte_power
+
+-# The static libraries do not know their dependencies.
+-# So linking with static library requires explicit dependencies.
+-ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),n)
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED) += -lm
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED) += -lrt
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_METER) += -lm
+-ifeq ($(CONFIG_RTE_LIBRTE_VHOST_NUMA),y)
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_VHOST) += -lnuma
+-endif
+-ifeq ($(CONFIG_RTE_LIBRTE_VHOST_USER),n)
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_VHOST) += -lfuse
+-endif
+-_LDLIBS-$(CONFIG_RTE_PORT_PCAP) += -lpcap
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += -lpcap
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_BNX2X_PMD) += -lz
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_MLX4_PMD) += -libverbs
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += -libverbs
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_SZEDATA2) += -lsze2
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += -lxenstore
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_MPIPE_PMD) += -lgxio
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_NFP_PMD) += -lm
+-# QAT / AESNI GCM PMDs are dependent on libcrypto (from openssl)
+-# for calculating HMAC precomputes
+-ifeq ($(CONFIG_RTE_LIBRTE_PMD_QAT),y)
+-_LDLIBS-y += -lcrypto
+-else ifeq ($(CONFIG_RTE_LIBRTE_PMD_AESNI_GCM),y)
+-_LDLIBS-y += -lcrypto
+-endif
+-endif # !CONFIG_RTE_BUILD_SHARED_LIBS
++_LDLIBS-y += --whole-archive
+
+-_LDLIBS-y += --start-group
++_LDLIBS-$(CONFIG_RTE_LIBRTE_TIMER) += -lrte_timer
++_LDLIBS-$(CONFIG_RTE_LIBRTE_HASH) += -lrte_hash
++_LDLIBS-$(CONFIG_RTE_LIBRTE_VHOST) += -lrte_vhost
+
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_KVARGS) += -lrte_kvargs
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_MBUF) += -lrte_mbuf
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += -lrte_ip_frag
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_ETHER) += -lethdev
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_CRYPTODEV) += -lrte_cryptodev
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_MEMPOOL) += -lrte_mempool
+@@ -123,61 +95,65 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_EAL)
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_CMDLINE) += -lrte_cmdline
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_CFGFILE) += -lrte_cfgfile
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_BOND) += -lrte_pmd_bond
+-
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += -lrte_pmd_xenvirt
++_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += -lrte_pmd_xenvirt -lxenstore
+
+ ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),n)
+ # plugins (link only if static libraries)
+
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += -lrte_pmd_vmxnet3_uio
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += -lrte_pmd_virtio
++_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += -lrte_pmd_af_packet
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_BNX2X_PMD) += -lrte_pmd_bnx2x
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_CXGBE_PMD) += -lrte_pmd_cxgbe
++_LDLIBS-$(CONFIG_RTE_LIBRTE_E1000_PMD) += -lrte_pmd_e1000
++_LDLIBS-$(CONFIG_RTE_LIBRTE_ENA_PMD) += -lrte_pmd_ena
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_ENIC_PMD) += -lrte_pmd_enic
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_I40E_PMD) += -lrte_pmd_i40e
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += -lrte_pmd_fm10k
++_LDLIBS-$(CONFIG_RTE_LIBRTE_I40E_PMD) += -lrte_pmd_i40e
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_IXGBE_PMD) += -lrte_pmd_ixgbe
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_E1000_PMD) += -lrte_pmd_e1000
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_ENA_PMD) += -lrte_pmd_ena
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_MLX4_PMD) += -lrte_pmd_mlx4
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += -lrte_pmd_mlx5
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_NFP_PMD) += -lrte_pmd_nfp
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_SZEDATA2) += -lrte_pmd_szedata2
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_MPIPE_PMD) += -lrte_pmd_mpipe
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_RING) += -lrte_pmd_ring
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += -lrte_pmd_pcap
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += -lrte_pmd_af_packet
++_LDLIBS-$(CONFIG_RTE_LIBRTE_MLX4_PMD) += -lrte_pmd_mlx4 -libverbs
++_LDLIBS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += -lrte_pmd_mlx5 -libverbs
++_LDLIBS-$(CONFIG_RTE_LIBRTE_MPIPE_PMD) += -lrte_pmd_mpipe -lgxio
++_LDLIBS-$(CONFIG_RTE_LIBRTE_NFP_PMD) += -lrte_pmd_nfp -lm
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += -lrte_pmd_null
++_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += -lrte_pmd_pcap -lpcap
++_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_RING) += -lrte_pmd_ring
++_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_SZEDATA2) += -lrte_pmd_szedata2 -lsze2
++_LDLIBS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += -lrte_pmd_virtio
++ifeq ($(CONFIG_RTE_LIBRTE_VHOST),y)
++_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_VHOST) += -lrte_pmd_vhost
++endif # $(CONFIG_RTE_LIBRTE_VHOST)
++_LDLIBS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += -lrte_pmd_vmxnet3_uio
+
+ ifeq ($(CONFIG_RTE_LIBRTE_CRYPTODEV),y)
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_QAT) += -lrte_pmd_qat
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AESNI_MB) += -lrte_pmd_aesni_mb
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AESNI_GCM) += -lrte_pmd_aesni_gcm
++_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AESNI_MB) += -L$(AESNI_MULTI_BUFFER_LIB_PATH) -lIPSec_MB
++_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AESNI_GCM) += -lrte_pmd_aesni_gcm
++_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AESNI_GCM) += -L$(AESNI_MULTI_BUFFER_LIB_PATH) -lIPSec_MB
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_NULL_CRYPTO) += -lrte_pmd_null_crypto
+-
+-# AESNI MULTI BUFFER / GCM PMDs are dependent on the IPSec_MB library
+-ifeq ($(CONFIG_RTE_LIBRTE_PMD_AESNI_MB),y)
+-_LDLIBS-y += -L$(AESNI_MULTI_BUFFER_LIB_PATH) -lIPSec_MB
+-else ifeq ($(CONFIG_RTE_LIBRTE_PMD_AESNI_GCM),y)
+-_LDLIBS-y += -L$(AESNI_MULTI_BUFFER_LIB_PATH) -lIPSec_MB
+-endif
+-
+-# SNOW3G PMD is dependent on the LIBSSO library
++_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_QAT) += -lrte_pmd_qat
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_SNOW3G) += -lrte_pmd_snow3g
+ _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_SNOW3G) += -L$(LIBSSO_PATH)/build -lsso
+ endif # CONFIG_RTE_LIBRTE_CRYPTODEV
+
+-ifeq ($(CONFIG_RTE_LIBRTE_VHOST),y)
+-
+-_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_VHOST) += -lrte_pmd_vhost
++endif # !CONFIG_RTE_BUILD_SHARED_LIBS
+
+-endif # $(CONFIG_RTE_LIBRTE_VHOST)
++_LDLIBS-y += --no-whole-archive
+
+-endif # ! $(CONFIG_RTE_BUILD_SHARED_LIB)
++ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),n)
++# The static libraries do not know their dependencies.
++# So linking with static library requires explicit dependencies.
++_LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED) += -lm
++_LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED) += -lrt
++_LDLIBS-$(CONFIG_RTE_LIBRTE_METER) += -lm
++ifeq ($(CONFIG_RTE_LIBRTE_VHOST_NUMA),y)
++_LDLIBS-$(CONFIG_RTE_LIBRTE_VHOST) += -lnuma
++endif
++ifeq ($(CONFIG_RTE_LIBRTE_VHOST_USER),n)
++_LDLIBS-$(CONFIG_RTE_LIBRTE_VHOST) += -lfuse
++endif
++_LDLIBS-$(CONFIG_RTE_PORT_PCAP) += -lpcap
++endif # !CONFIG_RTE_BUILD_SHARED_LIBS
+
+ _LDLIBS-y += $(EXECENV_LDLIBS)
+-_LDLIBS-y += --end-group
+-_LDLIBS-y += --no-whole-archive
+
+ LDLIBS += $(_LDLIBS-y) $(CPU_LDLIBS) $(EXTRA_LDLIBS)
+
+Index: dpdk/mk/exec-env/linuxapp/rte.vars.mk
+===================================================================
+--- dpdk.orig/mk/exec-env/linuxapp/rte.vars.mk
++++ dpdk/mk/exec-env/linuxapp/rte.vars.mk
+@@ -45,9 +45,6 @@ else
+ EXECENV_CFLAGS = -pthread
+ endif
+
+-# Workaround lack of DT_NEEDED entry
+-EXECENV_LDFLAGS = --no-as-needed
+-
+ EXECENV_LDLIBS =
+ EXECENV_ASFLAGS =
+
diff --git a/debian/patches/ubuntu-backport-40-linking-fixes-stage-4-4.patch b/debian/patches/ubuntu-backport-40-linking-fixes-stage-4-4.patch
new file mode 100644
index 00000000..188ee2bd
--- /dev/null
+++ b/debian/patches/ubuntu-backport-40-linking-fixes-stage-4-4.patch
@@ -0,0 +1,149 @@
+Description: backport of dpdk 16.07 fix for library underlinking - stage 4/4
+
+This is a merge of related upstream fixes:
+- 473b718f mk: fix vhost dependency to pthread
+- 6cbf4f75 mk: fix missing internal dependencies
+
+Forwarded: yes (in DPDK 16.07)
+Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
+Last-Update: 2016-06-14
+
+Index: dpdk/drivers/net/vhost/Makefile
+===================================================================
+--- dpdk.orig/drivers/net/vhost/Makefile
++++ dpdk/drivers/net/vhost/Makefile
+@@ -36,6 +36,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
+ #
+ LIB = librte_pmd_vhost.a
+
++LDLIBS += -lpthread
++
+ CFLAGS += -O3
+ CFLAGS += $(WERROR_FLAGS)
+
+@@ -54,6 +56,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_PMD_VHOST) += r
+ SYMLINK-y-include += rte_eth_vhost.h
+
+ # this lib depends upon:
++DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_VHOST) += lib/librte_eal
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_VHOST) += lib/librte_mbuf
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_VHOST) += lib/librte_ether
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_VHOST) += lib/librte_kvargs
+Index: dpdk/drivers/crypto/null/Makefile
+===================================================================
+--- dpdk.orig/drivers/crypto/null/Makefile
++++ dpdk/drivers/crypto/null/Makefile
+@@ -55,5 +55,7 @@ SYMLINK-y-include +=
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL_CRYPTO) += lib/librte_eal
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL_CRYPTO) += lib/librte_mbuf
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL_CRYPTO) += lib/librte_cryptodev
++DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL_CRYPTO) += lib/librte_ring
++DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL_CRYPTO) += lib/librte_kvargs
+
+ include $(RTE_SDK)/mk/rte.lib.mk
+Index: dpdk/drivers/net/af_packet/Makefile
+===================================================================
+--- dpdk.orig/drivers/net/af_packet/Makefile
++++ dpdk/drivers/net/af_packet/Makefile
+@@ -51,6 +51,7 @@ CFLAGS += $(WERROR_FLAGS)
+ SRCS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += rte_eth_af_packet.c
+
+ # this lib depends upon:
++DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += lib/librte_eal
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += lib/librte_mbuf
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += lib/librte_ether
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += lib/librte_kvargs
+Index: dpdk/drivers/net/bonding/Makefile
+===================================================================
+--- dpdk.orig/drivers/net/bonding/Makefile
++++ dpdk/drivers/net/bonding/Makefile
+@@ -64,5 +64,7 @@ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_BOND) +=
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_BOND) += lib/librte_eal
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_BOND) += lib/librte_kvargs
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_BOND) += lib/librte_cmdline
++DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_BOND) += lib/librte_mempool
++DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_BOND) += lib/librte_ring
+
+ include $(RTE_SDK)/mk/rte.lib.mk
+Index: dpdk/drivers/net/fm10k/Makefile
+===================================================================
+--- dpdk.orig/drivers/net/fm10k/Makefile
++++ dpdk/drivers/net/fm10k/Makefile
+@@ -99,5 +99,6 @@ SRCS-$(CONFIG_RTE_LIBRTE_FM10K_INC_VECTO
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += lib/librte_eal lib/librte_ether
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += lib/librte_mempool lib/librte_mbuf
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += lib/librte_net
++DEPDIRS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += lib/librte_kvargs
+
+ include $(RTE_SDK)/mk/rte.lib.mk
+Index: dpdk/drivers/net/null/Makefile
+===================================================================
+--- dpdk.orig/drivers/net/null/Makefile
++++ dpdk/drivers/net/null/Makefile
+@@ -54,6 +54,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += rt
+ SYMLINK-y-include += rte_eth_null.h
+
+ # this lib depends upon:
++DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_eal
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_mbuf
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_ether
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_kvargs
+Index: dpdk/drivers/net/pcap/Makefile
+===================================================================
+--- dpdk.orig/drivers/net/pcap/Makefile
++++ dpdk/drivers/net/pcap/Makefile
+@@ -56,6 +56,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += rt
+ SYMLINK-y-include +=
+
+ # this lib depends upon:
++DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += lib/librte_eal
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += lib/librte_mbuf
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += lib/librte_ether
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += lib/librte_kvargs
+Index: dpdk/lib/librte_ip_frag/Makefile
+===================================================================
+--- dpdk.orig/lib/librte_ip_frag/Makefile
++++ dpdk/lib/librte_ip_frag/Makefile
+@@ -54,6 +54,7 @@ SYMLINK-$(CONFIG_RTE_LIBRTE_IP_FRAG)-inc
+
+
+ # this library depends on rte_ether
++DEPDIRS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += lib/librte_eal
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += lib/librte_mempool lib/librte_ether
+
+ include $(RTE_SDK)/mk/rte.lib.mk
+Index: dpdk/lib/librte_pipeline/Makefile
+===================================================================
+--- dpdk.orig/lib/librte_pipeline/Makefile
++++ dpdk/lib/librte_pipeline/Makefile
+@@ -52,6 +52,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_PIPELINE) := rt
+ SYMLINK-$(CONFIG_RTE_LIBRTE_PIPELINE)-include += rte_pipeline.h
+
+ # this lib depends upon:
++DEPDIRS-$(CONFIG_RTE_LIBRTE_PIPELINE) += lib/librte_eal
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PIPELINE) := lib/librte_table
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PIPELINE) += lib/librte_port
+
+Index: dpdk/lib/librte_port/Makefile
+===================================================================
+--- dpdk.orig/lib/librte_port/Makefile
++++ dpdk/lib/librte_port/Makefile
+@@ -75,5 +75,6 @@ DEPDIRS-$(CONFIG_RTE_LIBRTE_PORT) += lib
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PORT) += lib/librte_mempool
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PORT) += lib/librte_ether
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_PORT) += lib/librte_ip_frag
++DEPDIRS-$(CONFIG_RTE_LIBRTE_PORT) += lib/librte_sched
+
+ include $(RTE_SDK)/mk/rte.lib.mk
+Index: dpdk/lib/librte_sched/Makefile
+===================================================================
+--- dpdk.orig/lib/librte_sched/Makefile
++++ dpdk/lib/librte_sched/Makefile
+@@ -59,6 +59,7 @@ SYMLINK-$(CONFIG_RTE_LIBRTE_SCHED)-inclu
+ SYMLINK-$(CONFIG_RTE_LIBRTE_SCHED)-include += rte_reciprocal.h
+
+ # this lib depends upon:
++DEPDIRS-$(CONFIG_RTE_LIBRTE_SCHED) += lib/librte_eal
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_SCHED) += lib/librte_mempool lib/librte_mbuf
+ DEPDIRS-$(CONFIG_RTE_LIBRTE_SCHED) += lib/librte_net lib/librte_timer
+
diff --git a/debian/patches/ubuntu-backport-41-fix-install-tar-1.29.patch b/debian/patches/ubuntu-backport-41-fix-install-tar-1.29.patch
new file mode 100644
index 00000000..e485e528
--- /dev/null
+++ b/debian/patches/ubuntu-backport-41-fix-install-tar-1.29.patch
@@ -0,0 +1,25 @@
+Description: backport of dpdk 16.07 fix for tar >=1.29
+
+This is a backport of:
+- dd9ae4c7 mk: fix install with tar 1.29
+
+Forwarded: yes (in DPDK 16.07)
+Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
+Last-Update: 2016-06-14
+
+Index: dpdk/mk/rte.sdkinstall.mk
+===================================================================
+--- dpdk.orig/mk/rte.sdkinstall.mk
++++ dpdk/mk/rte.sdkinstall.mk
+@@ -116,9 +116,9 @@ install-runtime:
+ $(Q)$(call rte_mkdir, $(DESTDIR)$(libdir))
+ $(Q)cp -a $O/lib/* $(DESTDIR)$(libdir)
+ $(Q)$(call rte_mkdir, $(DESTDIR)$(bindir))
+- $(Q)tar -cf - -C $O app --exclude 'app/*.map' \
++ $(Q)tar -cf - -C $O --exclude 'app/*.map' \
+ --exclude 'app/cmdline*' --exclude app/test \
+- --exclude app/testacl --exclude app/testpipeline | \
++ --exclude app/testacl --exclude app/testpipeline app | \
+ tar -xf - -C $(DESTDIR)$(bindir) --strip-components=1 \
+ --keep-newer-files --warning=no-ignore-newer
+ $(Q)$(call rte_mkdir, $(DESTDIR)$(datadir))
diff --git a/debian/patches/ubuntu-backport-42-increase-default-logging-level.patch b/debian/patches/ubuntu-backport-42-increase-default-logging-level.patch
new file mode 100644
index 00000000..de641035
--- /dev/null
+++ b/debian/patches/ubuntu-backport-42-increase-default-logging-level.patch
@@ -0,0 +1,81 @@
+Index: dpdk/config/common_base
+===================================================================
+--- dpdk.orig/config/common_base
++++ dpdk/config/common_base
+@@ -88,7 +88,7 @@ CONFIG_RTE_MAX_NUMA_NODES=8
+ CONFIG_RTE_MAX_MEMSEG=256
+ CONFIG_RTE_MAX_MEMZONE=2560
+ CONFIG_RTE_MAX_TAILQ=32
+-CONFIG_RTE_LOG_LEVEL=8
++CONFIG_RTE_LOG_LEVEL=RTE_LOG_INFO
+ CONFIG_RTE_LOG_HISTORY=256
+ CONFIG_RTE_LIBEAL_USE_HPET=n
+ CONFIG_RTE_EAL_ALLOW_INV_SOCKET_ID=n
+Index: dpdk/doc/guides/faq/faq.rst
+===================================================================
+--- dpdk.orig/doc/guides/faq/faq.rst
++++ dpdk/doc/guides/faq/faq.rst
+@@ -88,9 +88,7 @@ the wrong socket, the application simply
+ On application startup, there is a lot of EAL information printed. Is there any way to reduce this?
+ ---------------------------------------------------------------------------------------------------
+
+-Yes, each EAL has a configuration file that is located in the /config directory. Within each configuration file, you will find CONFIG_RTE_LOG_LEVEL=8.
+-You can change this to a lower value, such as 6 to reduce this printout of debug information. The following is a list of LOG levels that can be found in the rte_log.h file.
+-You must remove, then rebuild, the EAL directory for the change to become effective as the configuration file creates the rte_config.h file in the EAL directory.
++Yes, the option ``--log-level=`` accepts one of these numbers:
+
+ .. code-block:: c
+
+@@ -103,6 +101,9 @@ You must remove, then rebuild, the EAL d
+ #define RTE_LOG_INFO 7U /* Informational. */
+ #define RTE_LOG_DEBUG 8U /* Debug-level messages. */
+
++It is also possible to change the maximum (and default level) at compile time
++with ``CONFIG_RTE_LOG_LEVEL``.
++
+
+ How can I tune my network application to achieve lower latency?
+ ---------------------------------------------------------------
+Index: dpdk/lib/librte_eal/common/eal_common_log.c
+===================================================================
+--- dpdk.orig/lib/librte_eal/common/eal_common_log.c
++++ dpdk/lib/librte_eal/common/eal_common_log.c
+@@ -195,5 +195,10 @@ rte_eal_common_log_init(FILE *default_lo
+ {
+ default_log_stream = default_log;
+ rte_openlog_stream(default_log);
++
++#if RTE_LOG_LEVEL >= RTE_LOG_DEBUG
++ RTE_LOG(NOTICE, EAL, "Debug logs available - lower performance\n");
++#endif
++
+ return 0;
+ }
+Index: dpdk/lib/librte_eal/common/eal_common_options.c
+===================================================================
+--- dpdk.orig/lib/librte_eal/common/eal_common_options.c
++++ dpdk/lib/librte_eal/common/eal_common_options.c
+@@ -141,7 +141,11 @@ eal_reset_internal_config(struct interna
+
+ internal_cfg->syslog_facility = LOG_DAEMON;
+ /* default value from build option */
++#if RTE_LOG_LEVEL >= RTE_LOG_DEBUG
++ internal_cfg->log_level = RTE_LOG_INFO;
++#else
+ internal_cfg->log_level = RTE_LOG_LEVEL;
++#endif
+
+ internal_cfg->xen_dom0_support = 0;
+
+Index: dpdk/scripts/test-build.sh
+===================================================================
+--- dpdk.orig/scripts/test-build.sh
++++ dpdk/scripts/test-build.sh
+@@ -138,6 +138,7 @@ config () # <directory> <target> <option
+ ! echo $3 | grep -q '+shared' || \
+ sed -ri 's,(SHARED_LIB=)n,\1y,' $1/.config
+ ! echo $3 | grep -q '+debug' || ( \
++ sed -ri 's,(RTE_LOG_LEVEL=).*,\1RTE_LOG_DEBUG,' $1/.config
+ sed -ri 's,(_DEBUG.*=)n,\1y,' $1/.config
+ sed -ri 's,(_STAT.*=)n,\1y,' $1/.config
+ sed -ri 's,(TEST_PMD_RECORD_.*=)n,\1y,' $1/.config )
diff --git a/debian/patches/ubuntu-backport-43-fix-level-type-retrieving.patch b/debian/patches/ubuntu-backport-43-fix-level-type-retrieving.patch
new file mode 100644
index 00000000..9a56223f
--- /dev/null
+++ b/debian/patches/ubuntu-backport-43-fix-level-type-retrieving.patch
@@ -0,0 +1,61 @@
+Index: dpdk/lib/librte_eal/common/eal_common_log.c
+===================================================================
+--- dpdk.orig/lib/librte_eal/common/eal_common_log.c
++++ dpdk/lib/librte_eal/common/eal_common_log.c
+@@ -57,9 +57,10 @@ static FILE *default_log_stream;
+ struct log_cur_msg {
+ uint32_t loglevel; /**< log level - see rte_log.h */
+ uint32_t logtype; /**< log type - see rte_log.h */
+-} __rte_cache_aligned;
+-static struct log_cur_msg log_cur_msg[RTE_MAX_LCORE]; /**< per core log */
++};
+
++ /* per core log */
++static RTE_DEFINE_PER_LCORE(struct log_cur_msg, log_cur_msg);
+
+ /* default logs */
+
+@@ -121,21 +122,13 @@ rte_get_log_type(void)
+ /* get the current loglevel for the message beeing processed */
+ int rte_log_cur_msg_loglevel(void)
+ {
+- unsigned lcore_id;
+- lcore_id = rte_lcore_id();
+- if (lcore_id >= RTE_MAX_LCORE)
+- return rte_get_log_level();
+- return log_cur_msg[lcore_id].loglevel;
++ return RTE_PER_LCORE(log_cur_msg).loglevel;
+ }
+
+ /* get the current logtype for the message beeing processed */
+ int rte_log_cur_msg_logtype(void)
+ {
+- unsigned lcore_id;
+- lcore_id = rte_lcore_id();
+- if (lcore_id >= RTE_MAX_LCORE)
+- return rte_get_log_type();
+- return log_cur_msg[lcore_id].logtype;
++ return RTE_PER_LCORE(log_cur_msg).logtype;
+ }
+
+ /* Dump log history to file */
+@@ -153,17 +146,13 @@ rte_vlog(uint32_t level, uint32_t logtyp
+ {
+ int ret;
+ FILE *f = rte_logs.file;
+- unsigned lcore_id;
+
+ if ((level > rte_logs.level) || !(logtype & rte_logs.type))
+ return 0;
+
+ /* save loglevel and logtype in a global per-lcore variable */
+- lcore_id = rte_lcore_id();
+- if (lcore_id < RTE_MAX_LCORE) {
+- log_cur_msg[lcore_id].loglevel = level;
+- log_cur_msg[lcore_id].logtype = logtype;
+- }
++ RTE_PER_LCORE(log_cur_msg).loglevel = level;
++ RTE_PER_LCORE(log_cur_msg).logtype = logtype;
+
+ ret = vfprintf(f, format, ap);
+ fflush(f);
diff --git a/debian/patches/ubuntu-fix-vhost-user-socket-permission.patch b/debian/patches/ubuntu-fix-vhost-user-socket-permission.patch
new file mode 100644
index 00000000..c2a9cdbf
--- /dev/null
+++ b/debian/patches/ubuntu-fix-vhost-user-socket-permission.patch
@@ -0,0 +1,372 @@
+Description: eal: provide option to set vhost_user socket owner/permissions
+
+The API doesn't hold a way to specify a owner/permission set for vhost_user
+created sockets.
+
+Projects consuming DPDK started to do 'their own workarounds' like openvswitch
+https://patchwork.ozlabs.org/patch/559043/
+https://patchwork.ozlabs.org/patch/559045/
+But for this specific example they are blocked/stalled behind a bigger
+rework (https://patchwork.ozlabs.org/patch/604898/).
+
+We need something now for existing code linking against DPDK. That implies to
+avoid changing API/ABI. So I created a DPDK EAL commandline option based ideas
+in the former patches.
+
+Fixes LP: #1546565
+
+*Update*
+ - with the split libs it now nees to be listed in
+ lib/librte_eal/linuxapp/eal/rte_eal_version.map to work on link steps
+ - please note that upstream gravitates towards not extending but creating a
+ new the API in DPDK as long term solution (will take a while)
+ - also as listed before most affected projects seem to create their own
+ workaround.
+ So over time we have to check when we can drop it at the price of a config
+ transition - likely OVS 2.6 won't need it anymore.
+
+Forwarded: yes
+Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
+Last-Update: 2016-05-18
+
+Index: dpdk/lib/librte_eal/common/eal_common_options.c
+===================================================================
+--- dpdk.orig/lib/librte_eal/common/eal_common_options.c
++++ dpdk/lib/librte_eal/common/eal_common_options.c
+@@ -95,6 +95,8 @@ eal_long_options[] = {
+ {OPT_VFIO_INTR, 1, NULL, OPT_VFIO_INTR_NUM },
+ {OPT_VMWARE_TSC_MAP, 0, NULL, OPT_VMWARE_TSC_MAP_NUM },
+ {OPT_XEN_DOM0, 0, NULL, OPT_XEN_DOM0_NUM },
++ {OPT_VHOST_OWNER, 1, NULL, OPT_VHOST_OWNER_NUM },
++ {OPT_VHOST_PERM, 1, NULL, OPT_VHOST_PERM_NUM },
+ {0, 0, NULL, 0 }
+ };
+
+@@ -153,6 +155,8 @@ eal_reset_internal_config(struct interna
+ #endif
+ internal_cfg->vmware_tsc_map = 0;
+ internal_cfg->create_uio_dev = 0;
++ internal_cfg->vhost_sock_owner = NULL;
++ internal_cfg->vhost_sock_perm = NULL;
+ }
+
+ static int
+Index: dpdk/lib/librte_eal/common/eal_internal_cfg.h
+===================================================================
+--- dpdk.orig/lib/librte_eal/common/eal_internal_cfg.h
++++ dpdk/lib/librte_eal/common/eal_internal_cfg.h
+@@ -83,6 +83,8 @@ struct internal_config {
+ volatile enum rte_intr_mode vfio_intr_mode;
+ const char *hugefile_prefix; /**< the base filename of hugetlbfs files */
+ const char *hugepage_dir; /**< specific hugetlbfs directory to use */
++ const char *vhost_sock_owner; /**< owner:group of vhost_user sockets */
++ const char *vhost_sock_perm; /**< permissions of vhost_user sockets */
+
+ unsigned num_hugepage_sizes; /**< how many sizes on this system */
+ struct hugepage_info hugepage_info[MAX_HUGEPAGE_SIZES];
+Index: dpdk/lib/librte_eal/common/eal_options.h
+===================================================================
+--- dpdk.orig/lib/librte_eal/common/eal_options.h
++++ dpdk/lib/librte_eal/common/eal_options.h
+@@ -83,6 +83,10 @@ enum {
+ OPT_VMWARE_TSC_MAP_NUM,
+ #define OPT_XEN_DOM0 "xen-dom0"
+ OPT_XEN_DOM0_NUM,
++#define OPT_VHOST_OWNER "vhost-owner"
++ OPT_VHOST_OWNER_NUM,
++#define OPT_VHOST_PERM "vhost-perm"
++ OPT_VHOST_PERM_NUM,
+ OPT_LONG_MAX_NUM
+ };
+
+Index: dpdk/lib/librte_vhost/vhost_user/vhost-net-user.c
+===================================================================
+--- dpdk.orig/lib/librte_vhost/vhost_user/vhost-net-user.c
++++ dpdk/lib/librte_vhost/vhost_user/vhost-net-user.c
+@@ -51,6 +51,8 @@
+ #include "vhost-net.h"
+ #include "virtio-net-user.h"
+
++#include <rte_eal.h>
++
+ #define MAX_VIRTIO_BACKLOG 128
+
+ static void vserver_new_vq_conn(int fd, void *data, int *remove);
+@@ -486,6 +488,8 @@ rte_vhost_driver_register(const char *pa
+ return -1;
+ }
+
++ rte_eal_set_socket_permissions(path);
++
+ vserver->path = strdup(path);
+ vserver->fh = -1;
+
+Index: dpdk/lib/librte_eal/linuxapp/eal/eal.c
+===================================================================
+--- dpdk.orig/lib/librte_eal/linuxapp/eal/eal.c
++++ dpdk/lib/librte_eal/linuxapp/eal/eal.c
+@@ -53,6 +53,9 @@
+ #if defined(RTE_ARCH_X86)
+ #include <sys/io.h>
+ #endif
++#include <sys/types.h>
++#include <pwd.h>
++#include <grp.h>
+
+ #include <rte_common.h>
+ #include <rte_debug.h>
+@@ -343,6 +346,8 @@ eal_usage(const char *prgname)
+ " --"OPT_CREATE_UIO_DEV" Create /dev/uioX (usually done by hotplug)\n"
+ " --"OPT_VFIO_INTR" Interrupt mode for VFIO (legacy|msi|msix)\n"
+ " --"OPT_XEN_DOM0" Support running on Xen dom0 without hugetlbfs\n"
++ " --"OPT_VHOST_OWNER" Create vhost-user sockets with this owner:group\n"
++ " --"OPT_VHOST_PERM" Create vhost-user sockets with these permissions\n"
+ "\n");
+ /* Allow the application to print its usage message too if hook is set */
+ if ( rte_application_usage_hook ) {
+@@ -618,6 +623,14 @@ eal_parse_args(int argc, char **argv)
+ internal_config.create_uio_dev = 1;
+ break;
+
++ case OPT_VHOST_OWNER_NUM:
++ internal_config.vhost_sock_owner = optarg;
++ break;
++
++ case OPT_VHOST_PERM_NUM:
++ internal_config.vhost_sock_perm = optarg;
++ break;
++
+ default:
+ if (opt < OPT_LONG_MIN_NUM && isprint(opt)) {
+ RTE_LOG(ERR, EAL, "Option %c is not supported "
+@@ -934,3 +947,172 @@ rte_eal_check_module(const char *module_
+ /* Module has been found */
+ return 1;
+ }
++
++/* Try to double the size of '*buf', return true
++ * if successful, and '*sizep' will be updated with
++ * the new size. Otherwise, return false. */
++static int
++enlarge_buffer(char **buf, size_t *sizep)
++{
++ size_t newsize = *sizep * 2;
++
++ if (newsize > *sizep) {
++ *buf = realloc(*buf, newsize);
++ *sizep = newsize;
++ return 1;
++ }
++
++ return 0;
++}
++
++static int
++get_owners_from_str(const char *user_spec, uid_t *uid, gid_t *gid)
++{
++ size_t bufsize = 4096;
++
++ char *pos = strchr(user_spec, ':');
++ user_spec += strspn(user_spec, " \t\r\n");
++ size_t len = pos ? (size_t)(pos - user_spec) : strlen(user_spec);
++
++ char *buf = NULL;
++ struct passwd pwd, *res;
++ int e;
++
++ buf = malloc(bufsize);
++ char *user_search = NULL;
++ if (len) {
++ user_search = malloc(len + 1);
++ memcpy(user_search, user_spec, len);
++ user_search[len] = '\0';
++ while ((e = getpwnam_r(user_search, &pwd, buf, bufsize, &res)) == ERANGE) {
++ if (!enlarge_buffer(&buf, &bufsize)) {
++ break;
++ }
++ }
++
++ if (e != 0) {
++ RTE_LOG(ERR, EAL,"Failed to retrive user %s's uid (%s), aborting.",
++ user_search, strerror(e));
++ goto release;
++ }
++ if (res == NULL) {
++ RTE_LOG(ERR, EAL,"user %s not found, aborting.",
++ user_search);
++ e = -1;
++ goto release;
++ }
++ } else {
++ /* User name is not specified, use current user. */
++ while ((e = getpwuid_r(getuid(), &pwd, buf, bufsize, &res)) == ERANGE) {
++ if (!enlarge_buffer(&buf, &bufsize)) {
++ break;
++ }
++ }
++
++ if (e != 0) {
++ RTE_LOG(ERR, EAL,"Failed to retrive current user's uid "
++ "(%s), aborting.", strerror(e));
++ goto release;
++ }
++ user_search = strdup(pwd.pw_name);
++ }
++
++ if (uid)
++ *uid = pwd.pw_uid;
++
++ free(buf);
++ buf = NULL;
++
++ if (pos) {
++ char *grpstr = pos + 1;
++ grpstr += strspn(grpstr, " \t\r\n");
++
++ if (*grpstr) {
++ struct group grp, *res;
++
++ bufsize = 4096;
++ buf = malloc(bufsize);
++ while ((e = getgrnam_r(grpstr, &grp, buf, bufsize, &res))
++ == ERANGE) {
++ if (!enlarge_buffer(&buf, &bufsize)) {
++ break;
++ }
++ }
++
++ if (e) {
++ RTE_LOG(ERR, EAL,"Failed to get group entry for %s, "
++ "(%s), aborting.", grpstr,
++ strerror(e));
++ goto release;
++ }
++ if (res == NULL) {
++ RTE_LOG(ERR, EAL,"Group %s not found, aborting.",
++ grpstr);
++ e = -1;
++ goto release;
++ }
++
++ if (gid)
++ *gid = grp.gr_gid;
++ }
++ }
++
++ release:
++ free(buf);
++ free(user_search);
++ return e;
++}
++
++static void
++vhost_set_permissions(const char *vhost_sock_location)
++{
++ unsigned long int mode = strtoul(internal_config.vhost_sock_perm, NULL, 0);
++ int err = chmod(vhost_sock_location, (mode_t)mode);
++ if (err) {
++ RTE_LOG(ERR, EAL,"vhost-user socket cannot set"
++ " permissions to %s (%s).\n",
++ internal_config.vhost_sock_perm, strerror(err));
++ return;
++ }
++ RTE_LOG(INFO, EAL,"Socket %s changed permissions"
++ " to %s\n", vhost_sock_location,
++ internal_config.vhost_sock_perm);
++}
++
++static void
++vhost_set_ownership(const char *vhost_sock_location)
++{
++ uid_t vhuid=0;
++ gid_t vhgid=0;
++
++ if (get_owners_from_str(internal_config.vhost_sock_owner, &vhuid, &vhgid)) {
++ RTE_LOG(ERR, EAL,"vhost-user socket unable to get"
++ " specified user/group: %s\n",
++ internal_config.vhost_sock_owner);
++ return;
++ }
++
++ int err = chown(vhost_sock_location, vhuid, vhgid);
++ if (err) {
++ RTE_LOG(ERR, EAL,"vhost-user socket unable to set"
++ " ownership to %s (%s).\n",
++ internal_config.vhost_sock_owner, strerror(err));
++ return;
++ }
++
++ RTE_LOG(INFO, EAL,"Socket %s changed ownership"
++ " to %s.\n", vhost_sock_location,
++ internal_config.vhost_sock_owner);
++}
++
++void
++rte_eal_set_socket_permissions(const char *path)
++{
++ if (internal_config.vhost_sock_perm) {
++ vhost_set_permissions(path);
++ }
++
++ if (internal_config.vhost_sock_owner) {
++ vhost_set_ownership(path);
++ }
++}
+Index: dpdk/lib/librte_eal/common/include/rte_eal.h
+===================================================================
+--- dpdk.orig/lib/librte_eal/common/include/rte_eal.h
++++ dpdk/lib/librte_eal/common/include/rte_eal.h
+@@ -252,6 +252,11 @@ static inline int rte_gettid(void)
+ return RTE_PER_LCORE(_thread_id);
+ }
+
++/**
++ * Set owner/permissions on sockets if requested on EAL commandline
++ */
++void rte_eal_set_socket_permissions(const char *);
++
+ #ifdef __cplusplus
+ }
+ #endif
+Index: dpdk/doc/guides/testpmd_app_ug/run_app.rst
+===================================================================
+--- dpdk.orig/doc/guides/testpmd_app_ug/run_app.rst
++++ dpdk/doc/guides/testpmd_app_ug/run_app.rst
+@@ -156,6 +156,25 @@ See the DPDK Getting Started Guides for
+
+ Use malloc instead of hugetlbfs.
+
++* ``--vhost-owner``
++
++ When creating vhost_user sockets change owner and group to the specified value.
++ This can be given as ``user:group``, but also only ``user`` or ``:group`` are supported.
++
++ Examples::
++
++ --vhost-owner 'libvirt-qemu:kvm'
++ --vhost-owner 'libvirt-qemu'
++ --vhost-owner ':kvm'
++
++* ``--vhost-perm``
++
++ When creating vhost_user sockets set them up with these permissions.
++
++ For example::
++
++ --vhost-perm '0664'
++
+
+ Testpmd Command-line Options
+ ----------------------------
+Index: dpdk/lib/librte_eal/linuxapp/eal/rte_eal_version.map
+===================================================================
+--- dpdk.orig/lib/librte_eal/linuxapp/eal/rte_eal_version.map
++++ dpdk/lib/librte_eal/linuxapp/eal/rte_eal_version.map
+@@ -138,6 +138,7 @@ DPDK_2.2 {
+ rte_keepalive_mark_alive;
+ rte_keepalive_register_core;
+ rte_xen_dom0_supported;
++ rte_eal_set_socket_permissions;
+
+ } DPDK_2.1;
+
diff --git a/debian/patches/ubuntu-fix-xenvirt-support-dynamic-page-size.patch b/debian/patches/ubuntu-fix-xenvirt-support-dynamic-page-size.patch
new file mode 100644
index 00000000..ed6fb5d0
--- /dev/null
+++ b/debian/patches/ubuntu-fix-xenvirt-support-dynamic-page-size.patch
@@ -0,0 +1,32 @@
+Author: Ricardo Salveti <ricardo.salveti@linaro.org>
+Last-Update: 2016-04-17
+Fowarded: yes
+Description: xenvirt: support dynamic page size
+
+Fix build failure since PAGE_SIZE is not defined on ARM (multiple values
+are possible, so it needs to dynamically get the page size used).
+
+http://dpdk.org/ml/archives/dev/2016-April/037586.html
+
+Signed-off-by: Ricardo Salveti <ricardo.salveti@linaro.org>
+---
+ drivers/net/xenvirt/rte_eth_xenvirt.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/net/xenvirt/rte_eth_xenvirt.c b/drivers/net/xenvirt/rte_eth_xenvirt.c
+index b9638d9..afc0193 100644
+--- a/drivers/net/xenvirt/rte_eth_xenvirt.c
++++ b/drivers/net/xenvirt/rte_eth_xenvirt.c
+@@ -39,6 +39,9 @@
+ #include <sys/mman.h>
+ #include <errno.h>
+ #include <sys/user.h>
++#ifndef PAGE_SIZE
++#define PAGE_SIZE sysconf(_SC_PAGE_SIZE)
++#endif
+ #include <linux/binfmts.h>
+ #include <xen/xen-compat.h>
+ #if __XEN_LATEST_INTERFACE_VERSION__ < 0x00040200
+--
+2.7.4
+
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 00000000..e8bf409d
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,176 @@
+#!/usr/bin/make -f
+# See debhelper(7) (uncomment to enable)
+# output every command that modifies files on the build system.
+#export DH_VERBOSE = 1
+
+VERSION := $(shell dpkg-parsechangelog | sed -nr '/^Version:/s/Version: (.*:)?(.*)-(.*)/\2/p')
+
+# see EXAMPLES in dpkg-buildflags(1) and read /usr/share/dpkg/*
+DPKG_EXPORT_BUILDFLAGS = 1
+include /usr/share/dpkg/default.mk
+
+DEB_HOST_GNU_CPU := $(shell dpkg-architecture -qDEB_HOST_GNU_CPU)
+
+# see FEATURE AREAS in dpkg-buildflags(1)
+export DEB_BUILD_MAINT_OPTIONS = hardening=+all
+
+# build with debug symbols, dh_strip will create -dgbsyms packages by that
+# also export -fPIC for the static build (already used by shared by default)
+export EXTRA_CFLAGS = -g -fPIC
+
+# see ENVIRONMENT in dpkg-buildflags(1)
+# package maintainers to append CFLAGS
+#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
+# package maintainers to append LDFLAGS
+#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
+
+ifneq (,$(filter $(DEB_HOST_ARCH), arm64))
+DPDK_CONFIG = "arm64-armv8a-linuxapp-gcc"
+RTE_MACHINE = "armv8a"
+RTE_TARGET = "arm64-armv8a-linuxapp-gcc"
+else
+DPDK_CONFIG = "$(DEB_HOST_GNU_CPU)-native-linuxapp-gcc"
+RTE_MACHINE = "default"
+RTE_TARGET = "$(DEB_HOST_GNU_CPU)-default-linuxapp-gcc"
+endif
+DPDK_STATIC_DIR = "debian/build/static-root"
+DPDK_SHARED_DIR = "debian/build/shared-root"
+
+clean:
+ dh_testdir
+ rm -rf debian/build debian/tmp
+ dh_clean
+
+build-config:
+ dh_testdir
+ $(MAKE) O=$(DPDK_STATIC_DIR) T=$(DPDK_CONFIG) config
+ sed -ri -e 's,(RTE_MACHINE=).*,\1$(RTE_MACHINE),' \
+ -e 's,(RTE_NEXT_ABI=).*,\1n,' \
+ -e 's,(CONFIG_RTE_EAL_IGB_UIO=).*,\1n,' \
+ -e 's,(CONFIG_RTE_KNI_KMOD=).*,\1n,' \
+ -e 's,(LIBRTE_PMD_PCAP=).*,\1y,' \
+ -e 's,(LIBRTE_PMD_XENVIRT=).*,\1y,' \
+ $(DPDK_STATIC_DIR)/.config
+
+build-indep: build-config
+ dh_testdir
+ $(MAKE) O=$(DPDK_STATIC_DIR) doc-api-html doc-guides-html
+
+build-arch: build-config
+ dh_testdir
+ $(MAKE) O=$(DPDK_STATIC_DIR) build
+ # Unfortunately the decision about having static or shared libraries is
+ # made for the whole build, which then produces only .a or .so files
+ # (but not both).
+ # And the target layout for target selection has no field for the
+ # type of library.
+ # Right now I hack this by doing a second build which only differs in
+ # the selection of shared libs.
+ # Shared libs should be default, so the previous static build is only
+ # used to get static libraries.
+ cp -a $(DPDK_STATIC_DIR) $(DPDK_SHARED_DIR)
+ sed -ri 's,(RTE_BUILD_SHARED_LIB=).*,\1y,' \
+ $(DPDK_SHARED_DIR)/.config
+ $(MAKE) O=$(DPDK_SHARED_DIR) build
+
+build: build-arch build-indep
+
+binary-indep: PACKAGE_NAME=dpdk-doc
+binary-indep: DOCDIR=usr/share/doc/dpdk
+binary-indep: export DH_OPTIONS=--indep
+binary-indep:
+ dh_testroot
+ dh_prep
+ dh_testdir
+ dh_installdirs
+ dh_install
+ dh_installdocs
+ dh_installchangelogs
+ dh_lintian
+ # Package: dpdk-doc
+ # All files based on the install-doc rule (includes examples)
+ $(MAKE) O=$(DPDK_SHARED_DIR) prefix=/usr \
+ DESTDIR=debian/dpdk-doc install-doc
+ dh_link
+ dh_compress
+ dh_fixperms
+ dh_installdeb
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+binary-arch: LIBDIR=usr/lib/$(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
+binary-arch: export DH_OPTIONS=--arch
+binary-arch:
+ dh_testroot
+ dh_prep
+ dh_testdir
+ dh_installdirs
+ dh_install
+ dh_installdocs
+ dh_installchangelogs
+ dh_lintian
+ dh_systemd_enable
+ dh_installinit --no-start --no-restart-on-upgrade
+ dh_systemd_start --no-start --no-restart-on-upgrade
+ # Package: dpdk (runtime)
+ $(MAKE) O=$(DPDK_STATIC_DIR) prefix=/usr \
+ DESTDIR=debian/dpdk install-runtime
+ $(MAKE) O=$(DPDK_SHARED_DIR) prefix=/usr \
+ DESTDIR=debian/dpdk install-runtime
+ cp debian/dpdk.interfaces debian/dpdk/etc/dpdk/interfaces
+ rm debian/dpdk/usr/sbin/dpdk_nic_bind
+ ln -s /usr/share/dpdk/tools/dpdk_nic_bind.py \
+ debian/dpdk/sbin/dpdk_nic_bind
+ # Package: dpdk-dev (build environment)
+ $(MAKE) O=$(DPDK_SHARED_DIR) prefix=/usr \
+ DESTDIR=debian/dpdk-dev install-sdk
+ cp $(DPDK_SHARED_DIR)/.config debian/dpdk-dev/usr/share/dpdk/config
+ sed -e 's/SDK_TARGET/$(RTE_TARGET)/' debian/dpdk-sdk-env.sh.in > \
+ debian/dpdk-dev/usr/share/dpdk/dpdk-sdk-env.sh
+ # Package: libdpdk-dev (bare headers, static devel libs and linker
+ # script)
+ mkdir -p debian/libdpdk-dev/$(LIBDIR)
+ # linker script
+ mv debian/dpdk/usr/lib/libdpdk.so debian/libdpdk-dev/$(LIBDIR)/
+ # includes
+ mv debian/dpdk-dev/usr/include/dpdk debian/libdpdk-dev/usr/include/
+ # all static libs are in the dev package
+ mv debian/dpdk/usr/lib/lib*.a debian/libdpdk-dev/$(LIBDIR)/
+ # symlinks to last .so's are in the non versioned libdpdk-dev as well
+ # this allows multiple libdpdk-<NAME><VER> at different VER concurrently
+ # libdpdk-dev depends on all sublibs so symlinks are never broken
+ mv debian/dpdk/usr/lib/*.so debian/libdpdk-dev/$(LIBDIR)/
+ # Package(s): libdpdk-<NAME><VER> (bare runtime libs)
+ for lib in $$(ls -1 debian/dpdk/usr/lib/*.so.*); do \
+ BN=$$(basename $${lib}); \
+ VER=$$(echo $${BN} | sed -e 's/^.*\.so\.//'); \
+ LN=$$(echo $${BN} | sed -e 's/\.so\.[0-9]*$$//' | tr '_' '-'); \
+ LNV="libdpdk-$${LN}$${VER}"; \
+ echo "moving $${lib} for library $${LNV}"; \
+ mkdir -p debian/$${LNV}/$(LIBDIR); \
+ mv $${lib} debian/$${LNV}/$(LIBDIR); \
+ done
+ # Package: dpdk-igb-uio-dkms
+ mkdir -p debian/dpdk-igb-uio-dkms/usr/src/dpdk-igb-uio-$(VERSION)
+ cp lib/librte_eal/linuxapp/igb_uio/* \
+ debian/dpdk-igb-uio-dkms/usr/src/dpdk-igb-uio-$(VERSION)
+ # Package: dpdk-rte-kni-dkms
+ mkdir -p debian/dpdk-rte-kni-dkms/usr/src/dpdk-rte-kni-$(VERSION)
+ cp -a lib/librte_eal/linuxapp/kni/* \
+ debian/dpdk-rte-kni-dkms/usr/src/dpdk-rte-kni-$(VERSION)
+ dh_dkms -V $(VERSION)
+ dh_python2
+ dh_perl
+ dh_link
+ dh_compress
+ dh_fixperms
+ dh_strip
+ dh_makeshlibs
+ dh_shlibdeps
+ dh_installdeb
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+binary: binary-arch binary-indep
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 00000000..163aaf8d
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/debian/tests/check-dpdk-supported-arch.sh b/debian/tests/check-dpdk-supported-arch.sh
new file mode 100644
index 00000000..3de6e467
--- /dev/null
+++ b/debian/tests/check-dpdk-supported-arch.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+arch=$(dpkg --print-architecture)
+case $arch in
+ amd64|arm64|i386)
+ echo "Architecture ${arch} supported, go on with test"
+ ;;
+ *)
+ echo "Architecture ${arch} not supported, SKIP test"
+ exit 0
+ ;;
+esac
diff --git a/debian/tests/control b/debian/tests/control
new file mode 100644
index 00000000..5afed744
--- /dev/null
+++ b/debian/tests/control
@@ -0,0 +1,13 @@
+Tests: test-initscripts
+Restrictions: allow-stderr, isolation-machine, needs-root
+Depends: dpdk [amd64 arm64 i386], gawk, mount, systemd, sysvinit-utils
+
+Tests: test-linkage
+Restrictions: allow-stderr
+Depends: libdpdk-dev [amd64 arm64 i386], libc6, libc6-dev, gcc,
+ grep, libpcap-dev, libxenstore3.0 [amd64 arm64 i386], pax-utils
+
+Tests: test-dkms
+Restrictions: allow-stderr, isolation-machine, needs-root
+Depends: kmod, dpdk-igb-uio-dkms [amd64 arm64 i386],
+ dpdk-rte-kni-dkms [amd64 arm64 i386]
diff --git a/debian/tests/test-dkms b/debian/tests/test-dkms
new file mode 100644
index 00000000..ab3aca00
--- /dev/null
+++ b/debian/tests/test-dkms
@@ -0,0 +1,18 @@
+#!/bin/bash
+set -eu
+
+basedir=$(dirname "$0")
+. "${basedir}"/check-dpdk-supported-arch.sh
+
+# check that the dkms build fine (on dep install), load and unload
+printf "\n\nChecking igb_uio\n"
+modinfo igb_uio
+modprobe igb_uio
+rmmod igb_uio
+echo "OK"
+
+printf "\n\nChecking igb_uio\n"
+modinfo rte_kni
+modprobe rte_kni
+rmmod rte_kni
+echo "OK"
diff --git a/debian/tests/test-initscripts b/debian/tests/test-initscripts
new file mode 100644
index 00000000..f465d6d6
--- /dev/null
+++ b/debian/tests/test-initscripts
@@ -0,0 +1,143 @@
+#!/bin/sh
+set -e
+
+basedir=$(dirname "$0")
+. "${basedir}"/check-dpdk-supported-arch.sh
+
+# Overall that could require up to 1.2G for hugepages in the test environment
+EXPECT2MHP=10
+# Some page sizes like e.g. 1G might not be available in all test environments
+# The test still configures 1 page of 1G size.
+# One of two things will happen, depending on the test environment:
+# - has 1G huge page size => they will tried to be allocated (usually env is
+# too small, but we want to see it fail gracefully for that)
+# We will not check for the 1G alloc, as we know it often fails in small adt's
+# - has no 1G huge page size (HW feature) => we check if it fails gracefully
+EXPECT1GHP=1
+
+DPDK_CONF="/etc/dpdk/dpdk.conf"
+DPDK_INTERF="/etc/dpdk/interfaces"
+
+checkhp() {
+ MMDIR="/sys/kernel/mm/hugepages/${1}"
+ EXPECTHP="${2}"
+ if [ -d "$MMDIR" -a -r "$MMDIR/nr_hugepages" ]; then
+ hpcount=$(cat "$MMDIR/nr_hugepages")
+ if [ "${hpcount}" -ne "${EXPECTHP}" ]; then
+ echo "Hugepages (${hpcount}) not as expected (${EXPECTHP})"
+ exit 1
+ else
+ echo "Hugepages ok (${hpcount})"
+ fi
+ fi
+}
+
+checkstatus() {
+ MARK=${1}
+ EXPMPCOUNT=${2}
+ PRE=${3}
+ POST=${4}
+ EXPECTEDSTATUS=${5}
+ echo "Status after ${MARK}"
+ echo "Status of the Service"
+ ${PRE} status "${POST}" || true
+
+ GOTSTATUS=$(${PRE} status "${POST}" | awk '/^ *Active: / { print $2 }')
+ if [ "${GOTSTATUS}" != "${EXPECTEDSTATUS}" ]; then
+ echo "Service status (${GOTSTATUS}) not as expected (${EXPECTEDSTATUS})"
+ exit 1
+ else
+ echo "Service status (${GOTSTATUS}) as expected"
+ fi
+
+ echo "Status of hugetlbfs mount points"
+ # this section is ok to create bad RCs when no mounts are available
+ set +e
+ grep hugetlbfs < /proc/mounts
+ htlbfscount=$(grep -c hugetlbfs < /proc/mounts)
+ set -e
+
+ # we have to reduce the expected mountpoint count in case some sizes are
+ # not supported by the current kernel/environment
+ if [ ${EXPMPCOUNT} -gt 0 ]; then
+ if [ ! -d /sys/kernel/mm/hugepages/hugepages-2048kB ]; then
+ EXPMPCOUNT=$((EXPMPCOUNT-1))
+ fi
+ if [ ! -d /sys/kernel/mm/hugepages/hugepages-1048576kB ]; then
+ EXPMPCOUNT=$((EXPMPCOUNT-1))
+ fi
+ fi
+
+ if [ "${htlbfscount}" -eq "${EXPMPCOUNT}" ]; then
+ echo "MP Count (${htlbfscount}) as expected (${EXPMPCOUNT})"
+ else
+ echo "MP Count (${htlbfscount}) not as expected (${EXPMPCOUNT})"
+ exit 1
+ fi
+
+ # check if setting HP worked
+ if [ "${EXPMPCOUNT}" -ne "0" ]; then
+ checkhp "hugepages-2048kB" "${EXPECT2MHP}"
+ # We do not check 1G alloc, as it is known to be often not available
+ fi
+}
+
+resetservice() {
+ # help a bit with memory fragmentation regarding huge page allocation
+ sync
+ echo 3 > /proc/sys/vm/drop_caches
+
+ # stopping and resetting Service
+ systemctl stop dpdk.service
+ systemctl reset-failed dpdk.service
+
+ echo "Unmounting all potential hugetlbfs mounts"
+ awk '/hugetlbfs/ {print $2}' /proc/mounts | while read hugetlbmount; do
+ umount -v "$hugetlbmount"
+ done
+}
+
+checkinitstyle() {
+ # We want to verify that
+ # - initially our environment has no hugetlbfs mount
+ # - a system without hugetlbfs mount gets it mounted
+ # - a restart of the service does neither drop nor duplicate the mount
+ PRE=${1}
+ POST=${2}
+ TYPE=${3}
+ printf "\n\n### Checking Type %s ###\n" "${TYPE}"
+ resetservice
+ checkstatus "${TYPE}-BEGIN" 0 "${PRE}" "${POST}" "inactive"
+ echo "### Starting Service ###"
+ ${PRE} start "${POST}"
+ checkstatus "${TYPE}-START" 2 "${PRE}" "${POST}" "active"
+ echo "### Restarting Service ###"
+ ${PRE} restart "${POST}"
+ checkstatus "${TYPE}-RESTART" 2 "${PRE}" "${POST}" "active"
+}
+
+echo "NR_2M_PAGES=$EXPECT2MHP" >> ${DPDK_CONF}
+echo "NR_1G_PAGES=$EXPECT1GHP" >> ${DPDK_CONF}
+
+# We can't rely on any real device for DPDK tests in adt-* environments. But
+# we can expect all kind of broken configuration not to break it (would be
+# detected via set -e).
+# So add all kind of known-to-be-broken definitions and expect it not to fail.
+cat <<EOF > ${DPDK_INTERF}
+# wrong bus
+pTi 0000:04:00.0 uio-pci-generic
+# not enough parms
+0000:04:00.0 uio-pci-generic
+# empty line
+
+# non existing device
+pci 1234:56:78.9 uio-pci-generic
+EOF
+
+# some had issues in the past caused by different init systems, so we test all
+# Direct Calls
+checkinitstyle "/etc/init.d/dpdk" "" "Direct"
+# System V style init
+checkinitstyle "service dpdk" "" "SysV"
+# SystemD style init
+checkinitstyle "systemctl" "dpdk.service" "SystemD"
diff --git a/debian/tests/test-linkage b/debian/tests/test-linkage
new file mode 100644
index 00000000..fabe1c84
--- /dev/null
+++ b/debian/tests/test-linkage
@@ -0,0 +1,51 @@
+#!/bin/bash
+set -eu
+
+basedir=$(dirname "$0")
+. "${basedir}"/check-dpdk-supported-arch.sh
+
+cat > testlinkage.c << EOF
+#include <stdio.h>
+#include "dpdk/rte_common.h"
+
+int main()
+{
+ printf("Hello rte_exit %p\n", rte_exit);
+ return 0;
+}
+EOF
+
+# -ldpdk actually refers to a linker script now, not a real .so
+# with broken linkage this will fail with undefined symbols
+printf "\n\nChecking compile with link against DPDK\n"
+gcc -v testlinkage.c -o testlinkage.bin -Wall -Werror -ldpdk
+echo "OK"
+
+printf "\n\nLinkage info\n"
+lddtree testlinkage.bin
+
+printf "\n\nChecking for expected internal libraries\n"
+# a few of the sublibs that it should use
+lddtree testlinkage.bin | grep '^ librte_eal.so'
+echo "OK"
+
+printf "\n\nChecking for expected secondary library dependencies\n"
+lddtree testlinkage.bin | grep '^ libpthread.so'
+lddtree testlinkage.bin | grep '^ librt.so'
+echo "OK"
+
+printf "\n\nChecking for expected feature dependent library dependencies\n"
+# features only used by the lib that we enabled
+ldd /usr/lib/*/librte_pmd_pcap.so | grep libpcap
+ldd /usr/lib/*/librte_pmd_xenvirt.so | grep libxenstore
+echo "OK"
+
+printf "\n\nChecking test execution\n"
+# It doesn't do much, but it should work - so calling it is a minor extra test.
+# It is known to fail without SSE3 in e.g. some adt environments, in that
+# case check at least that we get the correct error message (this will trigger
+# a test fail if it neither finds the success nor the expected error message)
+(./testlinkage.bin 2>&1 || /bin/true ) | \
+grep -E 'ERROR: This system does not support "SSSE3".|Hello rte_exit 0x'
+
+echo "OK"
diff --git a/debian/watch b/debian/watch
new file mode 100644
index 00000000..418ce0c6
--- /dev/null
+++ b/debian/watch
@@ -0,0 +1,2 @@
+version=3
+http://www.dpdk.org/download /browse/dpdk/snapshot/dpdk-(.+)\.(?:zip|tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz)))